zoukankan      html  css  js  c++  java
  • “QObject调用moveToThread()后 该如何释放”及QThread 的启动关闭

    QThread的另一种用法, 不用继承QThread和重载run()函数:

    1  QThread *thread = new QThread( );
    2  Task    *task   = new Task();
    3  task->moveToThread(thread);
    4  connect( thread, SIGNAL(started()), task, SLOT(doWork()) );
    5  connect( task, SIGNAL(workFinished()), thread, SLOT(quit()) );//从Qt4.4开始,qthreads-no-longer-abstract,run 默认调用 QThread::exec(),即启动消息队列
    6  //automatically delete thread and task object when work is done:
    7  connect( thread, SIGNAL(finished()), task, SLOT(deleteLater()) );
    8  connect( thread, SIGNAL(finished()), thread, SLOT(deleteLater()) );
    9  thread->start();
     1 class Task : public QObject
     2 {
     3 Q_OBJECT
     4 public:
     5     Task();
     6     ~Task();
     7 public slots:
     8     void doWork();
     9 signals:
    10     void workFinished();
    11 };

    connect()的第五个参数 
    有六种: 
    1. Qt::AutoConnection 
    2. Qt::DirectConnection 
    3. Qt::QueuedConnection 
    4. Qt::BlockingQueuedConnection 
    5. Qt::UniqueConnection 
    6. Qt::AutoCompatConnection

    前两种比较相似,都是同一线程之间连接的方式,不同的是Qt::AutoConnection是系统默认的连接方式。这种方式连接的时候,槽不是马上被执行的,而是进入一个消息队列,待到何时执行就不是我们可以知道的了,当信号和槽不是同个线程,会使用第三种QT::QueueConnection的链接方式。如果信号和槽是同个线程,调用第二种Qt::DirectConnection链接方式。

    第二种Qt::DirectConnection是直接连接,也就是只要信号发出直接就到槽去执行,无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行,一旦使用这种连接,槽将会不在线程执行!。

    第三种Qt::QueuedConnection和第四种Qt::BlockingQueuedConnection是相似的,都是可以在不同进程之间进行连接的,不同的是,这里第三种是在对象的当前线程中执行,并且是按照队列顺序执行。当当前线程停止,就会等待下一次启动线程时再按队列顺序执行 ,等待QApplication::exec()或者线程的QThread::exec()才执行相应的槽,就是说:当控制权回到接受者所依附线程的事件循环时,槽函数被调用,而且槽函数在接收者所依附线程执行,使用这种连接,槽会在线程执行。

    第四种Qt::BlockingQueuedConnection是(必须信号和曹在不同线程中,否则直接产生死锁)这个是完全同步队列只有槽线程执行完才会返回,否则发送线程也会等待,相当于是不同的线程可以同步起来执行。

    第五种Qt::UniqueConnection跟默认工作方式相同,只是不能重复连接相同的信号和槽;因为如果重复链接就会导致一个信号发出,对应槽函数就会执行多次。

    第六种Qt::AutoCompatConnection是为了连接QT4 到QT3的信号槽机制兼容方式,工作方式跟Qt::AutoConnection一样。显然这里我们应该选择第三种方式,我们不希望子线程没结束主线程还要等,我们只是希望利用这个空闲时间去干别的事情,当子线程执行完了,只要发消息给主线程就行了,到时候主线程会去响应。

    转自:http://blog.csdn.net/liukang325/article/details/50454409

  • 相关阅读:
    supervisor(一)基础篇
    linux添加开机自启动脚本示例详解
    suse 不能远程登录
    LintCode,hihoCoder,LeetCode有什么区别?
    windows 下安装nodejs 要怎么设置环境变量
    Java 集合:HashSet 与 ArrayList
    Java ArrayList、Vector和LinkedList等的差别与用法(转)
    一行代码实现java list去重
    25 highest paying companies: Which tech co outranks Google, Facebook and Microsoft?
    Chart: Who pays the most in Seattle for software engineers
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/5976979.html
Copyright © 2011-2022 走看看