簡體   English   中英

如何僅使用 win32 API 將主窗口的句柄傳遞給新線程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM