如何从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,我如何找回原始字符串?
答
您已经传递了一个结构线程,最好的办法是将字段添加到它的线程让我们填写。
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位。
您使用线程退出代码使生活更加困难。你可以像数据处理一样('pDataArray',大小与线程数量相同 - 所以创建一个线程写入而不是读取的'pResultArray') –
退出代码是'DWORD - 4个字节,指针可以是8个字节(64位代码)。所以已经指针不适合退出代码。将某个对象传递给线程 - 所以线程和必须strore返回此对象的结果 – RbMm
如果这是一个GUI应用程序,则将字符串从工作线程传递到主线程的方法是在堆上分配该字符串(运算符为new 'C++或'malloc'),然后通过'WM_APP'类型的消息发送给主线程(使用'PostMessage' API)。然后,您的主线程可以处理该消息并释放字符串。 – ahmd0