Qt线程和定时器[一]

2014-08-14  来源:本站原创  分类:Qt  人气:6 

新的线程run里面一定要有exec的调用,否则无法接受消息的。

class myQThr : public QThread
{
    Q_OBJECT
public:
    myQThr(QObject *in = NULL)
        :QThread(in)
    {
        WrTimer = new QTimer(this);
        connect(WrTimer, SIGNAL(timeout()), this, SLOT(TimerOutWr1()), Qt::DirectConnection);
        WrTimer->start(2000);
    }
    void run()
    {
        exec();
    }  

private:
    QTimer *WrTimer;
public slots:
    void TimerOutWr1()
    {
        int a = 100;
    }
};  

#include "qt3.h"
#include <QtWidgets/QApplication>  

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qt3 w;
    w.show();  

    myQThr *myt = new myQThr ;
    myt->start();  

    return a.exec();
}

只要是在myQThr的构造函数里面做的定时器,出发事件,一定是在main函数的线程里面。不管connect(WrTimer, SIGNAL(timeout()), this, SLOT(TimerOutWr1()), Qt::DirectConnection);里面用Qt::DirectConnection还是Qt::QueuedConnection。因为此时新的线程都么有创建好,更加不说运行了。

再说运行:

class myQThr : public QThread
{
    Q_OBJECT
public:
    myQThr(QObject *in = NULL)
        :QThread(in)
    {
    }  

    void run()
    {
        WrTimer = new QTimer(this);
        connect(WrTimer, SIGNAL(timeout()), this, SLOT(TimerOutWr1()), Qt::QueuedConnection);
        WrTimer->start(2000);
        exec();
    }

private:
    QTimer *WrTimer;
public slots:
    void TimerOutWr1()
    {
        int a = 100;
    }
};

如此则在main的线程里面运行TimerOutWr1。

修改如下:

class myQThr : public QThread
{
    Q_OBJECT
public:
    myQThr(QObject *in = NULL)
        :QThread(in)
    {
    }  

    void run()
    {
        WrTimer = new QTimer(this);
        connect(WrTimer, SIGNAL(timeout()), this, SLOT(TimerOutWr1()), Qt::DirectConnection);
        WrTimer->start(2000);
        exec();
    }  

private:
    QTimer *WrTimer;
public slots:
    void TimerOutWr1()
    {
        int a = 100;
    }
};

用Qt::DirectConnection做connect的话,则在新建的线程里面运行了。

