0

QtでGUIを使用していますが、スレッドの操作に問題があります。2つのボタンストリームとストップストリームを備えた小さな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 に答える