1
11
你的信息会到达那里。我不知道你为什么认为邮电不一定有效——确实如此。(编辑:假设postmessage()返回true!检查您的返回代码!) 您希望避免使用队列在线程之间通信数据。任何由两个线程访问的队列都需要受到保护。在两侧添加硬锁将序列化您的应用程序。
相反,在堆上使用
现在唯一的诀窍是找出“告诉另一条线”的部分,但这也很容易。
如果要将数据从工作线程发送到主线程,只需使用
…主线程处理此问题,然后删除数据:
如果您担心外部应用程序的自定义消息会碰到您的应用程序,您可以让Windows使用 RegisterWindowsMessage() --你唯一的挑战是为你的信息选择正确的名字。
如果您将数据从主线程发送到工作线程,则可以执行上述操作,除非使用
编辑:根据您在OP中的评论,现在我理解了为什么您担心postmessage()不起作用。 是的,Windows消息队列大小有一个硬限制。默认情况下,队列中只能有4000条消息。(注册表设置最多可将此值调整为10000)。
如果队列已满,则调用
听起来不像母鸡,但您确实需要检查API调用的返回值。但除此之外,如果您在消息队列上限中运行,那么我认为您的应用程序无论如何都会被破坏。当队列已满时,应用程序将无法呼吸。屏幕不会画画,你做的任何处理都会过时,所有的坏事都会发生。如果这就是你所处的情况,你可能需要看看原因。 |
2
2
使用两个队列,一个用于发送到工作线程的工作请求,另一个用于返回主线程的结果。您可以使用postmessage唤醒主线程并告诉它检查队列,但消息中不需要任何参数。 |
3
1
我不久前解决了一个类似的问题。我创建了一个单例队列来保存需要从后台线程流到UI(主)线程的数据(或操作)。队列受关键部分保护。后台线程会将其数据放入队列并发布消息。消息不包含任何数据,它充当一个简单的唤醒调用,“嘿,主线程,看看队列,你有工作”。 这样,您就不会冒泄漏任何内存或其他资源的风险;队列可以安全地用它包含的所有数据销毁。 |
cyber101 · vc++未声明的标识符,尽管其已声明 6 年前 |
areum · 如何在列表控件中创建右键单击菜单? 6 年前 |
Rafal · 如何在MFC中的CWnd中显示CFormView? 6 年前 |
Anton Savelyev · 在发布版本中删除类指针会导致内存问题 6 年前 |
xtkwfn · 如何查找目录[已关闭]下的所有文件夹 6 年前 |
Andrew Truckle · 在WPARAM中组合5个值 6 年前 |
user3070144 · 通过全局接口表封送ActiveX 7 年前 |