【发布时间】:2015-04-11 07:17:21
【问题描述】:
我知道为了从另一个线程访问 UI 控件,我应该使用PostMessage()。但是,PostMessage() 是异步的,因此例如,如果我尝试更改 "EDIT" 控件的文本,我将无法在完成后删除文本缓冲区,因为我不知道窗口过程何时会完成处理消息。
所以这是我能想到的从另一个线程访问 UI 控件的两个想法:
- 创建一条用户定义的消息,例如,我向 UI 线程发送如下内容:“将这 200 行(全部存储在一个字符串中,由 '\n' 或其他内容分隔)插入
ListViewX”,当 UI 线程收到这条消息时,它会更新ListViewX,完成后,它会删除字符串(分配在堆上)。 - 另一种方法是将访问 UI 控件的代码放在函数内部,并将函数指针发送给 UI 线程,然后由 UI 线程调用。
其中一种方法是否比另一种具有一些优势,是否有其他方法可以做到这一点?
【问题讨论】:
-
如果线程阻塞直到 UI 线程处理完消息是可以接受的,
SendMessage是另一种选择。 -
@Harry Johnston 我已经读到
SendMessage()可能会导致死锁(这并不总是很容易预测)。请参阅:flounder.com/workerthreads.htm,部分:工作线程和 GUI II:不要触摸 GUI。 -
我不同意那篇文章对问题的解释。发生死锁是因为 GUI 线程正在等待工作线程完成,并且以这样一种方式实现了等待,即 GUI 消息在此期间没有被处理。你不应该这样做,因为即使你没有死锁,GUI 也会被冻结,直到工作线程完成。免责声明:我不是 GUI 编程专家。
-
是的,我认为在 UI 线程上等待是一种不好的编程习惯。因此,当我开始编程时,我在工作中遇到了一些麦芽汁经验。
标签: multithreading winapi