Резьба 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();
проблема заключается в том, когда я запускаю новый поток, основной поток останавливается и ждет завершения нового потока.
Ответы
Ответ 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. Тогда вам не нужно вообще переводить на нить.