QThread: уничтожен, пока поток все еще работает?
Я хотел бы начать свое QThread
когда я нажимаю на кнопку Run. Но компилятор выводит следующую ошибку:
QThread: Destroyed while thread is still running
ASSERT failure in QThread::setTerminationEnabled(): "Current thread was not started with QThread.", file threadqthread_win.cp.
Я не знаю, что не так с моим кодом.
любая помощь будет оценили.
вот мой код:
SamplingThread::SamplingThread( QObject *parent):
QwtSamplingThread( parent ),
d_frequency( 5.0 )
{
init();
}
MainWindow::MainWindow( QWidget *parent ):
QMainWindow( parent )
{.......
.....
run= new QPushButton ("Run",this);
stop= new QPushButton("Stop",this);
connect(run, SIGNAL(clicked()),this, SLOT (start()));
}
MainWindow::start
{
SamplingThread samplingThread;
samplingThread.setFrequency( frequency() );
samplingThread.start();
}
int main( int argc, char **argv )
{
QApplication app( argc, argv );
MainWindow window;
window.resize( 700, 400 );
window.show();
bool ok = app.exec();
return ok;
}
3 ответов
как говорится в сообщении об ошибке:QThread: Destroyed while thread is still running
. Вы создаете свой SamplingThread
внутри MainWindow::start
метод, но он выходит за рамки (т. е. уничтожается), когда этот метод завершается. Есть два простых способа, которые я вижу:--10-->
- вы делаете свой
SamplingThread
членомMainWindow
таким образом, его срок службы такой же, как дляMainWindow
экземпляр -
вы используете указатель, т. е. вы создаете
SamplingThread
используяSamplingThread *samplingThread = new SamplingThread;
это поможет?
Edit: чтобы проиллюстрировать два случая, очень грубый пример, чтобы показать два случая
#include <iostream>
#include <QApplication>
#include <QThread>
class Dummy
{
public:
Dummy();
void start();
private:
QThread a;
};
Dummy::Dummy() :
a()
{
}
void Dummy::start()
{
a.start();
QThread *b = new QThread;
b->start();
if( a.isRunning() ) {
std::cout << "Thread a is running" << std::endl;
}
if( b->isRunning() ) {
std::cout << "Thread b is running" << std::endl;
}
}
int main(int argc, char** argv)
{
QApplication app(argc,argv);
Dummy d;
d.start();
return app.exec();
}
это основы C++! Вы создаете локальный объект QThread
на стеке не на куче, поэтому он немедленно уничтожается, когда вы покидаете метод MainWindow::start
.
Это должно быть сделано так:
MainWindow::MainWindow( QWidget *parent ):
QMainWindow( parent )
{
...
samplingThread = SamplingThread(this);
samplingThread->setFrequency( frequency() );
run= new QPushButton ("Run",this);
stop= new QPushButton("Stop",this);
connect(run, SIGNAL(clicked()), samplingThread, SLOT(start()));
}
MainWindow::~MainWindow() {
samplingThread->waitFor(5000);
}
есть два разных "потока": один-фактический поток, другой-объект C++, представляющий его (и, чтобы быть правильным, есть еще один поток, из которого этот код запускается в первую очередь).
ошибка просто говорит, что поток все еще работает в точке, где объект C++, представляющий его, уничтожен. В вашем коде причина в том, что экземпляр QThread является локальным для start()
. Возможно,вы хотите сохранить QThread в члене.