【发布时间】:2022-01-02 21:08:10
【问题描述】:
我已经读到我需要将 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 放在堆上”这意味着什么?你在哪里读到的?
-
这在整个地方都在尖叫XY Problem。回答字面问题:
HWND是一个可以按原样传递给线程过程的值。这样做没有多大意义,而且你使用它的方式是完全不安全的。从创建它的线程以外的线程访问窗口需要同步(您没有提供)。读起来好像您相信这是您问题的解决方案,因为您还没有理解输入在 Windows 中的工作原理。 -
这也实现了一个惊人的常见反模式:创建一个线程,然后在线程上进行同步等待。您可以根本不完全创建线程:行为将是相同的。您应该首先认真考虑了解 Windows API。 Petzold 的Programming Windows 是标准学习材料。
-
@IInspectable 同步由 SendMessage 完成,因此至少从同步的角度来看,这段代码是可以的。但是,它确实会死锁,因为新线程正在向原始线程发送消息,而原始线程无法接收到消息,因为它正在等待新线程退出。
-
@ray 我之前的评论是指取消引用
h,由于无限同步等待(正如您所注意到的,这会导致死锁),这恰好是安全的。关于同步的说明旨在促进安全代码,即使不完全准确。窗口管理器提供了一些级别的同步。我把它留给你write about the lesser known subtleties。