Название: QThread Отправлено: Firefox от Июнь 26, 2013, 09:35 Здравствуйте подскажите по такому вопросу: создаю отдельный класс, пытаюсь его запустить в новом потоке. В методе run() стартую таймер. Но когда по сигналу из основного потока пытаюсь сменить интервал таймера, то выдает ошибку, что не возможно убить и стартовать объект из другого потока. как правильно обратиться к объекту таймера в потоке уже созданном, чтоб это было корректно?и правильно ли поток запускается, а то при старте тоже пишет ошибку?
//Класс потока Код: //.h Код: //.h Ввыводе приложения в QtCreator пишет следующие ошибки(фиолетовым): при старте процесса: QObject: Cannot create children for a parent that is in a different thread. (Parent is CalkRastr(0xc5b0048), parent's thread is QThread(0xab27130), current thread is CalkRastr(0xc5b0048) при смене интервала таймера: QObject::killTimer: timers cannot be stopped from another thread QObject::startTimer: timers cannot be started from another thread Название: Re: QThread Отправлено: Bepec от Июнь 26, 2013, 09:43 Или используй "moveToThread(this)" в конструкторе потока, или же кидай moveToThread при создании в самого себя.
Создавать и убивать в другом потоке нельзя. Зато можно вызвать слот и тогда он будет радостно исполняться в своём потоке (если конечно тип соединения - очередь). Название: Re: QThread Отправлено: Firefox от Июнь 26, 2013, 09:47 если я поставлю moveToThread(this) в конструкторе класса, то разве не создастся новый поток при вызове start()? И немного не понятно, я же вызываю слот из класса потока CalkRastr, почему это другой поток получается?
Название: Re: QThread Отправлено: demaker от Июнь 26, 2013, 16:47 Вы создаете объект потока CalkRastr в основном потоке.
А QTimer вы создаете уже в другом по токе. Попробуйте так Выслать сигнал из основного потока и привязать его к слоту объекта потока CalkRastr. А из слота объекта потока CalkRastr выслать сигнал для смены интервала таймера(или наоборот, как хотите). Должно помочь. Потом Код
иначе Ваш таймер будет дочерним от CalkRastr, а он создан в основном потоке. Название: Re: QThread Отправлено: Igors от Июнь 26, 2013, 17:13 если я поставлю moveToThread(this) в конструкторе класса, то разве не создастся новый поток при вызове start()? Создастся и так и так. Осуждаемое moveToThread(this) просто говорит в каком потоке объект должен принимать сигналы/события (какой eventLoop)Название: Re: QThread Отправлено: Bepec от Июнь 26, 2013, 17:27 Уточняю свою реплику - при moveToThread(this) все объекты класса,наследованного от QThread будут созданы в его потоке. В ином случае все создаваемые объекты в иных методах, кроме как run будут созданы в потоке родителя вашего унаследованного класса.
Как то так. Название: Re: QThread Отправлено: Firefox от Июнь 27, 2013, 09:33 Спасибо большое всем за советы.все заработало и в голове немного прояснилось. :)
|