Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C++ Builder > Sleep() - жуткий тормозило |
Автор: Notreg 31.8.2008, 21:06 |
вывожу в статус бар потом пишу Sleep и в статус бар выводиться только после слипа, а надо до, после задержки. т. е. StatusBar1->Panels->Items[0]->Text = "Вывод текста"; Sleep(1000); не катит так как слип срабатывает раньше . |
Автор: Alca 31.8.2008, 21:46 | ||
|
Автор: Lazin 1.9.2008, 08:04 |
использовать ф-ю Sleep в основном потоке GUI приложения неправильно, правильно использовать таймеры |
Автор: mrbrooks 1.9.2008, 08:12 |
Это точно. Для этих целей предусмотрен хотя бы тот же Timer. |
Автор: orthrus 1.9.2008, 08:21 | ||
А если сделать так:
то обновление статусбара произойдет до задержки |
Автор: Alca 1.9.2008, 09:39 | ||
|
Автор: Lazin 1.9.2008, 11:44 | ||||
ну а чем это отличается от Sleep? Добавлено через 32 секунды и зачем создавать именованый объект? Добавлено через 1 минуту и 57 секунд в Builder-е есть удобные врапперы - TEvent и TTimer Добавлено через 4 минуты и 43 секунды проблема кода Alca, в том, что поток не сможет обрабатывать сообщения в течении секунды, для создания задержек для всяких gui эффектов, нужно использовать TTimer, который то-же использует сообщения windows |
Автор: Notreg 1.9.2008, 19:10 |
ну допустим напишу я в таймере код, в нужный момен разрешу выполнение таймера, код выполнится - завершу таймер, а далше как вернуться в место откуда я таймер запускал? или предполагалось какое-то другое решение? |
Автор: Lazin 1.9.2008, 20:46 |
а что ты хотел сделать? |
Автор: Notreg 2.9.2008, 19:40 | ||
Задержку=) В цикле после каждой итерации. |
Автор: Notreg 2.9.2008, 20:04 |
вот именно, это сомнительная задержка основной код будет продолжаться - это таймер собственно. |
Автор: mes 3.9.2008, 15:02 | ||
Так зачем тебе тормозить основной поток ? Пусть идет себе дальше. А то действие которое планировалось с задержками, просто вызывать через промежутки, равные той задержки. Как говорится и волки целы, и овцы сыты )) |
Автор: Notreg 3.9.2008, 19:38 | ||
Бред! Никакое действие мну не надо вызывать через промежутки времени, с чего ты это взял? Мне надо остановить код чтоб пользователь смог рассмотреть то что ему вывелось в статус баре, и потом продолжить ибо дальше уже выводится другая надпись. Просто выше люди писали что в качестве задержки надо использовать таймер, не знаю что они имели виду, но походу не то что делает Sleep(). |
Автор: mes 3.9.2008, 19:43 | ||
Учитесь нормально изъясняться и уважать остальных участников форума, в противном случае я сомневаюсь, что будут желающие Вам помочь.
Можно седалать очередь и сбрасывать в нее все сообщения для статус бара. А по таймеру брать их оттуда и отображать на статус баре И прога тормозить не будет и сообщения будут видны пользователю нелкоторое время. Если подобное не подходит, то тогда необходимо ясное описание задачи , может кто нибудь и предложит хороший вариант. ![]() Выше уже сообщали, что тормозить основной поток нежелательно. А в таком случае надо или создавать свой поток , либо использовать таймер. |
Автор: Lazin 3.9.2008, 19:51 |
блин, неужели такая огромная проблема обновлять статус бар по таймеру... ![]() если не устраивает, делай в цикле Sleep(n) а затем Application->ProcessMessages(); но это уже быдлокод... вообще прочитай документацию по этой функции, а затем по сообщениям windows, в gui потоке, обработчики сообщений должны выполняться, а все что работает дольше чем пол секунды нужно выносить в другой поток, иначе интрфейс будет дерганый и неуклюжий... |
Автор: Notreg 3.9.2008, 20:38 | ||
Ага, тока мне не требуется ничего обновлять, у меня выполняется цикл и происходит задержка - 1сек. перед каждой итерацией дабы пользователь прикинул что произошло и возможно почитал статус бар, но там ничего не появляется потому как Sleep().. З. Ы: буду рефакторить другим боком. |
Автор: mes 3.9.2008, 23:20 | ||
То что у тебя внутри цикла и вынеси в отдельную процедуру, вызываемую по таймеру и будет тебе счастие )) |
Автор: Notreg 4.9.2008, 20:02 |
ну да логично, спс +1 |