标签: qtimer

QTimer对象是否在单独的线程中运行?它的机制是什么?

当我QTimer在Qt 5中创建一个对象,并使用start()成员函数启动它时,是否创建了一个单独的线程来跟踪时间并timeout()定期调用该函数?

例如,

QTimer *timer = new QTimer;
timer->start(10);
connect(timer,SIGNAL(timeout()),someObject,SLOT(someFunction()));
Run Code Online (Sandbox Code Playgroud)

在这里,程序如何知道何时timeout()发生?我认为它必须在一个单独的线程中运行,因为我没有看到顺序程序如何跟踪时间并继续同时执行.但是,我无法在Qt文档或其他任何地方找到有关此信息的任何信息以确认这一点.

我已经阅读了官方文档,而StackOverflow上的某些问题就像这样,看起来非常相关,但我无法通过它们得到答案.

任何人都可以解释一个QTimer对象的工作机制吗?

在进一步搜索时,我发现根据比尔的这个答案,我们提到了这一点

事件由操作系统异步传递,这就是看起来还有其他事情发生的原因.有,但不是在你的程序中.

这是否意味着timeout()由操作系统处理?是否有一些硬件能够跟踪时间并以适当的间隔发送中断?但如果是这种情况,由于许多计时器可以同时独立运行,每个计时器如何被单独跟踪?

机制是什么?

谢谢.

c++ qt multithreading timer qtimer

24
推荐指数
3
解决办法
1万
查看次数

如何使用Qtimer添加1秒延迟

我目前有一个方法如下

void SomeMethod(int a)
{

     //Delay for one sec.
     timer->start(1000);

     //After one sec
     SomeOtherFunction(a);
}
Run Code Online (Sandbox Code Playgroud)

该方法实际上是附加到信号的插槽.我想用Qtimer添加一秒的延迟.但是我不知道如何实现这一点.由于定时器在完成时触发信号,并且信号需要连接到另一个不接受任何参数的方法.关于如何完成这项任务的任何建议.

更新: 信号将在一秒钟内被多次调用,延迟将持续一秒钟.我的问题是将参数传递给附加到计时器的timeout()信号的插槽.我的最后一种方法是将值存储在类的memeber变量中,然后使用互斥锁来保护它在使用变量时不被更改.但是我在这里寻找更简单的方法.

c++ qt qtimer

15
推荐指数
2
解决办法
2万
查看次数

Qt计时器无法从另一个线程停止

HY,

我正在编写我的第一个Qt程序,现在遇到麻烦:

QObject :: killTimer:无法从另一个线程停止计时器

QObject :: startTimer:无法从另一个线程启动计时器

我的程序将与CANOpen总线通信,因为我正在使用Canfestival Stack.Canfestival将使用回调方法.为了检测通信中的超时,我设置了一个定时器功能(以某种方式像看门狗).我的计时器包由"tmr"模块,"TimerForFWUpgrade"模块和"SingleTimer"模块组成."tmr"模块最初是C编程的,因此静态"TimerForFWUpgrade"方法将对其进行接口."tmr"模块将成为C程序固件更新包的一部分.

计时器将如下工作.在发送消息之前,我将调用TMR_Set方法.然后在我的空闲程序循环中使用TMR_IsElapsed我们检查定时器下溢.如果TMR_IsElapsed我会做错误处理.如您所见,将连续调用TMR_Set方法并一次又一次地重新启动QTimer.

如果我启动程序,就会出现上述错误.你能告诉我我的概念是否有效吗?为什么会出现这种错误?我是否必须在主线程中使用其他线程(QThread)?

谢谢

马特

运行和空闲循环:

void run
{
    // start communicate with callbacks where TMR_Set is set continously
    ...

    while(TMR_IsElapsed(TMR_NBR_CFU) != 1);

    // if TMR_IsElapsed check for errorhandling
    ....
}  
Run Code Online (Sandbox Code Playgroud)

模块tmr(C程序的接口):

extern "C"
{
void TMR_Set(UINT8 tmrnbr, UINT32 time)
{
    TimerForFWUpgrade::set(tmrnbr, time);
}

INT8 TMR_IsElapsed(UINT8 tmrnbr)
{
 return TimerForFWUpgrade::isElapsed(tmrnbr);
}
}
Run Code Online (Sandbox Code Playgroud)

模块TimerForFWUpgrade:

SingleTimer* TimerForFWUpgrade::singleTimer[NR_OF_TIMERS];

