你好这是一个多层次的问题,但基本上我希望我的线程函数返回一个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,我如何取回原始字符串?
答案 0 :(得分:1)
您已经将结构传递给线程,最好的解决方案是为其添加一个字段以供线程填充。
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-it指针不适合4字节,因此无法将其移植到64位位。