Название: GUI-поток + (поток + msleep) - засыпает всё Отправлено: yegoriy от Июня 27, 2012, 18:30 Работаю с потоками недавно и столкнулся с интересным поведением.
Есть класс основного потока: Код: class MainWindow : public QMainWindow и класс второстепенного потока: Код: class MyThread : public QThread Реализация выглядит примерно так: Код: MainWindow::MainWindow(QWidget *parent) : Проблема заключается в следующем: метод msleep в второстепенном потоке вешает основной GUI-поток. Собственно не могу понять из-за чего? Есть мысли по этому поводу? Название: Re: GUI-поток + (поток + msleep) - засыпает всё Отправлено: alexis031182 от Июня 27, 2012, 18:35 Странная реализация. QObject::moveToThread() забыли
Название: Re: GUI-поток + (поток + msleep) - засыпает всё Отправлено: Bepec от Июня 27, 2012, 18:53 Алексис, вы безусловно правы, но внимательнее всмотритесь :D
Класс унаследован от потока, НО метод run не переопределён. Интересно, поток сразу умрёт, или нет? Счас попробую аж :D Название: Re: GUI-поток + (поток + msleep) - засыпает всё Отправлено: alexis031182 от Июня 27, 2012, 18:57 Алексис, вы безусловно правы, но внимательнее всмотритесь :D Да я понял, потому и написал, что странная реализация :)Класс унаследован от потока, НО метод run не переопределён. Интересно, поток сразу умрёт, или нет? Счас попробую аж :D Название: Re: GUI-поток + (поток + msleep) - засыпает всё Отправлено: yegoriy от Июня 27, 2012, 19:06 Метод run ,по докам, можно и не переопределять, он по-умолчанию содержит exec() - запускается цикл обработки событий. Сигнал пришёл - функция работает. В этом же вся прелесть модели сигнал-слот. Выход из потока quit() или exit(). Пример накидывал на коленках по-минимальному содержанию, посему выход и завершение потока не реализованы...
Название: Re: GUI-поток + (поток + msleep) - засыпает всё Отправлено: alexis031182 от Июня 27, 2012, 19:19 Если Вы наследуете QThread, то логично использовать переопределение run(). Если не наследуете, то логично использовать отдельный класс, функционал которого требуется выполнять в отдельном потоке.
Название: Re: GUI-поток + (поток + msleep) - засыпает всё Отправлено: Bepec от Июня 27, 2012, 19:22 Да кстати, вы правы, он по умолчанию запускает цикл :) Это я знал, но не воспринимал :D Благодаря вам знаю.
У вас одна проблема - Ваш слот является лишь обычным методом класса. Чтобы он был в другом потоке, можно сделать 2 вещи: 1) сделать moveToThread(this) в конструкторе вашего класса-потока. (мой выбор.) Тогда нет нужды в 2 классах, но теряется гибкость переноса вашего класса в другой поток (а оно вам надо? :P) 2) создать отдельный класс с этим слотом, далее создать QThreadName и сделать moveToThread(QThreadName). Выбор других людей на этом форуме, например alexis031182. :) Оба способа имеют свои преимущества и недостатки. Но они равноправны :D Название: Re: GUI-поток + (поток + msleep) - засыпает всё Отправлено: Igors от Июня 27, 2012, 19:24 В очередной раз moveToThread. Слот вызывается в главной нитке, ну ее и вешает. Попечатайте currentThreadID в слоте чтобы убедиться
|