• 2041阅读
  • 3回复

[提问]求助:多线程应用,界面卡死 [复制链接]

上一主题 下一主题
离线zdhwhl
 

只看楼主 倒序阅读 楼主  发表于: 2019-01-21
1.描述:
界面的一个按钮绑定的槽函数里,调用了如下函数。第一个参数是待发送的指令,第二个参数是发送命令后循环等待的毫秒数,我设置为等待60秒。

2.疑问:sendData发送指令后,我开启了子线程等待60秒,来接收指令返回。
为什么开启了子线程,主界面还会卡死?有什么解决办法?

3.代码:
QString &Worker::writeAndReadData(const QString&sData,int timeout)
{    

     rDataStr.clear();    

     rData.clear();    

     sendData(sData+"\r\n");    

     PVSleep::sleep(300);    

     QFuture<void> future = QtConcurrent::run([&]()    

     {        

            for(int i=0;i<timeout/1000;i++)      

           {          

                   if(rData.contains("information"))          

                   {                

                           rDataStr = rData;                

                           rData.clear();                

                           break;            

                    }            

                   else                

                         PVSleep::sleep(1000);        

             }    

      });    

      future.waitForFinished();    

      return rDataStr;
}

注:rData是成员变量,实时存储接收的返回消息。

离线automoblie0

只看该作者 1楼 发表于: 2019-01-22
future.waitForFinished();    去掉即可。

但这个做法得保持函数未被回收。这个线程办法不建议使用。
离线小韩老师

只看该作者 2楼 发表于: 2019-01-22
简单的做法是在Worker中定义一个信号比如  finished(),在里边发送信号
QFuture<void> future = QtConcurrent::run([&]()    
     {        
            for(int i=0;i<timeout/1000;i++)      
           {          
                   if(rData.contains("information"))    
                   {                
                           rDataStr = rData;              
                           rData.clear();          
                           break;            
                    }            
                   else                
                         PVSleep::sleep(1000);        
             }    
             emit finished()

      });    
离线zdhwhl

只看该作者 3楼 发表于: 2019-01-23
感谢上面两位朋友。
问题已解决。

总结:
1.开启线程后不再等待线程结束,函数直接返回;
2.子线程中有符合条件的结果时,把结果用信号发出去
快速回复
限100 字节
 
上一个 下一个