我已經讀到我需要將 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;
}
uj5u.com熱心網友回復:
我已經讀到我需要將 HWND 放在堆上。那是對的嗎?
并不真地。假設HWND在創建的執行緒期間保持有效(如果它是應用程式的主視窗,那么這是一個合理的假設),并且該MakeThread函式在該執行緒完成之前不會回傳(就像您的代碼中的情況一樣) ,那么你可以在呼叫中給出它的HWND hWnd引數地址作為arglist引數_beginthreadex。
您不必在堆上創建該視窗句柄的副本。這是您的MakeThread函式的簡化版本:
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函式在不等待創建的執行緒完成的情況下回傳,則傳遞的地址將變為無效(在某些時候)。但是,在這種情況下,您必須對代碼進行其他更改,以便跟蹤創建的執行緒句柄。
uj5u.com熱心網友回復:
一旦您使用new HWND(hWnd),默認情況下您的物件將分配在堆上,而不是堆疊上。因此,您可以共享它而不會因為堆疊展開而丟失物件。
還有一點就是你啟動執行緒然后等待完成。作為副作用,您甚至可以使用堆疊分配的資料傳遞給執行緒,因為堆疊一直存在直到執行緒退出(確切地說,WaitForSingleObject行)。
處理用戶輸入通常與堆/堆疊分配無關。您能否在該部分重新表述您的問題,或者就該意思創建另一個問題?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/364951.html
