Qt:重启线程

时间:2012-12-07 14:15:12

标签: c++ qt

我正在使用Qt进行GUI,我在使用线程时遇到问题。我创建了一个带有两个按钮流和stopstream的小GUi。我的问题是我在停止后无法重启流: 下面是代码的一部分:

MainThread::MainThread(QWidget *parent):QWidget(parent){

    bstream = new QPushButton("&stream");
    bstopstream = new QPushButton("STOP stream");
    bcapture = new QPushButton("capture a frame");
    Allbox = new QVBoxLayout(this);
    Allbox->addWidget(bstream);
    Allbox->addWidget(bcapture);
    Allbox->addWidget(bstopstream);

    connect(bstream,SIGNAL(clicked()),this, SLOT(startingstream()));
    connect(bcapture,SIGNAL(clicked()),this, SLOT(captureAFrame()));
    connect(bstopstream,SIGNAL(clicked()),this, SLOT(stopstreaming()));

    setLayout(Allbox);

} 

void MainThread::stopstreaming(){
    cv::destroyAllWindows();

    stream.terminate();
    stream.wait();
    stream.~Streaming();
}

void MainThread::startingstream(){

    if(stream.isRunning()) return;
    stream.start();

}

1 个答案:

答案 0 :(得分:2)

stream.~Streaming();

这会调用stream对象的析构函数。你不应该手动调用它,正式之后对象已经死了,之后它可能表现得“有趣”。

例如,假设一个这样的对象:

void stream::play() {
    buff_->start();
}

void stream::~stream() {
    delete buff_;
}

然后行buff_->start()可能会做一些时髦的事情,基本上会产生未定义的行为。

或者如果它是这样编写的(尽管你应该永远不需要在析构函数中手动设置为零;如上所述,对象假设在销毁后死亡):

void stream::play() {
    if (buff_) buff_->start();
}

void stream::~stream() {
    delete buff_;
    buff_ = 0;
}    
然后它可能什么都不做。