如何告诉QThread等待,直到工作完成,然后结束
How to tell QThread to wait until work is done ,and then finish?
我有一个使用一个工作线程的简单应用程序。这个工作线程被启动并初始化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需要对多线程有很好的理解。
希望有帮助
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 为什么在这个代码结束循环中没有得到结束
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- boost::asio如何生成多个协同程序,然后加入它们
- 试图对缓存进行跨步测试,但程序并没有结束
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 在std::thread中,joinable()然后join()线程安全吗
- 为什么擦除方法会影响结束方法
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- C++:如何读取分离变量,然后读取向量
- 为什么我的递归函数按降序打印,然后按升序打印?
- 删除映射和分割错误中的一个过去结束元素
- 等待整个 omp 块完成,然后再调用第二个函数
- 钩/绕道 d3d9 (现在/结束场景) - 似乎调用我的函数然后崩溃
- 如果用户想要输入 x 数量的数字,我如何设法跟踪它然后结束程序?
- 在批处理文件上进行C++fstream写入,然后结束,没有剩余的代码行
- Qt程序挂起(不响应),直到函数结束,然后再次开始工作
- 如何告诉QThread等待,直到工作完成,然后结束