Это часть основного.Основная нить не может получить форму сигнала рабочий поток
Этот код создает рабочего и рабочий рабочий.
Рабочий перемещается на рабочий рабочий стол.
Работник затем ждет сигнала, чтобы попросить его работать.
Работник излучает сигнал с результатом при выполнении задания.
Основной предполагается поймать этот сигнал и инициализировать переменную в основном.
main()
{.........
// This is the variable to be changed
variableToGetFromWorker = 0;
qDebug() << "Main thread: " << QThread::currentThreadId();
QThread workerThread;
worker* stupidTom = new stupidTom(number);
worker->moveToThread(&workerThread);
connect(&workerThread, &QThread::finished, &workerThread, &QObject::deleteLater);
connect(&workerThread, SIGNAL(start()), stupidTom, SLOT(doJob()));
connect(stupidTom, SIGNAL(jobDone(int)), this, SLOT(jobDone(int)));
workerThread.start();
workerThread.wait();
...........}
// This is a slot at main. Suppose to catch the signal from the worker
void main::jobDone(int result)
{
qDebug() << "Changing variable";
variableToGetFromWorker = result;
}
Это слот doJob рабочего.
void worker::doJob()
{
qDebug() << "worker::doJob invoked.";
qDebug() << "worker Thread:" << QThread::currentThreadId();
// Doing Job here
emit jobDone(result);
}
Это QDebug результат
Main thread: 0x7ffff7fc6780
worker::doJob invoked.
worker Thread: 0x7fffdab44700
В режиме отладки, я считаю, что программа останавливается на workerThread.wait()
и никогда не идут на main::jobDone(int result)
. Какова причина?
Мало редактирования на основной код:
QThread workerThread;
worker* stupidTom = new stupidTom(number);
worker->moveToThread(&workerThread);
connect(&workerThread, &QThread::finished, &workerThread, &QObject::deleteLater);
connect(&workerThread, SIGNAL(started()), stupidTom, SLOT(doJob()));
connect(stupidTom, SIGNAL(jobDone(int)), this, SLOT(jobDone(int)));
connect(stupidTom, SIGNAL(jobDone(int)), &workerThread, SLOT(quit()));
workerThread.start();
workerThread.wait();
Я не понимаю причину добавления eventloop.Во-первых, я сожалею, что есть опечатка. Я использую именно то, что вы указали: connect (& workerThread, SIGNAL (start()), stupidTom, SLOT (doJob()) ;;. Рабочий объект - это объект, который я создаю только для передачи в поток. – tom
Со ссылкой на статью, которую вы упомянули, я добавляю еще одно соединение: connect (stupidTom, SIGNAL (jobDone (int)), & workerThread, SLOT (quit())); '. Он также должен выйти из потока, когда освобождается 'jobDone()'. Предупреждение о соединении отсутствует. Я знаю, что 'emit jobDone (result);' действительно был выпущен. Но вполне уверен, что 'jobDone()' в main не вызывается, поскольку debug msg не печатается. – tom
jobDone() не может быть вызван, потому что для сигналов кросс-потоков необходим цикл событий в принимающем потоке для запуска. Этот цикл событий также не должен быть заблокирован навсегда, поскольку это вызовет workThread.wait(). –