0

我正在使用 Qt 开发 GUI,我在玩线程时遇到问题。我创建了一个带有两个按钮流和停止流的小 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();

}
4

1 回答 1

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;
}    

那么它可能什么都不做。

于 2012-12-07T15:39:45.547 回答