如何告诉QThread等待,直到工作完成,然后结束

How to tell QThread to wait until work is done ,and then finish?

本文关键字:然后 结束 工作 何告诉 QThread 等待      更新时间:2023-10-16

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

我的问题是如何使工作线程等待,直到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类中。一旦循环的quit槽被调用,exec()将返回。

可以使用QThread::exec()调用在事件循环中运行线程。该线程将运行它,直到您通过调用QThread::exit()告诉线程退出为止。一些示例代码看起来像这样:

void DownloadWorker::run()
 {
    DownloadManager* pDownloadManager = new DownloadManager(this);
    connect(pDownloadManager, SIGNAL(finished()), SLOT(exit()));
    connect(pDownloadManager, SIGNAL(error()), SLOT(exit()));
    pDownloadManager->download();
    exec();
 }

这将保证你的线程不会退出,直到你的下载管理器的"finished()"信号发出。

注意:这里我放了一个如何解决你的问题的例子,但我不知道你的整个应用程序代码。这意味着不能保证这些代码是线程安全和一致的。您需要自己处理互斥锁和所有正确的同步。要非常小心!使用这种"低级"线程API需要对多线程有很好的理解。

希望有帮助