如何告诉 QThread 等待工作完成,然后完成?

use*_*898 1 c++ qt4 qthread

我有一个使用一个工作线程的简单应用程序。这个工作线程被启动并初始化下载管理器,它负责从网络下载文件。在我的主应用程序类中,我在 DownloadManager 完成之前发出的线程上有完成()信号。

我的问题是如何让工作线程等待 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 

     .....
     .....
 }
Run Code Online (Sandbox Code Playgroud)

Tam*_*lei 5

在异步操作完成时发出信号的情况下,您始终可以使用 QEventLoop 将异步操作“转换”为与当前线程同步。它仍然是异步的,但线程将“等待”它完成。

QNetworkAccessManager nam;
QEventLoop loop;
QNetworkReply *reply = nam.get(request); 
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
Run Code Online (Sandbox Code Playgroud)

所以基本上你把它放在你想要同步执行网络请求的 DownloadManager 类中。exec()一旦循环的quit槽被调用,就会返回。