珠海网站建设尚古道策略南京模板网站建设
web/
2025/10/9 1:14:19/
文章来源:
珠海网站建设尚古道策略,南京模板网站建设,南京做网站,做网站商城互联网公司源码见 testQThread_QTimer… Qt 版本5.6.3 视频讲解#xff1a;https://www.bilibili.com/video/BV15P411C79i/ 链接: 视频讲解 简介 想法很单纯#xff0c;就是主线程启动一个子线程#xff0c;子线程里启动一个定时器#xff0c;定时执行一些任务#xff0c;然鹅实际开… 源码见 testQThread_QTimer… Qt 版本5.6.3 视频讲解https://www.bilibili.com/video/BV15P411C79i/ 链接: 视频讲解 简介 想法很单纯就是主线程启动一个子线程子线程里启动一个定时器定时执行一些任务然鹅实际开发中警告不断。Qt
警告内容有
1.QObject: Cannot create children for a parent that is in a different thread.
2.QObject::killTimer: Timers cannot be stopped from another thread
3.QObject::moveToThread: Cannot move objects with a parent
对线程和线程对象的理解 线程对象是一个内核对象就和常用的打开文件会获得一个文件句柄的句柄都属于稀缺的资源。线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,每个线程可以并发执行不同的任务。 一个进程一定有一个主线程子线程是从主线程启动的。线程的关键特性除了并发性其实还有一个比较隐晦就是线程的模块性。这是因为线程执行内容总应该是负责某块功能具有一定独立性。举例来说main.exe启动一个独立的线程来定时检查更新显然这个线程负责的功能就很明确如果更新检查除了问题就检查这个线程涉及的所有代码。 线程的退出一般情况线程干完活就自动释放了。还是拿上面的检查线程来说如果他的使命是检查5次是否有更新则检查完5次没干的了这个线程就会退了。除非是一直检查这个线程才会一直运行下去。
关于QThread QThread这个类封装了对线程对象的管理相当于我们雇佣了一个工人需要发个工牌来知道都有哪些工人通过工牌的工号发布指令。显然如果只有一个主线程就不需要了因为系统已经干了。 具体到QThread的用法主流的就2种。后续有代码解析。 方法一继承QThread并重写run方法、 方法二将代码逻辑封装为一个类 关于QTimer QTimer用于执行一些定时任务往往采用信号槽的方式连接timeout()函数至槽函数。 QTimer的启动、停止、创建、销毁都需在同一个线程中。主线程中用的很easy一旦涉及到子线程使用难度就上来了需要保证QTimer的创建、启动、停止、销毁都是在同一线程。而往往我们都是在各种槽函数中对定时器停止。
Qt 槽函数到底执行在哪个线程 解决开篇警告的核心是搞清楚槽函数执行在哪个线程以及为啥执行在那个线程。 这个答案来于互联网然而我实测的结果不是这样的。 在多线程的Qt程序中,一个槽函数的执行线程是由发出信号的线程决定的,而不是连接该信号的线程。 具体来说: 如果信号是在主线程发出的,则槽函数会在主线程执行,即使该槽函数是在其他线程中连接的。如果信号是在非GUI线程发出的,则槽函数会在该非GUI线程执行,即使是在主线程中连接的。槽函数总是会在信号发出的线程中执行。 ** 构造函数的执行顺序 看似简单我只要保证emit是在哪个线程即可。但实际开发中涉及类的组合关系A类的成员类B类在调用A类的构造之前会先调用B类的构造B类的构造而B类的构造还是在上一级的线程中。这也就导致了类A被moveToThread之后成了线程m_thred的资源而A的B成员则还是主线程的资源。
class CB{
public:CB(){}
private:
}
class CA{
public:CA(){ moveToThread(m_thread); }
private:CB m_b; QThread m_thread;
}总结 槽函数执行在哪个线程取决于发出信号的对象和槽函数的对象是在哪个线程构造的。要想保证成员类的槽函数都执行在子线程成员类的构造就需在子线程也就是成员类要以指针的方式组合在合适的时机new对象出来。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/89365.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!