如何从Windows线程函数返回一个char *

问题描述:

你好,这是一个多层次的问题,但基本上我想我的线程函数返回一个char *,然后我希望能够访问一旦线程有结果终止。如何从Windows线程函数返回一个char *

目前我在键入像我线程函数结束铸造的char *一个DWORD:(openPorts是我的char *)

DWORD openPortsD = (DWORD)openPorts; 

,然后立即返回openPortsD。但这似乎并没有奏效。

我的线程创建的逻辑是这样的:

for (int j = 0; j < MAX_THREADS; j++) 
{ 
    pDataArray[j] = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MYDATA)); 

    if(pDataArray[j] == NULL) 
    { 
     ExitProcess(2); 
    } 
    pDataArray[j]->ip = ip; 

    hThreadArray[j] = CreateThread(NULL, 0, connectPortW, pDataArray[j], 0, &dwThreadIdArray[j]); 

    if (hThreadArray[j] == NULL) 
    { 
    ExitProcess(3); 
    } 
} 

后通过我的主题我环路我,然后等待我的线程,然后免费/关闭它们喜欢:

WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE); 

for(int j = 0; j < MAX_THREADS; j++) 
{ 
    CloseHandle(hThreadArray[j]); 
    if(pDataArray[j] != NULL) 
    { 
    HeapFree(GetProcessHeap(), 0, pDataArray[j]); 
    pDataArray[j] = NULL; // Ensure address is not reused. 
    } 
} 

现在第二部分将是如何获得返回的价值。我知道我应该使用GetExitCodeThread(),但我不确定如何使用它来运行多个线程。此外,由于返回值将是一个DWORD,我如何找回原始字符串?

+6

您使用线程退出代码使生活更加困难。你可以像数据处理一样('pDataArray',大小与线程数量相同 - 所以创建一个线程写入而不是读取的'pResultArray') –

+1

退出代码是'DWORD - 4个字节,指针可以是8个字节(64位代码)。所以已经指针不适合退出代码。将某个对象传递给线程 - 所以线程和必须strore返回此对象的结果 – RbMm

+0

如果这是一个GUI应用程序,则将字符串从工作线程传递到主线程的方法是在堆上分配该字符串(运算符为new 'C++或'malloc'),然后通过'WM_APP'类型的消息发送给主线程(使用'PostMessage' API)。然后,您的主线程可以处理该消息并释放字符串。 – ahmd0

您已经传递了一个结构线程,最好的办法是将字段添加到它的线程让我们填写。

typedef struct { 
    const char *ip; 
    const char *openports; 
} MYDATA, *PMYDATA; 

DWORD CALLBACK connectPortW(LPVOID ThreadParam) 
{ 
    PMYDATA data = (PMYDATA) ThreadParam; 
    data->openports = allocatestringandfillitwithlistofports(data->ip); 
    return 0; 
} 

... 

WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE); 
for(int j = 0; j < MAX_THREADS; j++) 
{ 
    CloseHandle(hThreadArray[j]); 
    if(pDataArray[j] != NULL) 
    { 
    parseandfreeports(pDataArray[j]); 
    HeapFree(GetProcessHeap(), 0, pDataArray[j]); 
    pDataArray[j] = NULL; // Ensure address is not reused. 
    } 
} 

如果这是IP端口的列表,那么最好是将端口存储在SHORT数组中而不是字符串中。

如注释中所述,您可以分配一些内存并将其作为32位应用程序中的线程退出代码返回,但由于64位指针不适合4个字节,因此无法将其移植到64位。