【发布时间】: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 事件循环废话的线程的人找到了答案:
【问题讨论】:
标签: c++ multithreading qt qthread