• 5859阅读
  • 5回复

如何在开始一个线程的时候终止另外一个线程? [复制链接]

上一主题 下一主题
离线chocolate
 
只看楼主 倒序阅读 楼主  发表于: 2008-05-08
— 本帖被 XChinux 执行加亮操作(2008-05-08) —
如题:如何在开始一个线程的时候终止另外一个线程(正在执行while(1)操作的线程)?
我在应用程序中用QThread类来编程,while(1)线程用来读串口数据,怎么才能在打开另外线程时终止这个while(1)的线程?
编程功夫不到家,谢谢大家了
离线lzian
只看该作者 1楼 发表于: 2008-05-08
这个我研究过一点,有两种方法:
一,设计B.startThread(){emit stopAThread();this->start();}
                A----slot: stopThread(){quit();wait();}
                connect(&threadB, SIGNAL(stopAThread()), &threadA, SLOT(stopThread()));
        这种方法线程的结束依赖系统的调度,linux上会让程序阻塞
二,在A的while(1)里做点手脚,设计一个函数使得循环break,也就是设计一个替代quit()的函数,使得程序自然结束,而非系统调度中止线程;其他基本上和第一种方法一致;
离线chocolate
只看该作者 2楼 发表于: 2008-05-08
谢谢楼上的兄弟!
还有一个问题呢...因为是在窗口点击按钮执行的while(1)线程,如果把
MyThread a;
a.start();
a.wait();
这其中的a.wait()带进去的话,就陷到while(1)中了.....所以我没带这个,还可以读串口的同时点击窗口上的其他按钮....
这时问题来了,我要再点击一次这个读串口的按钮就有两个线程在读写串口了,点N次就有N个线程做这个事......
怎么 避免这种情况?即如果开始读串口了,再点多少次都是只有一个线程去读写串口,一直到终止它为止

PS:没什么经验,问得简单了点,见笑了.....
离线lzian
只看该作者 3楼 发表于: 2008-05-08
        1  wait()的用法:一,如果线程程序执行完了,或者线程还没开始,返回true;二,如果超过了设置的超时时间,返回false,没有设置超时时间就一直等到run()结束。
        2  在start()之前添加一个判断,if(a.isRunning() == false){this->start();}
离线lzian
只看该作者 4楼 发表于: 2008-05-08
第二点有笔误,应该是if(a.isRunning() == false){a.start();}
离线lzian
只看该作者 5楼 发表于: 2008-05-08
另:如果你在start()之后就用wait()的话,主程序就一直等待线程结束,所以看似阻塞了。
wait()一般都是用在线程中止函数之后的,用来确保线程正常中止。
快速回复
限100 字节
 
上一个 下一个