• 9014阅读
  • 5回复

[提问]Qprocess和Qthread的共同使用有阻塞 [复制链接]

上一主题 下一主题
离线wangrunmin
 
只看楼主 倒序阅读 楼主  发表于: 2011-07-30
我想实现的功能是从串口采集数据,并处理判断,如果数据(比如温度值)大于某个范围,就报警提示
其中数据采集和报警定义了两个线程,数据处理和显示是主线程。

数据采集线程功能是采集数据,采集一个包后发射一个信号,通知主线程处理判断和显示,同时主线程启动报警线程,如果采集值过大,就报警(使用madplay,用AV97播放音乐)。


示意代码如下

main函数:
RecvThread *m_recvthread;


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    papp = & app;
    
  
    m_recvthread = new RecvThread();     // 数据采集线程(串口接收)
    m_recvthread->start();                    
    
    FunctionList  dlg;                          //主界面
    dlg.show();

      return app.exec();
}

functionlist.cpp




RecvThread::RecvThread()
{
     fd=-1;
}
void RecvThread::run()                              

{
     comm();   //打开串口
     while(true)                                    

    {
       read(fd,comm_str,25);
       if(comm_str[24]==126)
       emit sendData( );  //数据包结束发射信号
     }
}



FunctionList::FunctionList()

{
connect(m_recvthread,SIGNAL(sendData( )),this,SLOT(receiveData( )));  信号槽
}

void FunctionList::receiveData()

{
AlarmThread *thread = new AlarmThread();//定义报警线程
     temperature =  (comm_str1[11]);//需要的数据
   thread->start();//报警线程开始
}



AlarmThread::AlarmThread()      //报警线程
    {

    }
void AlarmThread::run()
    {
    
   QProcess proc ;    采用QProcess的方法,调用外部程序madplay发声音乐
   QString program="/Qtopia/demo/bin/madplay";

   QStringList filename1;
   filename1<<"/mnt/yaffs/1.mp3";


   if(temperature>20)
   proc.start(program,filename1);
   proc.waitForFinished();

   }

现在的问题是,我连续向串口发射表示高温的数据,开始七八次左右,是可以报警的,正常播放音乐。但是继续发送高温数据后,整个程序就死了,当机了。不知道为什么?


自己思考可能有两种可能:

1:报警线程的问题,报警线程没有像数据接收线程一样在main函数开始,而是在主线程的槽函数开始,导致,串口每次接收数据启动槽函数
就启动一次这个线程,导致多个线程同时启动。
2:qprocess的问题,每次调用,qprocess都没有结束,结果多个proc在同时运行,耗尽了开发板资源。


但是还是不会解决。哪位能帮忙思考一下,一个问题然了很久了。
离线jdwx

只看该作者 1楼 发表于: 2011-07-30
回 楼主(wangrunmin) 的帖子
看代码,发生部分用多线程没什么用。
还有,报警发声线程,是new出来的,并没有被delete,也就是说,发一次信号,new一个新的线程
早晚内存用光。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线wangrunmin
只看该作者 2楼 发表于: 2011-07-31
回 1楼(jdwx) 的帖子
为什么没有用呢?在发声的时候不是同时要读串口,并显示么?

那这个线程应该怎么改呢?能不能给点意见?
离线jdwx

只看该作者 3楼 发表于: 2011-07-31
回 2楼(wangrunmin) 的帖子
用QSound播放,不用Qprocess启动其它程序。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线lbz12721
只看该作者 4楼 发表于: 2012-01-17
加油  努力~~~
离线benbenmajia

只看该作者 5楼 发表于: 2012-01-17
new  和 delete 的用法 以及C++中基础的memory leak的问题如果没弄清楚的话还是先学习一下C++比较好
安然.....
快速回复
限100 字节
 
上一个 下一个