让我们看看以下代码:
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
中是否有正式的方法?因为我在文档中没有看到任何内容。
谢谢!
虽然Jeremy在这个问题中所接受的答案是正确的,但对于基于控制台的应用程序来说,它通常不需要事件循环。
因此,我问了一个新问题,并找到了那些寻找使用线程而没有Qt事件循环无意义的人的答案:
答案 0 :(得分:2)
您正在寻找的方法是QThread :: wait()。在开始程序的清理/退出阶段之前,从主线程调用每个线程对象。它会等到线程退出后再返回。