[英]How do I pass the main window's handle to a new thread using win32 API only?
我讀過我需要將 HWND 放在堆上。 那是對的嗎?
我需要這個來從用戶輸入中讀取值。
先感謝您!
VOID MakeThread(HWND hWnd)
{
HWND* h = new HWND(hWnd);
HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, WorkerThread, h, 0, nullptr);
if (hThread != nullptr) {
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
delete h;
}
unsigned int __stdcall WorkerThread(VOID* h)
{
char num[71] = { 0 };
GetDlgItemTextA((*(HWND*)h), 2001, num, 70);
//Get number from edit box 2001
//Do work with the above-mentioned number
return 0;
}
我讀過我需要將 HWND 放在堆上。 那是對的嗎?
並不真地。 假設HWND
在創建線程期間保持有效(如果它是應用程序的主 window,那么這是一個合理的假設),並且MakeThread
function 在該線程完成之前不會返回(就像您的情況一樣代碼),那么您可以在調用_beginthreadex
時將其HWND hWnd
參數的地址作為arglist
參數提供。
您不必在堆上創建該 window 句柄的副本。 這是您的MakeThread
function 的簡化版本:
VOID MakeThread(HWND hWnd)
{
stringstream stream;
stream << &hWnd << "\n" << hWnd;
std::string s = stream.str();
MessageBoxA(hWnd, s.c_str(), "Caller: hWnd?", 0);
HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, WorkerThread, &hWnd, 0, nullptr);
if (hThread != nullptr) {
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
}
但是,如果您的MakeThread
function沒有等待創建的線程完成就返回,那么傳遞的地址將變為無效(在某些時候)。 但是,在這種情況下,您必須對代碼進行其他更改,以便您可以跟蹤創建的線程句柄。
HWND
已經是指針類型(指向全局系統資源)。 您可以按原樣傳遞它,根本不需要用new
包裝它:
void MakeThread(HWND hWnd)
{
HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, WorkerThread, hWnd, 0, nullptr);
if (hThread != nullptr) {
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
}
unsigned int __stdcall WorkerThread(void* h)
{
char num[71] = { 0 };
GetDlgItemTextA((HWND)h, 2001, num, 70);
//Get number from edit box 2001
//Do work with the above-mentioned number
return 0;
}
話雖如此,創建一個線程只是為了立即等待它的終止完全是浪費線程。 您也可以直接調用目標 function ,最終結果將完全相同,只是沒有額外的開銷:
void DontMakeThread(HWND hWnd)
{
WorkerThread(hWnd);
}
一旦您使用new HWND(hWnd)
,您的 object 將默認分配在堆上,而不是堆棧上。 因此,您可以共享它而不會有 object 因堆棧展開而丟失的風險。
另一點是您啟動線程,然后等待完成。 作為副作用,您甚至可以使用堆棧分配的數據來傳遞給線程,因為堆棧一直在這里,直到線程退出(確切地說, WaitForSingleObject
行)。
並且處理用戶輸入通常與堆/堆棧分配無關。 您能否在該部分重新表述您的問題或就此提出另一個問題?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.