界面、线程与Qt线程


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!");
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值