关键词:
为何只能在其关联的线程内启动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... 查看详情