Qt线程之moveToThread

来源:互联网 发布:10大网络恐怖推理图 编辑:程序博客网 时间:2024/06/15 03:32


、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
1.在mainwindow的添加成员:
    QSubObj m_Obj;
    QThread m_SubThread;

2.mainwindow构造函数中设置:

  m_Obj.moveToThread(&m_SubThread);
  m_SubThread.start();

3.mainwindow构造函数中绑定:
connect(&m_Obj,SIGNAL(Yoursignal()),this,SLOT(YourSlot()));

以后要想子线程向主线程中发消息,只需在子线程中使用emit Yoursignal()就可以了,当然,提到的信号和槽函数,都需要你来声明和实现的。


...........................................................................................................................................................................................

方法(3): 
在Qt4.3(包括)之前,run 是虚函数,必须子类化QThread来实现run函数。而从Qt4.4开始,qthreads-no-longer-abstract ,run 默认调用 QThread::exec() 。这样一来不需要子类化 QThread 了,只需要子类化一个 QObject 就够了,这正是被 Bradley T. Hughes推荐的方法。

方法如下

QThread thread; Object obj; Dummy dummy; obj.moveToThread(&thread); QObject::connect(&dummy, SIGNAL(sig()), &obj, SLOT(slot())); thread.start();


、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

方法(1): 
1. 不使用事件循环。这是官方的 Manual 、example 以及相关书籍中都介绍的一种的方法。 
a. 子类化 QThread 
b. 重载 run 函数,run函数内有一个 while 或 for 的死循环 
c. 设置一个标记为来控制死循环的退出。

这里的run函数自己执行了一个循环,不需要事件循环机制了。



、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、


参考:http://www.cnblogs.com/findumars/p/6017830.html

参考来源:http://www.qtcn.org/bbs/read-htm-tid-63015-page-e.html#a