界面、线程与Qt线程

来源:互联网 发布:ubuntu怎么下载gcc 编辑:程序博客网 时间:2024/05/16 12:41

1, 当界面的操作频率很高,而且还要考虑用户体验时,耗时的操作会独占系统cpu资源 ,让界面卡死在那里,这时需要考虑多线程方案,将耗时的操作放在

线程中执行

如下例,界面需要不停地添加字符串,如果不使用线程处理的话界面会卡死,下面我们先使用UC中的线程方法实现

        void *  processData(void *par){            /*使用线程访问界面*/            QTextBrowser *res=(QTextBrowser*)par;            sleep(2);            res->append("send data to server");            sleep(5);            res->append("client  stop");             return par;        }        void   DmsClient::startAndStop(){            /*把耗时操作 放入线程中 考虑线程如何访问      界面*/            res->append("client start");            pthread_t   thid;            pthread_create(&thid,0,processData,res);         }
uc中的线程也可以实现其功能 但是与界面的耦合度比较高  要和界面通信必须传一个界面的对象到线程处理函数中去    看qt中的线程

qt中的线程是面向对象的 qthread类  

界面中的代码示例如下

      
构造函数中
myth=new MyThread();            /*关联线程的信号和界面的槽*/            connect(myth,SIGNAL(mysig(QString)),this,SLOT(getData(QString)));  void  Client::startAndStop(){            /*把耗时操作 放入线程中 考虑线程如何访问      界面*/            res->append("client start");                 /*如何启动线程*/            myth->start();                start->setDisabled(true);        }       void  Client::getData(QString data){           /*槽函数将数据接收到之后 显示到界面上*/            res->append(data);       } 

线程类中 实现重写虚函数run函数

头文件:

    class MyThread:public QThread{        Q_OBJECT        /*在run函数实现线程代码 完成数据的发送        让界面得知发送的数据 需要定义信号函数 */        public:        void run();         public:signals:        void  mysig(QString par);     };


void MyThread::run(){    emit mysig("thread start");     /*循环发送数据*/  ...........................
把数据通过信号发送出去           emit mysig(QString(datastr));            }     emit mysig("thread end!");}



原创粉丝点击