Спящий вызов в qthread блокирует поток пользовательского интерфейса

#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();
}