【问题标题】:C++ Qt5 - Program finishes before QThreadC++ Qt5 - 程序在 QThread 之前完成
【发布时间】:2015-04-14 02:33:56
【问题描述】:

我们来看看下面的代码:

class CommandRetriever
{
    public:
        CommandRetriever();
        ~CommandRetriever();
    
        void addCommand( QString, Command* );
        void executeCommands();

    private:
        QMap<QString, Command*> m_commands;
};

addCommand 应该是不言自明的;它将在m_commands 中添加一个新条目。不过,我们来看看executeCommands的实现...

void CommandRetriever::executeCommands()
{
    for( auto iter : m_commands.keys() )
    {
        Command *cmd = m_commands.value( iter ); 
         
        // Command, password //
        RemoteConnection *rcon = new RemoteConnection( cmd, "" );

        QThread *thread = new QThread();
        rcon->moveToThread( thread );
        QObject::connect( thread, SIGNAL( started() ), rcon, SLOT( doAsync() ) );
        QObject::connect( rcon, SIGNAL( finished() ), thread, SLOT( quit() ) );
        QObject::connect( rcon, SIGNAL( finished() ), rcon, SLOT( deleteLater() ) );
        QObject::connect( thread, SIGNAL( finished() ), thread, SLOT( deleteLater() ) );
        thread->start();
    }
}

我的rcon 对象是一个QObject,它有公共槽doAsync() 来完成主线程的工作。所有这些都是根据 Qt 官方示例以及我从各种博客中收集到的。

这是一个完全基于控制台的程序,所以我没有可使用的窗口、小部件或事件循环。


问题

发生的情况是我的程序将在任何异步工作能够完成之前退出(例如,连接到远程主机、写入数据等)。有时,如果我很幸运,我的线程会运行得足够快,可以输出一些东西,所以我知道线程正在正常工作。我的问题是:如何让我的主程序一直运行直到我的线程完成工作?QThread 中是否有官方的方式来做到这一点?因为我没有在文档中看到任何内容。

谢谢!


2015 年 4 月 20 日附录

虽然 Jeremy 在这个问题中的公认答案是正确的,但对于基于控制台的应用程序来说意义不大,因为通常不需要事件循环。

因此,我提出了一个新问题,并为那些寻求使用没有 Qt 事件循环废话的线程的人找到了答案:

QThread never quits due to QCoreApplication event loop

【问题讨论】:

标签: c++ multithreading qt qthread


【解决方案1】:

您正在寻找的方法是 QThread::wait()。在开始程序的清理/退出阶段之前,从主线程对每个线程对象调用它。它会等到线程退出后再返回。

【讨论】:

  • 感谢您的快速回复...但是如何处理多个线程?我会把它放在for 循环中吗?还是我会跟踪地图(或另一个容器)中的所有线程并等待所有线程完成?
  • 后者——将 wait() 调用放入单独的 for 循环中。将 wait() 调用放在同一个 for 循环中意味着线程 #2 直到线程 #1 退出后才会启动,这将破坏产生线程的目的。
  • 感谢 Jeremy,我将使用已实施的解决方案更新我的问题,并尽可能接受答案。
  • 杰里米;我的QThread::wait() 函数阻塞了主线程并且永远不会返回。你能帮帮我吗?
  • 线程很可能永远不会退出。是否在线程中调用了 quit()?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多