zoukankan      html  css  js  c++  java
  • 为何只能在其关联的线程内启动timer?(Qt会检查一致性,否则就不执行)

    为何只能在其关联的线程内启动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

  • 相关阅读:
    day9习题
    生产者消费者模型(吃包子例子)
    map 函数----filter函数
    #返回值包含函数
    #把函数当作参数传给另一个函数
    异常和错误!
    递归调用
    局部和全局案例!!
    全局变量与局部变量2
    全局变量与局部变量
  • 原文地址:https://www.cnblogs.com/findumars/p/6696924.html
Copyright © 2011-2022 走看看