#subclassing #qthread
#подклассирование #qthread
Вопрос:
Привет, я реализую простое поточное приложение с графическим интерфейсом в QT 4.6.2. Я использую QThread без его подклассов. Я выполнил вызов функции usleep () в моей функции start (), однако это приводит к зависанию графического интерфейса. Как мне обойти это. Ниже приведен код
#ifndef ECGREADER_H
#define ECGREADER_H
#include<QObject>
class ecgreader : public QObject
{
Q_OBJECT
public:
ecgreader(QObject *parent=0);
~ecgreader();
public Q_SLOTS:
void start();
Q_SIGNALS:
void finished();
};
#endif // ECGREADER_H
Ниже приведена функция start()
void ecgreader::start()
{
int i= system("ls>output.txt");
SLEEP(10000);
if(i==0)
{
emit finished();
}
}
наконец, здесь выполняется вызов start
void Application::onbtnclicked()
{
QThread* thread=new QThread;
ecgreader* reader=new ecgreader;
reader->moveToThread(thread);
connect(thread,SIGNAL(started()),reader,SLOT(start()));
connect(reader,SIGNAL(finished()),thread,SLOT(quit()));
connect(reader,SIGNAL(finished()),reader,SLOT(deleteLater()));
connect(reader,SIGNAL(finished()),thread,SLOT(deleteLater()));
reader->start();
}
Пожалуйста, помогите
Ответ №1:
У вас две проблемы: сначала вы создали поток, но вы никогда не запускали его. Во-вторых, вы напрямую вызываете start () на вашем считывателе вместо отправки сигнала.
Я думаю, вы имели в виду вызвать thread-> start () вместо reader-> start():
void Application::onbtnclicked()
{
QThread* thread=new QThread;
ecgreader* reader=new ecgreader;
reader->moveToThread(thread);
connect(thread,SIGNAL(started()),reader,SLOT(start()));
connect(reader,SIGNAL(finished()),thread,SLOT(quit()));
connect(reader,SIGNAL(finished()),reader,SLOT(deleteLater()));
connect(reader,SIGNAL(finished()),thread,SLOT(deleteLater()));
thread->start();
}