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

  • 相关阅读:
    this指针详解
    C++处理异常
    C++中的this指针
    c++中的string类
    c面试题总结
    c++中的引用详解
    c++中的new和delete
    函数重载
    BST(二叉排序树)的插入与删除
    ccf行车路线
  • 原文地址:https://www.cnblogs.com/findumars/p/6696924.html
Copyright © 2020-2023  润新知