【问题标题】:MFC: sending a msg from worker thread to the Main thread to stop the worker threadMFC:从工作线程向主线程发送消息以停止工作线程
【发布时间】:2013-07-26 22:45:10
【问题描述】:

我正在修复一个使用 MFC 编程的 GUI 应用程序。为了运行通信堆栈,创建了一个新线程。在某些事件中,我想停止此操作,但我知道仅在工作线程中,我无法通过从自身停止工作线程来获得正确的行为。所以我需要向主线程发送一条消息并告诉它停止工作线程,以便主线程可以采取正确的行动。

我不确定如何执行此操作。我查看了 CWnd 中的 SendMessage 函数,但它没有将 threadid 作为参数,而且我没有得到使用 http://msdn.microsoft.com/en-us/library/windows/desktop/ms644944(v=vs.85).aspx 需要包含的内容。

【问题讨论】:

  • '我无法通过停止工作线程本身来获得正确的行为' - 为什么?我怀疑应该属于线程的数据不是——你有任何机会把通讯组件放在表单上,​​或者反过来——GUI直接访问线程类中的数据?
  • 好吧,如果有一个重置命令进入通讯堆栈,堆栈应该停止并自行启动。问题是如果我调用 Stop 函数然后线程被终止,然后它 obv 不能调用 start 函数,因为它不再存在。
  • 好的,不要停止线程。在线程中的整个通信初始化/设置/运行代码周围放置一个 while(true){try...catch},如果检测到错误,则抛出。
  • 如果您使用 SendMessage/PostMessage 和自定义消息 (WM_APP + x),您可以将任何您喜欢的作为 WPARAMLPARAM 传递。系统不会以任何方式为您解释消息,而只会将您提供的参数传递给消息处理程序。

标签: c++ multithreading mfc


【解决方案1】:

实际上,对工作线程执行任何操作的唯一安全方法是从工作线程本身内部进行。它可能应该被构造为一个 while(bRun) 循环,因此它会一直运行到程序关闭。无论您尝试做什么(停止和启动)都应该由 while 循环中的代码处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    相关资源
    最近更新 更多