zoukankan      html  css  js  c++  java
  • QT多线程及通过事件进行通信(通过自定义事件,然后QApplication::postEvent给主界面,我之前用的是信号槽)

    可以通过QThread实现跨平台的多线程开发,Qt库负责在特定平台上的特定多线程实现。要采用QThread进行多线程开发,首先需要包含头文件:

    #include <QThread>
    然后需要从QThread继承一个自己的线程类,暂作MyThread,关键是要实现QThread内的一个虚函数run。在run函数内部,最后一般都调用exec(),使得线程进入事件循环,否则线程主函数run运行结束,线程也就退出了。
    class MyThread : public QThread
    {
    public:
       MyThread();
    public:
       Dialog *parent;
    public:
       void run();
    };
    其中,parent存储的是创建该线程的窗口,也就是该线程的父线程,主要用于该子线程向父线程发送特定事件,以便进行线程间通信。
     
    自定义消息首先需要包含头文件:
    #include <QEvent>
    然后定义自己的事件值:
    const QEvent::Type MyEvent = (QEvent::Type)1234;
    然后在run函数里面(实际上是指在任何你想要和父线程进行通信的地方,我这里简化为就是在run函数内部了)通过:
    QApplication::postEvent(parent, new QEvent(MyEvent));
    将该事件发送出去。
    父线程内通过改写虚函数event,来使得能够捕获消息:
    bool Dialog::event(QEvent *event)
    {
       if (event->type() == MyEvent)
       {
          QMessageBox::information(this, "INFORMATION", "This is son sented signal!");
          return true;
       }
       return QWidget::event(event);
    }
    这样,两个线程就能够同时运行并能够进行线程间通信了。

    http://www.cnblogs.com/bingcaihuang/archive/2011/03/16/1985971.html

  • 相关阅读:
    Binary Tree
    (并查集..含小总结)A
    (超简单并查集)POJ2524 Ubiquitous Religions(8.4.4)
    OpenSees开发(一)windows 上编译opensees (使用vs2005)
    vector的push_back对于拷贝构造和赋值操作的调用
    一个指针的引用引发的血案
    MFC中由左键单击模拟左键双击引起的问题
    CLAPACK动态调用
    SVN部署(远程)客户端篇
    SVN部署(本地)
  • 原文地址:https://www.cnblogs.com/findumars/p/6152894.html
Copyright © 2011-2022 走看看