QT,在A线程中循环创造N个B线程,经测试,这N个B线程执行完毕之后不会发送finished信号,程序也不会析构它们,何解

QT,在A线程中循环创建N个B线程,经测试,这N个B线程执行完毕之后不会发送finished信号,程序也不会析构它们,何解?
本帖最后由 xiaoxiaoa2 于 2014-07-20 19:49:39 编辑
QT,在A线程中循环创建N个B线程,经测试
这N个B线程执行完毕之后不会发送finished信号,程序也不会析构它们,何解?

下面用伪代码表示吧,代码可能不对,但我做的程序是想这样来实现的
先构建两个线程
A class:public QThread{
public:
   A:A(){
            //BThread=new B;           //将run()函数中的new B移动到这里来,B执行完就会正确析构
    }
     void run(){
             while(true){
                    BThread=new B;
                    connect(BThread,SIGNAL(finished()),BThread,SLOT(deletelater()));
                    BThread->start();
             }
      }
private:
     B *BThread;
}
B class:public QThread{
public:
      void run()
      {
               qDebug()<<currentThreadId();
               this->exec();   //写不写都一样
               this->quit();     //写不写都一样
       }
}

main{
  A *a=new A;
 a->start();
}


我想实现的功能是:
A线程的run函数中不断new出来B线程对像
             while(true){
                    BThread=new B;
                    BThread->start();
                    connect(BThread,SIGNAL(finished()),BThread,SLOT(deletelater()));
             }

当B线程对像执行完之后,会自动析构
但是我这种做法,它是不会自动析构的
-----------------------------------------
另外我尝试在A线程中创建QVector<B> *BVector 
然后将A中创建的B线程对像放到BVector中,然后再forech这些对像,发现它们都在运行,没有结束
强制delete会告诉我这些对像在运行,BVector->item-isfinished()  发现它还在运行
也就是在A中创建的B线程对像执行start(),run()函数中的内容运行完之后,它不退出

————————————————————————————————————————

已经Google/百度搜索多次,没有发现我想实现的这种样例和解决方法
请高手帮我改一下,改成它能够自动析构,
并且我可以随意创建N个B线程对像并执行

希望各位大大,建一个这样的工程,然后测试一下,给一份可行的代码给我
非常感谢!QT,在A线程中循环创造N个B线程,经测试,这N个B线程执行完毕之后不会发送finished信号,程序也不会析构它们,何解

------解决方案--------------------
引用:
Quote: 引用:

因为你的run()内通过exec()启动了一个while循环,所以你的run根本就没有执行完的时候(除非你调用了quit())。另外,你exec()后面的quit() 不会起作用的。

你觉得下面的代码能正常工作么?

xxx = True
while(xxx)
{
}
xxx = False;



这是在A线程中执行的
我需要的就是A线程永远不要停下来
你的意思是,在A线程中new出来B线程的对象,只要A线程不结束
那么B线程永远不会结束?

另外我在B线程中添加了this->quit();是没有任何作用的


不妨抽时间把我前面贴的blog看看,把例子都跑一遍,对你理解QThread会有好处。另外,你也需要恶补一些事件循环的知识。具体到deleteLater,你也可以看看这篇blog: http://blog.****.net/dbzhang800/article/details/6300025

----------------------------------
言归正传,
这儿举得while例子,是说的你的B线程的情况,而不是说A线程。注意:exec() 就是while循环!
其他我就不重复了,你疑惑的这些(事件循环和QThread的工作机制)都属于Qt比较底层比较基础的东西,一旦你掌握了,你会发现问题很简单,用不着乱试。