0
你好,這是一個多層次的問題,但基本上我想我的線程函數返回一個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,我如何找回原始字符串?
您使用線程退出代碼使生活更加困難。你可以像數據處理一樣('pDataArray',大小與線程數量相同 - 所以創建一個線程寫入而不是讀取的'pResultArray') –
退出代碼是'DWORD - 4個字節,指針可以是8個字節(64位代碼)。所以已經指針不適合退出代碼。將某個對象傳遞給線程 - 所以線程和必須strore返回此對象的結果 – RbMm
如果這是一個GUI應用程序,則將字符串從工作線程傳遞到主線程的方法是在堆上分配該字符串(運算符爲new 'C++或'malloc'),然後通過'WM_APP'類型的消息發送給主線程(使用'PostMessage' API)。然後,您的主線程可以處理該消息並釋放字符串。 – ahmd0