2017-08-02 64 views
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,我如何找回原始字符串?

+6

您使用線程退出代碼使生活更加困難。你可以像數據處理一樣('pDataArray',大小與線程數量相同 - 所以創建一個線程寫入而不是讀取的'pResultArray') –

+1

退出代碼是'DWORD - 4個字節,指針可以是8個字節(64位代碼)。所以已經指針不適合退出代碼。將某個對象傳遞給線程 - 所以線程和必須strore返回此對象的結果 – RbMm

+0

如果這是一個GUI應用程序,則將字符串從工作線程傳遞到主線程的方法是在堆上分配該字符串(運算符爲new 'C++或'malloc'),然後通過'WM_APP'類型的消息發送給主線程(使用'PostMessage' API)。然後,您的主線程可以處理該消息並釋放字符串。 – ahmd0

回答

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位指針不適合4個字節,因此無法將其移植到64位。