![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Необходимо следующее: в процедуре программа должна простаивать (просто в этой процедуре дальше по коду не проходить) рандомное кол-во времени. Делаю это с помощью 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; |
|
#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 |