У меня есть несколько очень трудоемких задач для выполнения в приложении с графическим интерфейсом, и я хочу, чтобы они были многопоточными, чтобы он не зависал в моем графическом интерфейсе.
Для этого я создал тему и запустил таймер. Я подключил метод timeout() из моего таймера к функции, отнимающей время, которую я хочу распараллелить, в методе «запуска» моего потока, но когда вызывается сигнал, вместо этого в основном потоке вызывается функция, отнимающая время. того, что я создал.
Вот мой код, упрощенный для примера:
void MyThread::run()
{
m_pTimer = new QTimer()
connect(m_pTimer, SIGNAL(timeout()), this, SLOT(timeConsumingMethod()));
m_pTimer->start(x);
}
Я напечатал значение статического метода QThread::currentThread() в "timeConsumingMethod", в MyThread::run() и в моем основном, и его значение такое же, как и в моем основном.
Как я могу запустить свою функцию в отдельном потоке? И что еще более важно, почему мой код неверен?
Qt::Autoconnection
, а QThreadthis
имеет сходство потока с основным потоком (у него никогда нет сходства потока с потоком, которым он управляет), поэтому сигнал ставится в очередь, а слот вызывается основным потоком. цикл событий потока. Таким образом, решение действительно состоит в том, чтобы переместитьtimeConsumingMethod()
в другоеQObject
и создать экземпляр с тем же сходством потоков, что и таймер. - person hyde   schedule 04.03.2014