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

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

Страниц: [1] 2 3 ... 5   Вниз
  Печать  
Автор Тема: Как "усыпить" текущий поток?  (Прочитано 37001 раз)
spectre71
Гость
« : Июль 07, 2009, 10:09 »

QThread::sleep(unsigned long);
QThread::msleep(unsigned long);
QThread::usleep(unsigned long);

Все эти методы protected ! Непонятно нафига и что с этим делать.

Решение из FAQ не приемлемо!

Записан
p222
Гость
« Ответ #1 : Июль 07, 2009, 10:14 »

Код
C++ (Qt)
class Helper: public QThread {
public:
   static void msleep(int ms)
   {
       QThread::msleep(ms);
   }
};
.....
Helper::msleep(5);

Сам нашел вчера в интернете :-)
« Последнее редактирование: Июль 07, 2009, 10:18 от pastor » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Июль 07, 2009, 10:19 »

Решение из FAQ не приемлемо!

Чем?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
spectre71
Гость
« Ответ #3 : Июль 07, 2009, 10:40 »

Решение из FAQ не приемлемо!

Чем?

#ifdef Q_WS_WIN
   Sleep( milliseconds );
#endif

Хотя бы тем, что вызов Sleep() под Q_WS_WIN требует подключения "Windows.h".

Записан
spectre71
Гость
« Ответ #4 : Июль 07, 2009, 11:01 »

Сам нашел вчера в интернете :-)

Спасибо, работает.

Но вопрос еще открыт, почему эти методы сделаны "protected" ?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Июль 07, 2009, 11:29 »

видимо вне контекста QThread они могут некорректно работать...
Записан
spectre71
Гость
« Ответ #6 : Июль 07, 2009, 11:54 »

видимо вне контекста QThread они могут некорректно работать...

Не похоже. Код для Windows

Код
C++ (Qt)
void QThread::sleep(unsigned long secs)
{
   ::Sleep(secs * 1000);
}
 
void QThread::msleep(unsigned long msecs)
{
   ::Sleep(msecs);
}
 
void QThread::usleep(unsigned long usecs)
{
   ::Sleep((usecs / 1000) + 1);
}

Кто-нибудь может написать троллям, чтобы перенесли методы в public?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Июль 07, 2009, 12:08 »

для юникс там небось sleep, тоже багов с ним нету, да, надо бы попросить...
Записан
BRE
Гость
« Ответ #8 : Июль 07, 2009, 13:57 »

Системный вызов sleep усыпляет ту нить, в контексте которой делается вызов.
Предполагается, что вызывать QThread::sleep будут из метода QThread::run(), а из него данные методы будут доступны (т.к. protected).
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Июль 07, 2009, 14:08 »

ну так мы и пытаемся усыпить контекст ТЕКУЩЕЙ нити (main)
Записан
BRE
Гость
« Ответ #10 : Июль 07, 2009, 14:34 »

ну так мы и пытаемся усыпить контекст ТЕКУЩЕЙ нити (main)
Тогда решение предложенное р222 будет нормально работать на всех поддерживаемых платформах.   Улыбающийся
Просто усыпление главной нити не самое типичное действо.  Подмигивающий
Записан
ритт
Гость
« Ответ #11 : Июль 07, 2009, 18:10 »

а, собсна, зачем блокировать главный поток?
Записан
spectre71
Гость
« Ответ #12 : Июль 08, 2009, 08:43 »

а, собсна, зачем блокировать главный поток?
Усыплять, а  не блокировать. Ситуаций может быть много, в основном их можно обойти, но часто проще сделать через sleep.
У меня, например, в двух случаях
1) Короткие 50 - 200 msecs, при выводе информации в splash-окно во время загрузки приложения, чтобы не было мелькания.
2) При доступе к ресурсу, например открытие файла. При интенсивной работе с файловой системой (под Windows), попытка открыть файл может провалиться и требуются несколько попыток с нарастающей задержкой.

Еще возможно для счетной задачи(программы), по циклу(длительному, но с быстро исполняемой итерацией), если хочется чтобы не была 100% загрузка CPU.
Записан
ритт
Гость
« Ответ #13 : Июль 08, 2009, 09:10 »

а, собсна, зачем блокировать главный поток?
Усыплять, а  не блокировать.
а усыпление поток не заблокирует, ага?

sleep в основном потоке может быть полезен *исключительно* в однопоточном приложении; для всех остальных случаев есть таймер и система событий.
Записан
BRE
Гость
« Ответ #14 : Июль 08, 2009, 09:37 »

sleep в основном потоке может быть полезен *исключительно* в однопоточном приложении; для всех остальных случаев есть таймер и система событий.
Я тоже пока придумал только одно применение - приложение является демоном. В остальных случаях тормозить основной поток как-то странно.
Записан
Страниц: [1] 2 3 ... 5   Вверх
  Печать  
 
Перейти в:  


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