C++ Qt5 - 程序在 QThread 之前完成

标签 c++ multithreading qt qthread

让我们看一下下面的代码:

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,它有公共(public)插槽 doAsync() 来完成主线程之外的工作。所有这些都是根据 Qt 官方示例以及我从各种博客中收集的内容得出的。

这是一个完全基于控制台的程序,所以我没有要使用的 Windows、Widget 或事件循环。


问题

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

谢谢!


2015 年 4 月 20 日附录

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

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

QThread never quits due to QCoreApplication event loop

最佳答案

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

关于C++ Qt5 - 程序在 QThread 之前完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29618237/

相关文章:

c++ - 混合基类的虚拟和非虚拟继承

c++ - glCreateShader 上的 GLUT 段错误

c++ - 当我尝试定义这个 vector< pair< int , pair<int, int>>> vp(n)

c++ - 多线程环境下的执行时间

c++ - 使用 QStackedWidget 的分层 QTreeView 映射

c++ - Mac 上的 G++ 链接时优化 - 编译器/链接器错误?

c++ - 如果我两次 ReleaseMutex() 会发生什么?

c++ - 在 C++11 中迭代生成一组线程?

c++ - Qt 和 Gstreamer 交互的问题

xml - 是否可以在 QtCreator 中为 Qt 小部件设置(添加)自定义属性?