Russian Qt Forum
Марта 11, 2025, 08:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Пауза (задержка) на QT 4.1.0  (Прочитано 42403 раз)
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

Сообщений: 5877


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


Просмотр профиля 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.228 секунд. Запросов: 23.