相关文章
  • Qt线程和定时器[一] 2014-08-14

    新的线程run里面一定要有exec的调用,否则无法接受消息的. class myQThr : public QThread { Q_OBJECT public: myQThr(QObject *in = NULL) :QThread(in) { WrTimer = new QTimer(this); connect(WrTimer, SIGNAL(timeout()), this, SLOT(TimerOutWr1()), Qt::DirectConnection); WrTimer->star

  • QT线程与定时器[二] 2014-08-14

    下面转一个相关说明吧 实例代码1: class MThread :public QThread { public: MThread(); ~MThread(); virtual void run(); void foo(); ... }; POINT 1:QThread类的实例与普通类的实例没什么不同,只是运行着的run()函数会不同 实例代码2: class MDialog :public QDialog { ... MThread *mythread; }; MDialog::MDialog

  • Qt 线程基础(QThread.QtConcurrent.QThreadPool等) 2012-11-08

    使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使用线程时需要非常小心.启动线程是很容易的,但确保所有共享数据保持一致很难.遇到问题往往很难解决,这是由于在一段时间内它可能只出现一次或只在特定的硬件配置下出现.在创建线程来解决某些问题之前,应该考虑一些替代的技术 : 替代技术 注解 QEventLoop::processEvents() 在一个耗时的计

  • Qt 线程基础(QThread.QtConcurrent等) 2012-11-10

    昨晚看Qt的Manual,突然发现下一个版本的Qt中(Qt4.7.4.Qt4.8等)增加了一个特赞的介绍多线程的文章 : Thread Basics 注意: 该链接以后会失效,但是 到时候你直接看Qt自带Manual就行了 本文不是严格的翻译 dbzhang800 2011.06.18 使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使用线程时需要非常

  • python通过线程实现定时器timer的方法 2014-06-04

    这篇文章主要介绍了python通过线程实现定时器timer的方法,涉及Python线程与定时器timer的使用技巧,需要的朋友可以参考下 本文实例讲述了python通过线程实现定时器timer的方法.分享给大家供大家参考.具体分析如下: 这个python类实现了一个定时器效果,调用非常简单,可以让系统定时执行指定的函数 下面介绍以threading模块来实现定时器的方法. 使用前先做一个简单试验: import threading def sayhello(): print "hello wor

  • Qt线程基础(这个比较完整) 2012-11-09

    线程基础 保谓线程? 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据结算的时候,在相同的桌面上可能有一个播放器正在播放你最喜欢的歌曲.这是一个两个进程并行工作的例子:一个进程运行电子表格程序;另一个进程运行一个媒体播放器.这种情况最适合用多任务这个词来描述.进一步观察媒体播放器,你会发现在这个进程内,又存在并行的工作.当媒体播放器向音频驱动发送音乐数据的时候,用户界面上与之相关的信息不断地进行更新.这就是单个进程内的并行线程. 那么,线程的并行性

  • qt线程----部分代码片段 2012-11-09

    一.把视频显示到界面的方法 (1)针对qt4的(视频格式为rgb32) v4l_grab_movie(&v4l_dev); unsigned char *pBuffer= v4l_dev.buffer; QImage image(pBuffer,320,240,QImage::Format_RGB32); QPixmap pixmap; pixmap=pixmap.fromImage(image); label->setPixmap(pixmap); label->setFixedSi

  • QT定时器QTimer 2012-10-29

    在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度. 1.QObject类的定时器 QObject是所有Qt对象的基类,它提供了一个基本的定时器.通过QObject::startTimer(),可以把一个一毫秒为单位的时间间隔作为参数来开始定时器,这个函数返回一个唯一的整数定时器的标识符.这个定时器开始就会在每一个时间间隔"触发",直到明确的使用这个定时器的标识符来调用QObje

  • Qt下几个线程函数介绍 2012-11-09

    1.QCoreApplication::processEvents() 2.每个线程可以有它的事件循环,初始线程开始它的事件循环需使用QCoreApplication::exec(),别的线程开始它的事件循环需要用QThread::exec().像QCoreApplication一样,QThreadr提供了exit(int)函数,一个quit() slot. 线程安全的函数QCoreApplication::postEvent(),在任何时候,给任何线程中的任何对象投递一个事件,事件会在那个创建

  • Qt中的多线程编程 2010-08-18

    Qt中的多线程编程 级 别: 初级 续欣 ([email protected]), 2004 年 4 月 01 日 Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功能.为了满足用户构造复杂图形界面系统的需求,Qt 提供了丰富的多线程编程支持. Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功能.为了满足用户构造复杂图形界面系统的需求,Qt 提供了丰富的多线程编程支持.从 2.2 版本开始,Qt 主要从下面三个方

  • Qt的多线程编程注意事项 2014-04-01

    QT总的来说是一个易学易用的库, 但是QT的多线程使用确实容易犯错,尤其是结合上异步的网络访问,谁用谁知道.我觉得核心是一句话,QThread要当作线程控制块用,不要以为派生一个QThread的子类,里面的东西都跑在新的线程里了,只有run()里的是这样. 下面这篇文章我觉得讲的很好,深入解析QT的线程用法,文章有点长,但是值得一读. 原文在 http://qt-project.org/wiki/ThreadsEventsQObjects 译文在 http://www.cppblog.com/b

  • JavaScript可否多线程? 深入理解JavaScript定时机制 2014-08-26

    JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感 例如 setTimeout( function(){ alert('你好!'); } , 0); setInterval( callbackFunction , 100); 认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是JavaScript API文档明确定义第二个参数意义为隔多少毫秒后,回调方法就

  • 一个MIDP俄罗斯方块游戏的设计和实现 2014-09-02

    文章来源:csdn 作者:陈万飞 作者简介 陈万飞,男,中南大学数软系学士,曾任北京长城软件高级程序员,系统分析师.有较为丰富的j2se,j2ee开发经验.目前致力于j2me研究工作.可通过[email protected]与他联系 摘要 本文给出了一个基于MIDP1.0的俄罗斯方块游戏的设计方案,并给出全部实现源代码.该游戏的最大特色是屏幕自适应,无论各种手机,PDA的屏幕大小如何,该游戏总是能获得最佳的显示效果.游戏在J2me wireless toolkit 2.1的4种模拟器上测试通过.

  • 深入理解JavaScript定时机制 2014-10-18

    JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感 例如 setTimeout(function() { alert('你好!'); }, 0); setInterval(callbackFunction, 100); 认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是JavaScript API文档明确定义第二个参数意义为隔多少毫秒后,回调方法就会被执

  • JavaScript是否可实现多线程 深入理解JavaScript定时机制 2014-12-22

    JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 容易欺骗别人感情的JavaScript定时器 JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert('你好!'); } , 0); setInt

  • Android App调试内存泄露之Cursor篇 2015-03-14

    最近在工作中处理了一些内存泄露的问题,在这个过程中我尤其发现了一些基本的问题反而忽略导致内存泄露 最近在工作中处理了一些内存泄露的问题,在这个过程中我尤其发现了一些基本的问题反而忽略导致内存泄露,比如静态变量,cursor关闭,线程,定时器,反注册,bitmap等等,我稍微统计并总结了一下,当然了,这些问题这么说起来比较笼统,接下来我会根据问题,把一些实例代码贴出来,一步一步分析,在具体的场景下,用行之有效的方法,找出泄露的根本原因,并给出解决方案. 现在,就从cursor关闭的问题开始把,谁都

  • JavaScript定时机制setTimeout与setInterval研究 2012-10-25

    容易欺骗别人感情的JavaScript定时器 本文转自:爱微网 JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout(function() { alert('你好!'); }, 0); setInterval(callbackFunction, 100); 认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是JavaScript

  • RTLinux下的一种实时应用通信机制 2013-09-05

    rtlinux作为linux最为通用的几种硬实时扩展之一,表现了良好的硬实时性.同时,为了更有效地为各种实时应用服务,提供了多种与linux中非实时进行通信的接口,主要有共享内存.rt_fifo和线程信号驱动机制,三者的应用重点各不相同.其中前两种较为常用[1].由于不的实现机理,这两种接口的应用范畴各有侧重.经过实践,笔者认为将以上两种接口有机地结合,利用共享内存传送大容量.对读/写时序要求不高的数据信息:同时,利用rt_fifo辅助实现对该共享内存的同步控制,能够综合两者的优势,是rtlin

  • 深入JDK源码之定时操作Timer类和TimerTask类实现 2015-03-15

    Timer类是一种线程设施,可以用来实现某一个时间或某一段时间后安排某一个任务执行一次或定期重复执行.该功能和TimerTask配合使用.TimerTask类用于实现由Timer安排的一次或重复执行的某个任务.每一个Timer对象对应的是一个线程,因此计时器所执行的任务应该迅速完成,否则会延迟后续的任务执行. JDK源码TimerTask类 这个类是个抽象类比较简单,有四个常量表示定时器任务的状态,还有一个Object类型lock对象,相当一把锁,控制线程对定时器任务状态的同步访问. nextE

  • 定时器与多线程 SetTimer and Multi-Thread 每个线程独立使用一个定时器 2013-01-08

    定时器与多线程 SetTimer and Multi-Thread 每个线程独立使用一个定时器 生产者--消费者 模拟程序,需求如下: 将生产者和消费者模拟算法封装在一个动态链接库中,主程序调用相关函数.生产者放入产品和消费者取走产品的速度可调节. 分别用循环队列和栈实现. 一般模拟这个算法都是生产这,消费者各开一个线程,同步访问一个共享缓冲区.但是需求要求能调节速度,我的思路是在 每个线程里单独创建一个定时器,但是Windows下定时器特性是: 每隔定时时间,Windows系统放入一个 WM_