QObject :: startTimer: таймеры не могут быть запущены из-за ошибки другого потока - PullRequest
0 голосов
/ 01 июня 2018

Я получаю QObject :: startTimer: Таймеры не могут быть запущены из другого потока из этого фрагмента, и это блокирует мое приложение и блокирует пользовательский интерфейс.Я новичок в многопоточности в QT.

   void ReportModel::myslot(){
        moveToThread(&thread);
        connect(&thread, SIGNAL(started()), this, SLOT(exportProg()));
        thread.start();
    }

в exportProg () Я делаю CSV-файл в Pendrive.

1 Ответ

0 голосов
/ 01 июня 2018

Учитывая, что ReportModel, скорее всего, класс, используемый из потока GUI, это не будет работать и является плохой идеей.this->moveToThread(...) обычно является неприятным запахом кода, если вы точно не знаете, что делаете.

Почему вы перемещаете модель в поток в слоте?Разве это не должно быть в потоке с самого начала?Почему вы подключаете слоты к сигналу started?Идиома для передачи задания в цикл событий текущего потока объекта может быть QTimer::singleShot(0, ...) или QMetaObject::invoke, и это работает без какой-либо зависимости от потока, начинающегося в этот самый момент.Скорее всего, exportProg должен быть потокобезопасным методом, который можно передать для асинхронного выполнения через QtConcurrent::run.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...