TimerForFWUpgrade::TimerForFWUpgrade(QObject* parent)
{

    for(unsigned char i = 0; i < NR_OF_TIMERS; i++) …
Run Code Online (Sandbox Code Playgroud)

c++ qt multithreading qthread qtimer

11
推荐指数
2
解决办法
2万
查看次数

为什么我的"QTimer只能用于以QThread开头的线程"消息,如果我的代码中没有QTimer?

当(并且仅当)退出我的应用程序时,这些(并且仅这些)重复的消息出现在命令提示符上:

QObject::startTimer: QTimer can only be used with threads started with QThread
QObject::startTimer: QTimer can only be used with threads started with QThread
QObject::startTimer: QTimer can only be used with threads started with QThread
Run Code Online (Sandbox Code Playgroud)

这对我来说很奇怪,因为我从不在我的代码(或QThread)中使用QTimer.事实上,使用该应用程序不会发生任何错误或崩溃,因此实际上这不是一个真正的问题.这种情况发生在Windows和Linux操作系统中.

我所有的进口:

from __future__ import print_function
from PyQt4.QtGui import (QApplication, QMainWindow,
                         QFileSystemModel, QTreeView, QTableView,
                         QAbstractItemView, QMenu, QAction, QKeyEvent)
from PyQt4.QtCore import QDir, Qt, SIGNAL, QString, QFileInfo, QCoreApplication
import sys
Run Code Online (Sandbox Code Playgroud)

主要功能:

def main():
    app = QApplication(sys.argv)
    app.setApplicationName("QFM")
    app.setStyle("plastique")
    gui = MainWindow()
    gui.show()
    app.exec_()
Run Code Online (Sandbox Code Playgroud)

也许它可能是与QFileSystemWatcher相关的东西(由QFileSystemModel使用),我想......也许它使用了一些QTimer功能.

python multiplatform pyqt4 qtimer

10
推荐指数
1
解决办法
8181
查看次数

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

我正在尝试在工作线程的事件循环中启动计时器,但出现此错误: QObject::startTimer: Timers can only be used with threads started with QThread

这有什么问题?

#include <QObject>
#include <QThread>
#include <QTimer>

class A : public QObject
{
    Q_OBJECT
public:
    A();

private:
    QThread m_workerThread;
    QTimer m_myTimer;

};

A::A()
{
    this->moveToThread(&m_workerThread);
    m_myTimer.moveToThread(&m_workerThread);
    m_workerThread.start();
    m_myTimer.start(1000);
}
Run Code Online (Sandbox Code Playgroud)

qt qthread qtimer

8
推荐指数
1
解决办法
2万
查看次数

PyQt4导致QThread错误

使用PyQt4 4.8.6,下面的代码会产生错误

QObject :: startTimer:QTimer只能用于以QThread启动的线程

当a用作QApplication的变量时,如果cpp(或大多数其他)用于变量,它不会产生错误.这是PyQt4中的错误还是我缺少的东西?

#! /usr/bin/env python

# This is only needed for Python v2 but is harmless for Python v3.
import sip
sip.setapi('QVariant', 2)

from PyQt4 import QtGui

#def main():

if __name__ == '__main__':
    import sys

    if len(sys.argv) > 1:
       use_a = False
       print "Don't use a"
    else:
       use_a = True
       print "Use a"

    if use_a:
       a = QtGui.QApplication(sys.argv)
    else:
       cpp = QtGui.QApplication(sys.argv)

    model = QtGui.QStandardItemModel(4,2)
    tableView = QtGui.QTableView()
    tableView.setModel(model)

    tableView.show()
    if use_a:
       sys.exit(a.exec_())
    else:
       sys.exit(cpp.exec_())


#if …
Run Code Online (Sandbox Code Playgroud)

python pyqt pyqt4 qthread qtimer

6
推荐指数
1
解决办法
1117
查看次数

使用QT,即使可能发生更多呼叫,如何在一定间隔后调用一次功能?

即使我认为这不复杂,我也很难写出这个问题.

我想做一些simalar QTimer::singleshot()但我希望它仍然只调用SLOT一次,即使QTimer::singleshot()在它发生之前被多次调用.

c++ qt qtimer

6
推荐指数
2
解决办法
8594
查看次数

如果我有几个重叠的QTimer,会发生什么

假设我有2个QTimer对象,其间隔10,20.并且假设我想使用定时器1 信号和定时器2运行.所以运行顺序为和,如下所示: slot1()timeoutslot2slot1slot2

10ms-----20ms-----------30ms----40ms-----  
(slot1) (slot1, slot2) (slot1) (slot1, slot2)...  
Run Code Online (Sandbox Code Playgroud)

我想在20毫秒之后知道哪个slot1&先slot2执行?我如何强制事件循环运行slot2,然后slot1当它们重叠时(slot2对我来说更重要的是按时运行)

c++ qt overlapping qtimer

6
推荐指数
1
解决办法
578
查看次数

QTimer setInterval 不重置剩余时间

我有一个用 QT 编写的应用程序,它使用 QTimer。它基本上是一个游戏,所有的动作都由计时器控制。游戏包括增加\降低游戏速度的能力。提高速度的代码是

    timerValue -= speedUpValue;
    if (timerValue < maxSpeed) {
        timerValue = maxSpeed;
    }
    timer -> setInterval(timerValue); 
Run Code Online (Sandbox Code Playgroud)

speedUpValue并且maxSpeed是常数。几乎相同的代码用于降低速度。问题是setInterval重置内部计时器,因此如果您继续快速增加或减少速度游戏最终永远不会进行,因为remainingTime它不断被重置。有没有办法remainingTime手动设置或更改间隔而不重置它?

c++ qt qtimer

6
推荐指数
1
解决办法
3030
查看次数

如何在GoogleTest中使用QTimers

我在单元测试期间遇到一些情况,我希望某些QTimer的超时在某个QObject中触发一些插槽.如何做到这一点以及此测试的一些常见缺陷并不是很明显.

c++ qt googletest qtimer

5
推荐指数
1
解决办法
1449
查看次数