Qt多线程 - 不能多次执行线程

时间:2017-08-11 07:37:09

标签: c++ multithreading qt

我正在尝试连续运行一个帖子。在我的情况下发生的是每次线程完成执行时我都无法再次启动它。我通过类函数来查看是否会出现类似于restart()或者其他什么,但似乎并非如此。

有人可以告诉我我可能缺少什么吗?

  webcamClass::webcamClass(QObject *parent) : QObject(parent)
  {
      recognizePerson=false;

      //setup recognition thread
      recognitionThread = new QThread(this);
      recognitionClObj = new recognitionClass();

      connect( recognitionThread, SIGNAL(started()), recognitionClObj,       SLOT(recognizePerson()) );
      recognitionClObj->moveToThread(recognitionThread);

  }

  void webcamClass:: getVideoFrame()
  {
      qDebug()<<"this is the webcam thread";
      static cv::VideoCapture cap(CV_CAP_ANY);
      cv::Mat imgFrame;

      if( !cap.isOpened() )
      {
          qDebug()<< "Could not initialize capturing...\n";
      }

      while(1)
      {
          cap >> imgFrame;
          cv::cvtColor(imgFrame, imgFrame, CV_BGR2RGB);
          QImage img;
          img = QImage((uchar*)imgFrame.data, imgFrame.cols,       imgFrame.rows, QImage::Format_RGB888);
          QPixmap pixmap = QPixmap::fromImage(img);
          emit gottenVideoFrame(pixmap);
          if(recognizePerson==true)
          {
              recognitionThread->start();

              qDebug()<<"started recognition thread";
          }
          cv::waitKey(100);
      }
  }

   int recognitionClass::recognizePerson()
   {
        qDebug()<<"recognizing person";
    }

生成输出:

            this is the webcam thread
            started recognition thread
            recognizing person
            started recognition thread
            started recognition thread
            started recognition thread
            started recognition thread
            started recognition thread
            started recognition thread
            started recognition thread
            started recognition thread

正如你所看到的那样,“识别人”这个句子只打印1,而我预计它会像“开始识别线程”一样多次打印

理想情况下,我想让线程等待它接收新数据。它应该这样做20次然后返回新数据。

2 个答案:

答案 0 :(得分:0)

connect(recognitionThread,SIGNAL(started()),recognitionClObj,SLOT(recognPerson()),Qt :: DirectConnection);

您可以尝试在连接中添加Qt :: DirectConnection

答案 1 :(得分:0)

您的recognThread已经启动,因此每次进一步调用都不会做任何事情,也不会生成任何新的启动信号。如果您希望您的RecognitionClass做新工作,您必须将另一个信号连接到插槽recognPerson。 因此,在webcamClass中定义一个信号

signal:
    void doRecognize();

将第二个连接到您的webcamClass信号添加到recognitionClass

connect(this, SIGNAL(doRecognize()), recognitionClObj, SLOT(recognizePerson()));

而不是recognitionThread-&gt; start()问题

emit doRecognize();
相关问题