【问题标题】:boost - thread.join() halts the uiboost - thread.join() 停止用户界面
【发布时间】:2014-02-25 19:28:17
【问题描述】:

我读到 join 会阻塞调用它的线程,直到线程函数返回。因此,如果我的主线程创建了一个 boost 线程,然后调用 join,那么我的主线程将被阻塞。 在我的情况下,用户界面是主线程,它需要等待线程完成才能执行下一条语句,当我使用 thread.join() 时,用户界面会冻结。我目前有这样的东西

boost::thread t(&Myclass::mymethod,ptr,parameter);
t.join();  //This blocks the ui
SomeOtherMethd();

现在我的问题是如何等待线程 t 结束然后调用 SomeOtherMethod 而不阻塞 UI。由于 t.join() 似乎冻结了 ui

【问题讨论】:

  • 通常的方法是让主循环继续,并检查(非阻塞)例如指示线程函数已完成工作的信号量或条件变量。

标签: c++ qt boost


【解决方案1】:

由于您使用的是 Qt,所以这样做的非阻塞方式是:

  • 从您的工作线程发送信号
  • 使 SomeOtherMethd() 成为一个插槽

作为参考,请查看来自 Qt 项目的 Mandelbrot Example,它使用队列连接在工作线程和主线程之间进行通信。

【讨论】:

    【解决方案2】:

    给线程一个函数,以正确的顺序在顺序模式下执行您需要的操作。这是一个简化的例子:

    void foo()
    {
      ptr->mymethod(parameter);
      SomeOtherMethod();
    }
    
    boost::thread t(foo);
    
    // do other stuff while thread runs
    
    t.join()
    

    【讨论】:

    • @MistyD 是的,但是当您完成所有操作时可能会发生这种情况。关键是SomethOtherMethod 在调用ptr->mymethod() 之后发生,没有阻塞。你可以在启动线程和调用join()之间做各种事情。
    猜你喜欢
    • 2013-03-11
    • 1970-01-01
    • 2015-02-12
    • 2013-07-03
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多