我正在使用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();
}
答案 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;
}
然后它可能什么都不做。