我有一个使用一个工作线程的简单应用程序。
这个工作线程启动并初始化DownloadManager,它负责从网络下载文件。
在我的主应用程序类中,我在 DownloadManager 完成之前发出的线程上有 finish() 信号。
我的问题是如何让工作线程等待 DownloadManager 完成其工作。
这是示例代码:
class Main
{
m_DownloadWorker = new DownloadWorker(this);
QObject::connect(pm_hotosDownloadWorker, SIGNAL(finished()), this, SLOT(DownloadWorkerFinished()));
m_DownloadWorker->Execute();
// do i need to do here something so the thread will wait ?
.....
void Main::DownloadWorkerFinished()
{
Log("DownloadWorkerFinished");
}
};
class DownloadWorker : public QThread
{
void DownloadWorker::Execute()
{
// do i need to do here somthing so the thread will wait ?
start();
}
void DownloadWorker::run()
{
// do i need to do here somthing so the thread will wait ?
DownloadManager* pDownloadManager = new DownloadManager(this);
pDownloadManager->download();
}
};
class DownloadManager: public QObject
{
// downloading stuff using Qt networkmanager
.....
.....
}
如果您在异步操作完成时发出信号,则始终可以使用 QEventLoop 将异步操作“转变”为与当前线程同步。它仍然是异步的,但线程将“等待”它完成。
QNetworkAccessManager nam;
QEventLoop loop;
QNetworkReply *reply = nam.get(request);
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
所以基本上你把它放在你想要同步执行网络请求的 DownloadManager 类中。exec()
一旦循环就会返回quit
插槽已被调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)