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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Пауза (задержка) на QT 4.1.0  (Прочитано 41818 раз)
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #15 : Март 01, 2011, 18:09 »

Цитировать
иначе слипнется тред вызывающего, неужели неясно

Именно это и нужно.

Хотя, конечно, ясно почему: тролли хотят чтобы все писали на кьют асинхронные аппликухи, поэтому просто нагнули. Но могли бы и предоставить публично методы sleep.
Записан

Гугль в помощь
Akon
Гость
« Ответ #16 : Март 01, 2011, 20:02 »

Тоже не поддерживаю закрытость sleep(). Вполне было бы типично
QThread::currentThread()::sleep(n);

Пабликом Морозовым вытягиваем sleep-ы, как показал navrocky, и получаем кроссплатформенную функцию.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #17 : Март 01, 2011, 20:12 »

если вам надо паузить мейн тред, то у вас руки из ж. гуй у вас как работать будет?
Записан
erinyes
Гость
« Ответ #18 : Март 01, 2011, 20:23 »

если вам надо паузить мейн тред, то у вас руки из ж. гуй у вас как работать будет?

Да никто про мейн не говорит. Я же задачу более менее подробно описал. Если есть более правильное решение - я буду рад услышать, поскольку как применять цикл обработки сообщений внутри потока пока не совсем въехал.

И, кстати, я не совсем понял почему не работает QThread::сurrentThread()->wait(msec); Предположение я высказал про не вызов в потоке exec(), оно правильное? В документации я такого не видел вроде. Написано - либо выход из run() и true, либо таймаут и false. Про необходимость exec'а не сказано.
Записан
BRE
Гость
« Ответ #19 : Март 01, 2011, 20:29 »

Может быть помог бы sleep(), но он protected.
Ну и что что он protected?
Ты наследуешь свой поток от QThread и можешь спокойно пользоваться protected-методами.
Т.е. внутри своих потоков - пользуйся sleep, внутри главного - нет. Ну это и правильно (кстати тему эту уже столько раз мусолили...)
Записан
erinyes
Гость
« Ответ #20 : Март 01, 2011, 21:06 »

Ты наследуешь свой поток от QThread и можешь спокойно пользоваться protected-методами.
Т.е. внутри своих потоков - пользуйся sleep, внутри главного - нет. Ну это и правильно (кстати тему эту уже столько раз мусолили...)

У меня не совсем так. Внутри потока, создается объекта класса интерпретатор, который должен уметь делать паузу в выполнении кода. Он про потоки ничего вроде как не знает (ну или самый минимум).

В целом, меня полностью устроило решение Пантер'а.
« Последнее редактирование: Март 01, 2011, 21:14 от erinyes » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Март 01, 2011, 21:10 »

Код
C++ (Qt)
#define private public
 
Во. и так можно! И это, значит, "не хак"? То есть по книжке одно (концептуальность, чистота рядов и.т.п.) - а по жизни совсем другое?  Улыбающийся

« Последнее редактирование: Март 01, 2011, 22:00 от Пантер » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #22 : Март 01, 2011, 22:00 »

Это грязный хак - нарушение инкапсуляции, которая есть основа ООП.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #23 : Март 01, 2011, 22:15 »

У меня не совсем так. Внутри потока, создается объекта класса интерпретатор, который должен уметь делать паузу в выполнении кода. Он про потоки ничего вроде как не знает (ну или самый минимум).

Ну пусть тогда интерпретатор даст знать потоку когда ему уснуть. Зачем городить всякого рода костыли типа

Цитировать
#define private public
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Март 01, 2011, 22:32 »

Рано или поздно выяснится что нужна "нормальная синхронизация", а не "пауза" (затычка для отладки)
Записан
erinyes
Гость
« Ответ #25 : Март 01, 2011, 22:47 »

...
Ну пусть тогда интерпретатор даст знать потоку когда ему уснуть. Зачем городить всякого рода костыли типа

Да, это вариант, но я не наследовал интерпретатор от QObject. Возможно, я не прав, но я посчитал, что это лишнее, так что сигналов и слотов мой класс не имеет.
Цитировать
#define private public
Я не делал и делать не собираюсь - это жестокий изврат. И лезть к protected методам не собираюсь. Меня вполне удовлетворило решение на API для двух операционок. Хотя я надеялся, что есть простой вариант с помощью Qt средств. Вероятно, можно и нужно лучше использовать поток, чем просто перегружать run().

Рано или поздно выяснится что нужна "нормальная синхронизация", а не "пауза" (затычка для отладки)
Igors, это не для синхронизации нужно - либо ты невнимательно читал, либо я плохо объясняю(понимаю). В любом случае, мне интересны предложения как лучше подобную вещь организовывать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Март 01, 2011, 23:10 »

Igors, это не для синхронизации нужно - либо ты невнимательно читал, либо я плохо объясняю(понимаю). В любом случае, мне интересны предложения как лучше подобную вещь организовывать.
А нужна ли та вещь чтобы ее организовывать? Ладно, пусть скорость в Вашей задаче не нужна - можно прождать неск. секунд (вагон времени, хотя данные могут уже быть давно готовы). А что остальные нитки - тоже ждут или как? Это приемлемо если напр. какая-то нитка занята только высасыванием данных из сокета  (и то не всегда)
Записан
erinyes
Гость
« Ответ #27 : Март 01, 2011, 23:45 »

... Ладно, пусть скорость в Вашей задаче не нужна - можно прождать неск. секунд (вагон времени, хотя данные могут уже быть давно готовы)....
Данные или синхронизация тут вообще не причем, просто нужна пауза до интерпретации следующего кода.
« Последнее редактирование: Март 01, 2011, 23:49 от erinyes » Записан
Akon
Гость
« Ответ #28 : Март 02, 2011, 09:38 »

Цитировать
И, кстати, я не совсем понял почему не работает QThread::сurrentThread()->wait(msec);

Данная функция предназначена для синхронизации, а не для задержки. Она вызывается из другого потока, а не из данного.

Когда поток заканчивает выполнение, т.е. происходит выход из run() (более точно - заканчивает выполнение системная функция потока), то освобождается соответствующий объект ядра операционной системы - на него и реагирует wait(). Как частный случай, если в потоке крутится цикл обработки сообщений, то он прерывается по exec() и далее происходит выход из run().
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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