为何只能在其关联的线程内启动timer?(qt会检查一致性,否则就不执行)

朝闻道 朝闻道     2022-08-27     670

关键词:

为何只能在其关联的线程内启动timer?

QTimer源码分析(以Windows下实现为例) 一文中,我们谈到:

QTimer的是通过QObject的timerEvent()实现的,开启和关闭定时器是通过QObject的startTimer()和killTimer完成的。

startTimer最终调用对象关联线程的eventDispatcher来注册定时器:

int QObject::startTimer(int interval)
{
    Q_D(QObject);
    return d->threadData->eventDispatcher->registerTimer(interval, this);

在Win32平台下:

void QEventDispatcherWin32::registerTimer(int timerId, int interval, QObject *object)
{
    if (timerId < 1 || interval < 0 || !object) {
        qWarning("QEventDispatcherWin32::registerTimer: invalid arguments");
        return;
    } else if (object->thread() != thread() || thread() != QThread::currentThread()) {
        qWarning("QObject::startTimer: timers cannot be started from another thread");
        return;
    }
...

Linux平台下:

void QEventDispatcherGlib::registerTimer(int timerId, int interval, QObject *object)
{
#ifndef QT_NO_DEBUG
    if (timerId < 1 || interval < 0 || !object) {
        qWarning("QEventDispatcherGlib::registerTimer: invalid arguments");
        return;
    } else if (object->thread() != thread() || thread() != QThread::currentThread()) {
        qWarning("QObject::startTimer: timers cannot be started from another thread");
        return;
    }
...

在这两个平台下,它都会检查当前线程和dispatcher的线程是否一致。不一致则直接返回。

为什么要这么设计。我不太清楚。或许是因为:注册定时器要用到回调函数,而回调函数需要在注册的线程执行(fix me)。

 

http://blog.csdn.net/lynfam/article/details/7081545

qt5自定义线程下使用定时器(代码片段)

前提事项:1.newQTimer()时不能加this2.子线程中添加exec();,启动子线程的本地消息循环//创建子线程mytimer*timer=newmytimer;timer->start();qDebug()<<"111";//核心m_timer=newQTimer();connect(m_timer,&QTimer::timeout,thi 查看详情

QObject::startTimer:定时器只能用于以 QThread 启动的线程

】QObject::startTimer:定时器只能用于以QThread启动的线程【英文标题】:QObject::startTimer:TimerscanonlybeusedwiththreadsstartedwithQThread【发布时间】:2014-04-1910:35:35【问题描述】:我正在尝试在工作线程的事件循环中启动Timer,但出现此错误... 查看详情

关于qt在新线程中创建定时器的问题

想在新创建的线程中定义一个100ms的定时器,一旦timeout就调用槽函数发送网络数据但成功启动线程后从未跳入槽函数,为什么鸟?代码大致如下://.h文件#include<QThread>#include<QTimer>classNewThread:publicQThreadpublic:NewThread();QTimer... 查看详情

QT 线程:Getting QObject::startTimer: timers cannot be started from another thread 警告

】QT线程:GettingQObject::startTimer:timerscannotbestartedfromanotherthread警告【英文标题】:QTthreads:GettingQObject::startTimer:timerscannotbestartedfromanotherthreadwarning【发布时间】:2011-09-0906:39:12【问题描述】:我遵循QtSDK中的示例,在QThread子类中启... 查看详情

为何mysql中总是有sleep线程?怎样产生的

参考技术A1确切的说,是连接和线程关联,而不是账号。一般是一个客户端连接(可以是客户端工具的一个连接或应用程序创建的一个连接),服务端会启动一个线程给予服务,连接做完一些事情(比如查询或更新等操作)后clos... 查看详情

qt中如何停止定时器timer?

...新建定时器connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate()));//关联定时器计满信号和相应的槽函数timer->start(1000);//定时器开始计时,其中1000表示1000ms即1秒4.然后实现更新函数。voidM 查看详情

多线程以及底层实现

...个线程执行任务是串行的,也就是说一个线程,同一时间内,只能执行一个任务多线程原理同一时间,CPU只能处理1条线程,只有一条线程在工作(执行)多线程并发(同时)执行,其实 查看详情

c#的timer的详细用法?

...果。Timer代替线程是不明智的选择。我也简单说说。Timer只能在父窗体上用,做循环很占用资源,而且timer严格意义上来说还是属于单线程,一旦和程序运行有冲突的话可能会出现瓶颈,达不到thread这种效果。Timer只是依靠Form消息... 查看详情

qt多线程与数据库操作需要注意的几点问题(qsqldatabase对象只能在当前线程里使用)

   彻底抛弃MFC,全面应用Qt已经不少时间了。除了自己看书按步就班做了十几个验证性的应用,还正式做了3个比较大的行业应用,总体感觉很好。NativeC++下,Qt基本是我用过的最简便的界面库了。遇到了一些问题,大都... 查看详情

字符设备驱动------定时器防抖

...):system_time=(jiffies)/HZ。eg:jiffies定时器,HZ=1000,精度只能达到1ms。,HZ=100,精度只能达到10ms,    jiffies+msecs_to_jiffies(xxms);可做到ms级,  查看详情

