Russian Qt Forum
Ноябрь 05, 2024, 22:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: GUI поток и воркер, в котором запущен while(true)-умрут ли слоты?  (Прочитано 16897 раз)
Bepec
Гость
« Ответ #15 : Август 24, 2012, 17:34 »

Твоя реплика только доказывает мою правоту  Смеющийся
Записан
andrew.k
Гость
« Ответ #16 : Август 24, 2012, 17:44 »

PS я в отличие от тебя пробую/получаю результат/отвечаю Подмигивающий А не бросаюсь словами.
Тут и пробовать ничего. Эта "холиварная" тема не стоит и выеденного яйца.
В отличие от тебя я понимаю, что пишу.
В твоем примере слот к сигналу коннектится в режиме AutoConnection.
А т.к. сигнал и слот в одном потоке, то они связываются через DirectConnection.
Таким образов emit sig() в твоем примере просто прямой вызов слота (если тебе это о чем-то говорит).
Для танкиста: этот сигнал не проходит через очередь. Для совсем танкиста можешь заменить emit sig(); на slot(); ничего не изменится!

А вот если сигнал будет отправлен из другого потока, например, из ГУИ, то он никогда в жизни не дойдет до твоего слота в такой реализации!
Либо добавь пятый параметр Qt::QueuedConnection. И сиди осознавай.

Конечно же очевидно, что ты все это понимаешь, и именно это и имел ввиду, а я просто погорячился.  Злой
А по правде, ты очень достал своими бессмысленными и беспощадными изречениями.
Записан
andrew.k
Гость
« Ответ #17 : Август 24, 2012, 17:50 »

Твоя реплика только доказывает мою правоту  Смеющийся
Мне в очередной раз стыдно за тебя, Джедай Верес.
Записан
Bepec
Гость
« Ответ #18 : Август 24, 2012, 17:51 »

Кхм. andrew.k включи логику. Зачем я приводил по твоему в первый раз кусок кода без сигнала? Затем, что сигнал, который вызывает приведённый слот подключен к кнопке на главной форме. И при нажатии кнопки (О чудо) происходит вызов слота Веселый

Да, согласен, чуть неясно получилось - слот недокопировал.

PS ПОПРОБУЙ а потом говори, благодетель самаритянский Веселый

« Последнее редактирование: Август 24, 2012, 18:02 от Bepec » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Август 24, 2012, 17:58 »

Если я буду запускать QAplication::processEvents() в том цикле, то всякие разные отрисовки, перерисовки, движения мышки могут достаточно ощутимо затормозить
Он возьмет EventLoop той нитки из которой вызван, соответственно только посланные ей события (сигналы) будут извлекаться. Надо только сделать exec(). Ваш вариант вполне возможен, просто ничего не выигрывает по сравнению с обычным
Записан
andrew.k
Гость
« Ответ #20 : Август 24, 2012, 18:06 »

Если я буду запускать QAplication::processEvents() в том цикле, то всякие разные отрисовки, перерисовки, движения мышки могут достаточно ощутимо затормозить
Он возьмет EventLoop той нитки из которой вызван, соответственно только посланные ей события (сигналы) будут извлекаться. Надо только сделать exec(). Ваш вариант вполне возможен, просто ничего не выигрывает по сравнению с обычным
постоянный вызов processEvents() будет зря жрать процессороное время.
Записан
Bepec
Гость
« Ответ #21 : Август 24, 2012, 18:11 »

Извиняюсь, был неправ Веселый

Всего то забыл moveToThread сделать Веселый

По теме: а что мешает запустить еxec, и потом зациклить вызов функции whileBlaBlaBla() с помощью допустим таймера?

Вроде же получится обычный цикл в потоке и поток будет принимать внешние сигналы, ннэ?
Записан
crashtua
Гость
« Ответ #22 : Август 24, 2012, 18:15 »

Возможно, я не до конца описал проблему, все слоты должны запускаться в потоке-воркере. Теперь, несколько замечаний к Верес:
И там докопались вроде(давно было ), что start() вызывает exec, если переопределён run().
Какими же средствами с++ можно узнать, переопределялся ли метод?(конечно, можно сделать типа bool isRedefined = true,и стандартной реализации выставить в фолс, но Qt писался грамотными людьми, и такого быдлокода там нету:))
Код:
	void run()
{
while (true)
{
Sleep(10);
}
};
Опять же, наверно потому что я не уточнил, что слоты должны выполнятся в воркере... Что бы такое условие выполнилось, мы должны объект с нашим слотом переместить в воркер(в моем случае это он сам). Переместим: worker.moveToThread(&worker);. Запускаем, а слоты не работают, о ужас Грустный. А вот так
Код
C++ (Qt)
   while(true){
       sleep(0.01);
       loop.processEvents();
   }
 
