|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Альтернатива Sleep
Необходимо следующее: в процедуре программа должна простаивать (просто в этой процедуре дальше по коду не проходить) рандомное кол-во времени. Делаю это с помощью sleep, но в этом случае вся программа перестает отвечать на запросы (в том числе и нужные процедуры). Есть ли какая-то хорошая альтернатива sleep? Заранее благодарен
|
#2
|
|||
|
|||
взято из Delphi World:
Код:
procedure Delay(dwMilliseconds: Longint); var iStart, iStop: DWORD; begin iStart := GetTickCount; repeat iStop := GetTickCount; Application.ProcessMessages; until (iStop - iStart) >= dwMilliseconds; end; взялся из неоткуда, ничего не прошу, помогаю просто так ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя |
#3
|
||||
|
||||
без использования VCL:
Код:
uses Windows; procedure Sleep(dwMilliseconds: DWORD); var SaveTickCount: Cardinal; Msg: TMsg; begin SaveTickCount:=GetTickCount; repeat if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin TranslateMessage(Msg); DispatchMessage(Msg); end; until GetTickCount-SaveTickCount>=dwMilliseconds; end; Пишу программы за еду. __________________ |
#4
|
|||
|
|||
странно, попробовал оба варианта, но оба они работают так же, как и обычный слип (то есть во время их работы должны перехватываться нажатия клавиш, но этого не происходит). Программа не "висит", но и FormKeyPress не выполняется.
Может, проще описать проблему таким образом: нужно на некоторое время остановить выполнение процедуры, но так, чтобы все остальные процедуры работали |
#5
|
||||
|
||||
я ожидал этого. потому что обе функции работают в одном потоке. решение - разделить:
Код:
type TMyThread = class(TThread) protected procedure Execute; override; end; Пишу программы за еду. __________________ |
#6
|
|||
|
|||
В отдельный поток стоит вытащить весь таймер или процедуру задержки? Будет ли работать остановка процедуры таймера в этом случае?
|
#7
|
||||
|
||||
Цитата:
Цитата:
Пишу программы за еду. __________________ |
#8
|
|||
|
|||
В том то и вопрос. Даже с Application.ProcessMessages; программа не реагирует на нажатие кнопок в момент задержки.
Про таймер: необходима задержка в процедуре таймера В ней очень много vcl-компонентов задействовано, и если всю процедуру таймера выносить в поток, то придется каждое действие почти синхронизировать |
#9
|
|||
|
|||
Цитата:
В процедуре OnTimer таймер останавливается и вызывается процедура (номер этапа глобальный или передаётся через параметр): Код:
var Step: Integer = 0; procedure TForm1.Proc1; begin case Step of 0: begin //... Timer1.Interval:= Random(10000); Timer1.Enabled:= true; Inc(Step); Exit; end; 1: //... end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Enabled:= false; Proc1; end; Последний раз редактировалось AlexSku, 02.05.2011 в 17:33. |
#10
|
||||
|
||||
при нажатии на кнопку запускаем бесконечный цикл:
Код:
procedure Sleep(dwMilliseconds: DWORD); var SaveTickCount: Cardinal; Msg: TMsg; begin SaveTickCount:=GetTickCount; repeat if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin TranslateMessage(Msg); DispatchMessage(Msg); end; until GetTickCount-SaveTickCount>=dwMilliseconds; end; procedure TForm1.Button1Click(Sender: TObject); begin Tag:=0; while Tag>=0 do begin Label1.Caption:=IntToStr(Tag); Tag:=Tag+1; Sleep(100); end; end; при нажатии любой клавиши цикл останавливается: Код:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin Tag:=-1; end; скачать целиком: http://data.cod.ru/99641 Пишу программы за еду. __________________ |