【问题标题】:C++ call method from the main Thread来自主线程的 C++ 调用方法
【发布时间】:2012-07-06 16:48:35
【问题描述】:

在我的一个班级中,我正在使用以下方法启动一个线程:

HANDLE hThread;
unsigned threadID;
hThread = (HANDLE)_beginthreadex( NULL, 0, &myThread, NULL, 0, &threadID );

我想从这个线程调用一个必须从主线程调用的方法(该方法正在与 UI 交互)但我真的不知道该怎么做,因为主线程不能等到“myThread”通知它。

看过很多

while(true){
  //wait something from myThread
}

但我等不及了!

有什么想法吗?

【问题讨论】:

  • 这必须在什么平台上运行? C++ 中的线程是一个非常依赖于平台的东西。
  • 我的平台是Windows!
  • 你需要EnterCriticalSection()
  • 我看不到如何使用 EnterCriticalSection() 来解决我的问题!
  • 您可以使用 PostMessage()/PostThreadMessage() 从您创建的线程中通知您的主线程,同时保持在传统的消息循环中。根据您的线程是否需要响应,它可以使用其他同步对象和共享资源等待响应,或者您可以在创建的线程中使用消息循环和 PostThreadMessage() 来获取结果。

标签: c++ multithreading user-interface synchronization


【解决方案1】:

由于你的主线程是 UI,你可以向它发送消息。

#define WM_USER_EXECUTE_MY_CODE (WM_USER + 1000)

您的 UI 消息循环应该处理该消息:

// API code
// LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
// create message map yourself if you're using MFC

if (iMsg == WM_USER_EXECUTE_MY_CODE)
{
    // execute your code must run in main thread
}

然后在您的工作线程中,向 UI 发送一条消息

// HWND hwnd = handle to main UI window
// if you need some parameters, send them through WPARAM or LPARAM
SendMessage(hwnd, WM_USER_EXECUTE_MY_CODE, 0, 0);  

【讨论】:

  • 应该是PostMessage,否则UI线程的延迟会延迟整体操作。
  • @Ajay 我认为这取决于。如果他想在调用后执行一些其他代码,他必须使用 SendMessage。
  • @darkheir 由于您的主线程不是 UI,假设您使用的是控制台应用程序,您的主线程必须等待执行代码。 while(1) 循环或 WaitForSingleObject 都可以。只需设置一个标志或调用 SetEvent。
  • @Rango 不是我希望的答案 ^^ 我希望可以在没有等待循环的情况下向非 UI 线程发送消息,但这似乎不太可能!
【解决方案2】:

【讨论】:

  • 但是不要等待线程本身(等待它退出),等待线程设置的事件(CreateEventSetEvent)。
  • 是的,但我不能等待线程,我的 UI 仍然需要响应!
  • 您可以只使用一个小的超时,这样 UI 就不会变得无响应。然而,其他答案更好。
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多