winform Timer.timer 会创建一个新线程吗?

...描述】:我想知道System.timer.timer是否会创建一个新线程并在其上运行。据我观察,当我在程序上运行调试模式时,timer1_Elapsed仍在主线程上运行。谁能帮我解决这个问题?【问题讨论】:Winforms计时器在U 查看详情

c#中timer是单线程还是多线程?

c#中Timer是多线程。Timer是功能在指定的时间间隔内反复触发指定窗口的定时器事件。语法Timer ( interval , windowname  )参数interval:指定两次触发Timer事件之间的时间间隔,有效值在0到65之间。在C#里现在有3个Tim... 查看详情

多线程套接字服务器在其生命周期内仅处理一个请求[关闭]

】多线程套接字服务器在其生命周期内仅处理一个请求[关闭]【英文标题】:Multithreadedsocketserverisonlyworkingwithonerequestduringitslifetime[closed]【发布时间】:2012-12-2901:41:01【问题描述】:我还有一个关于推送服务器的问题。由于某种... 查看详情

qt基本控件及三大布局

...QHBoxLayout: 水平显示布局,所有在其上面摆放的控件只能水平排列下去;QVBoxLayout: 垂直显示布局,所有在其上面摆放的控件只能垂直排列下去; 查看详情

关于c#中的timer控件!

...何使用呢??我还是初学者。追答那是个类,不是控件,只能在代码中创建和使用。参考技术Atimer控件每到时间间隔后,会启动一个线程,执行Elapsed方法里的代码。你所说的控件间隔是5s,执行语句需要10s,这不会有问题,因为... 查看详情

如何防止 System.Timers.Timer 在线程池上排队执行?

】如何防止System.Timers.Timer在线程池上排队执行?【英文标题】:HowtopreventSystem.Timers.Timerfromqueuingforexecutiononathreadpool?【发布时间】:2011-06-2001:41:59【问题描述】:标准System.Timers.Timer行为存在问题。计时器以一定的时间间隔引发El... 查看详情

Qt 向移动到线程的对象发出信号

】Qt向移动到线程的对象发出信号【英文标题】:Qtemitsignaltoobjectmovedtothread【发布时间】:2013-01-2515:51:12【问题描述】:为了通过设置标志(然后从线程内返回)来启动停止线程,我需要与它通信。线程是这样实现的MyClass*obj=newM... 查看详情

javax.swing.timer的使用

...触发器的动画对象。设置定时器包括创建一个Timer对象,在其上注册一个或多个动作侦听器,并使用start方法启动定时器。例如,下面的代码创建并启动每秒一次触发一个动作事件(由第一个参数指定定时器Timer构造函数)。Timer... 查看详情