слоты работают. Если надо, могу скинуть пример, который полностью обрисовывает ситуацию.
там правда немного быдлокода, связано с тем, что потоки не успевают запуститься к тому моменту как я пробую емитить сигнал
Записан
crashtua
Гость
« Ответ #23 : Август 24, 2012, 18:17 »

Извиняюсь, был неправ Веселый
Всего то забыл moveToThread сделать Веселый
Пока писал ответ, и проверал на примере, Вы сами муванули его Улыбающийся
Записан
andrew.k
Гость
« Ответ #24 : Август 24, 2012, 18:18 »

Извиняюсь, был неправ Веселый

Всего то забыл moveToThread сделать Веселый
Не в этом дело, а в том, что ты свой пример даже не запускал.

По теме: а что мешает запустить еxec, и потом зациклить вызов функции whileBlaBlaBla() с помощью допустим таймера?

Вроде же получится обычный цикл в потоке и поток будет принимать внешние сигналы, ннэ?
Редкий случай, когда Верес говорит, что-то дельное, поэтому переведу на человечий.
Нужно то, что ты делаешь внутри своего while(true) разбить на подзадачи и выполнять каждый шаг по сигналу.
Получил сигнал (от таймера или от того, кто тебе данные на обработку дает - обработал, дальше ждешь, получил - обработал).
Но это если эти сигналы действительно нужны.
Записан
Bepec
Гость
« Ответ #25 : Август 24, 2012, 18:21 »

Мой пример потому и запускался, что работал в 1 потоке Подмигивающий
Записан
crashtua
Гость
« Ответ #26 : Август 24, 2012, 18:30 »

Редкий случай, когда Верес говорит, что-то дельное, поэтому переведу на человечий.
Нужно то, что ты делаешь внутри своего while(true) разбить на подзадачи и выполнять каждый шаг по сигналу.
Получил сигнал (от таймера или от того, кто тебе данные на обработку дает - обработал, дальше ждешь, получил - обработал).
Но это если эти сигналы действительно нужны.
Та там столько действий в том цикле, что мне страшно даже трогать, не хочу поломать (программа не моя). А на то что processEvents() будет жрать процессорное время ээээ... Хотел заикнутся что не будет, потому что в exec() QEventLoop'а тоже в цикле вызывается processEvents(), но увидел в исходниках, что processEvents() в  QEventLoop'е при отсутствии евентов их ожидает... А вариант с таймером почти подходит, но там сокеты... Хотелось бы моментального отклика, а не по таймеру...
Записан
Bepec
Гость
« Ответ #27 : Август 24, 2012, 18:33 »

Эмм... Таймер ставишь в 0 - получаешь такой же while(true) с работающими слотами Улыбающийся
Записан
andrew.k
Гость
« Ответ #28 : Август 24, 2012, 18:37 »

Мой пример потому и запускался, что работал в 1 потоке Подмигивающий
Ты свой пример даже не запуска ни разу, скопировал у какого-то дурака и размножаешь.
Во вложении пример, который я написал.
Вот и расскажи мне как же так в твоем примере сигналы успешно работают, а в моем нет?
Что я делаю не так?
Записан
andrew.k
Гость
« Ответ #29 : Август 24, 2012, 18:40 »

Редкий случай, когда Верес говорит, что-то дельное, поэтому переведу на человечий.
Нужно то, что ты делаешь внутри своего while(true) разбить на подзадачи и выполнять каждый шаг по сигналу.
Получил сигнал (от таймера или от того, кто тебе данные на обработку дает - обработал, дальше ждешь, получил - обработал).
Но это если эти сигналы действительно нужны.
Та там столько действий в том цикле, что мне страшно даже трогать, не хочу поломать (программа не моя). А на то что processEvents() будет жрать процессорное время ээээ... Хотел заикнутся что не будет, потому что в exec() QEventLoop'а тоже в цикле вызывается processEvents(), но увидел в исходниках, что processEvents() в  QEventLoop'е при отсутствии евентов их ожидает...
Молодец. Жаль что не все так делают, а сначала понапишут непонятно чего, а потом думают, да примерчики запускают)
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.151 секунд. Запросов: 20.