• 6586阅读
  • 13回复

怎么让线程马上停止 [复制链接]

上一主题 下一主题
离线磐石
 
只看楼主 倒序阅读 楼主  发表于: 2010-03-13
首先是一个应用程序开始运行,这个应用中有某个事件触发后调用一个线程(比如mythread)
void myThread::run()
{
    while(1)
   {
     一直在做某件事;
   }
}

当这个应用程序中又触发另一个事件,要求停止该线程,
在此我碰到了两个问题,请高手帮忙看一下,谢谢,
1。怎样马上停止该线程,我用了quit()函数,没达到效果,我对Manual中对terminate () ,quit()的说明看不很懂,搞不明白他们的工作机制?
2。我将这个程序在mini2440板子跑时,当一起动线程,整个应用程序是冻结在那里了,只做线程里的事,而做不了其它的,也不知道什么原因?
大侠们,知道一点说一点啊,非常感谢
不怕做不到,只怕想不到
离线ltarcher
只看该作者 1楼 发表于: 2010-03-14
1.信号通知
2.事件通知
3.循环检查全局变量
推荐1,2
离线磐石
只看该作者 2楼 发表于: 2010-03-14
引用第1楼ltarcher于2010-03-14 12:51发表的  :
1.信号通知
2.事件通知
3.循环检查全局变量
推荐1,2

恩,谢谢,不是很明白你的意思,我想问的是,假如我应用程序中用个按钮,当我安下时就停止线程
connect(stopBtn,SIGNAL(clicked()),this,SLOT(stopThread)));
void Dialog::stopThread()
{
    myThread->quit();
}

但调用这个函数(quit())时,线程没有停下来
不怕做不到,只怕想不到
离线benbenmajia

只看该作者 3楼 发表于: 2010-03-15
connect在哪个线程里面 ?
安然.....
离线xtfllbl

只看该作者 4楼 发表于: 2010-03-15
引用第2楼磐石于2010-03-14 14:22发表的  :
恩,谢谢,不是很明白你的意思,我想问的是,假如我应用程序中用个按钮,当我安下时就停止线程
connect(stopBtn,SIGNAL(clicked()),this,SLOT(stopThread)));
void Dialog::stopThread()
{
.......

线程中信号机制是不起作用的,请使用事件,或者笨办法(全局变量)
上海欢迎您
离线benbenmajia

只看该作者 5楼 发表于: 2010-03-15
安然.....
离线磐石
只看该作者 6楼 发表于: 2010-03-15
引用第3楼benbenmajia于2010-03-15 09:13发表的  :
connect在哪个线程里面 ?

connect是在整个应用程序中的,假如整个应用程序是一个Dialog,上面有两个按钮(BtnA,BtnB),
当点击BtnA时开起线程,当点击BtnB时关闭线程,简化代码如下,点击BtnA时开启线程是没问题的,但问题是点击按钮B时怎样马上让线程停止下来,这主要是程序在mini2440中运行碰到的,不知道什么原因

class myThread:public QThread
{
     ..................
    public:
      void run;
}

void myThread::run()
{
     while(1)
     {
      一直在做某事;
     }
}
class Dialog:public QDialog
{
     ...............
    public slots:
         startThread();
         stopThread();
   .  ...................
    private:
         myThread *mythread;
         QPushButton *BtnA;
          QPushButton *BtnB;

}
..........................
connect(BtnA,SIGNAL(clicked()),this,startThread()));
connect(BtnB,SIGNAL(clicked()),this,stopTherad()));
...........................

void Dialog::startThread()
{
    mythread->run();
}
void Dialog::stopThread()
{
   mythread->quit();
}
不怕做不到,只怕想不到
离线磐石
只看该作者 7楼 发表于: 2010-03-15
引用第5楼benbenmajia于2010-03-15 09:32发表的  :
http://iwanttobe09.blog.163.com/blog/static/131787305200910445829280/
看起来应该是可以的

呵呵,刚还在回复你,你又给我解答了,谢谢啊
不怕做不到,只怕想不到
离线xtfllbl

只看该作者 8楼 发表于: 2010-03-15
引用第5楼benbenmajia于2010-03-15 09:32发表的  :
http://iwanttobe09.blog.163.com/blog/static/131787305200910445829280/
看起来应该是可以的

那个不是正真的信号,没看别人信号队列四个字是打引号的么。。。。
上海欢迎您
离线lishiyong110
只看该作者 9楼 发表于: 2010-03-15
不知道使用定时器满不满足你的要求...
静下心来学习
离线benbenmajia

只看该作者 10楼 发表于: 2010-03-16
引用第8楼xtfllbl于2010-03-15 10:40发表的  :
那个不是正真的信号,没看别人信号队列四个字是打引号的么。。。。

我可以确定是使用信号,但是不是直接发送的信号,不同的线程之间使用信号有可能会导致信号的丢失,但是每个线程有自己的信号队列,就像消息队列一样,当然也可以使用事件来做
安然.....
离线xjcook

只看该作者 11楼 发表于: 2010-03-16
当一起动线程,整个应用程序是冻结在那里了,只做线程里的事,而做不了其它的,也不知道什么原因?

是不是你的while(1)里面没有sleep,导致cpu被占完了?

加一个msleep(50)之类的试试。
离线benbenmajia

只看该作者 12楼 发表于: 2010-03-16
他是想通过主线程来控制这个线程的执行
安然.....
离线磐石
只看该作者 13楼 发表于: 2010-03-16
引用第11楼xjcook于2010-03-16 10:47发表的  :
当一起动线程,整个应用程序是冻结在那里了,只做线程里的事,而做不了其它的,也不知道什么原因?
是不是你的while(1)里面没有sleep,导致cpu被占完了?
加一个msleep(50)之类的试试。

恩,谢谢,我试一下看
不怕做不到,只怕想不到
快速回复
限100 字节
 
上一个 下一个