Подтвердить что ты не робот

Резьба qt с движением

Я пытаюсь создать программу с помощью потоков: основное начало с петли. Когда тест возвращает true, я создаю объект, и я хочу, чтобы этот объект работал в другом потоке затем верните и запустите тест.

QCoreApplication a(argc, argv);
while(true){
    Cmd cmd;
    cmd =db->select(cmd);
    if(cmd.isNull()){ 
        sleep(2);  
        continue ;
    }
    QThread *thread = new QThread( );
    process *class= new process ();
    class->moveToThread(thread);
    thread->start();

    qDebug() << " msg"; // this doesn't run until  class finish it work 
}
return a.exec();

проблема заключается в том, когда я запускаю новый поток, основной поток останавливается и ждет завершения нового потока.

4b9b3361

Ответ 1

Канонический способ Qt будет выглядеть так:

 QThread* thread = new QThread( );
 Task* task = new Task();

 // move the task object to the thread BEFORE connecting any signal/slots
 task->moveToThread(thread);

 connect(thread, SIGNAL(started()), task, SLOT(doWork()));
 connect(task, SIGNAL(workFinished()), thread, SLOT(quit()));

 // automatically delete thread and task object when work is done:
 connect(task, SIGNAL(workFinished()), task, SLOT(deleteLater()));
 connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));

 thread->start();

в случае, если вы не знакомы с сигналами/слотами, класс Task будет выглядеть примерно так:

class Task : public QObject
{
Q_OBJECT
public:
    Task();
    ~Task();
public slots:
    // doWork must emit workFinished when it is done.
    void doWork();
signals:
    void workFinished();
};

Ответ 2

Я не знаю, как вы структурировали свой класс процессов, но на самом деле это не так, как moveToThread. Функция moveToThread сообщает QT, что любые слоты должны выполняться в новом потоке, а не в потоке, из которого они были переданы. (edit: На самом деле, теперь я помню, что он по умолчанию указывает на протекцию, в которой был создан объект)

Кроме того, если вы выполняете работу в своем классе процесса из конструктора, он также не будет запускаться в новом потоке.

Самый простой способ, чтобы ваш класс процесса выполнял в новом потоке, - это получить его из QThread и переопределить метод run. Тогда вам не нужно вообще переводить на нить.