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

时间:2015-04-14 02:33:56

标签: 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,它有公共插槽doAsync()来完成主线程的工作。所有这些都是每个Qt官方示例以及我能够从各种博客中获得的。

这是一个完全基于控制台的程序,因此我没有Windows,Widgets或事件循环可供使用。


问题

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

谢谢!


附录2015年4月20日

虽然Jeremy在这个问题中所接受的答案是正确的,但对于基于控制台的应用程序来说,它通常不需要事件循环。

因此,我问了一个新问题,并找到了那些寻找使用线程而没有Qt事件循环无意义的人的答案:

QThread never quits due to QCoreApplication event loop

1 个答案:

答案 0 :(得分:2)

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