首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我可以使用QTimer实现多线程算法吗?

我可以使用QTimer实现多线程算法吗?
EN

Stack Overflow用户
提问于 2014-06-23 03:20:01
回答 1查看 226关注 0票数 2

目前,我需要实现一个基于Qt的多线程算法。也许我应该尝试扩展QThread。但在此之前,我想问一下,我是否可以使用两个QTimertimer1timer2,并将它们的超时信号分别连接到线程,来实现一个“假的”多线程程序?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-23 03:38:47

您可以将QTimer的timeout()信号连接到适当的时隙,并调用start()。从那时起,计时器将以固定的间隔发出timeout()信号。但是这两个定时器在主线程和主事件循环中运行。所以你不能叫它多线程。因为这两个插槽不能同时运行。它们一个接一个地运行,如果一个阻塞主线程,另一个就永远不会被调用。

通过为应该并发执行的不同任务设置一些类,并使用QObject::moveToThread更改对象的线程关联,您可以拥有一个真正的多线程应用程序:

代码语言:javascript
复制
 QThread *thread1 = new QThread();
 QThread *thread2 = new QThread();

 Task1    *task1   = new Task1();
 Task2    *task2   = new Task2();

 task1->moveToThread(thread1);
 task2->moveToThread(thread2);

 connect( thread1, SIGNAL(started()), task1, SLOT(doWork()) );
 connect( task1, SIGNAL(workFinished()), thread1, SLOT(quit()) );

 connect( thread2, SIGNAL(started()), task2, SLOT(doWork()) );
 connect( task2, SIGNAL(workFinished()), thread2, SLOT(quit()) );

 //automatically delete thread and task object when work is done:
 connect( thread1, SIGNAL(finished()), task1, SLOT(deleteLater()) );
 connect( thread1, SIGNAL(finished()), thread1, SLOT(deleteLater()) );

 connect( thread2, SIGNAL(finished()), task2, SLOT(deleteLater()) );
 connect( thread2, SIGNAL(finished()), thread2, SLOT(deleteLater()) );

 thread1->start();
 thread2->start();

注意,Task1Task2继承自QObject

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24357986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档