![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Есть какая нибудь альтернатива Sleep? [D7, WinXP]
Начинаюший2 © (2005-01-05 12:57:00)Проблема в том что Sleep тормозит выполнение других процесов, а мне нужна пауза между запуском каждой программы. Тоесть моя прога, стартует другую прогу, затем другую и т.д., сколько в списке. Но во врема выполнеия Sleep, происходит торможение загрузки прог. Или может что не так в моём коде, вот код:
procedure TForm1.StartClick(Sender: TObject);
var
APchar:array[0..254] of char;
i:Integer;
begin // Çàïóñêàåò ïðîãðàììû èç ñïèñêà ListView3
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.OpenKey('\Software\StartManager\List\'+ProgList.Text,true) then
begin
for i:=0 to ListView3.Items.Count -1 do
begin
ShellExecute(handle,nil,StrPCopy(APchar,reg.ReadString(ListView3.Items.
Item[i].Caption)),nil,nil,sw_restore);
if ListView3.Items.Item[i].Index=i-i then
Sleep(Up.Position*1000);
end;
end;
end;
GuAV (2005-01-07 17:44:00) [1]Начинаюший2 (07.01.05 17:38) [28]
Сылка уже отсутствует.
Знаю, поэтому привёл код Юрия Зотова
Начинаюший2 (2005-01-07 17:38:00) [2]>GuAV © (07.01.05 17:27) [27]
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1102856803&n=0
Сылка уже отсутствует.
А по поводу кода(идеи), спасибо. В данный момент этот код для меня тёмный лес, но попробую разобраться.
GuAV (2005-01-07 17:27:00) [3]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1102856803&n=0
Юрий Зотов © (12.12.04 22:11) [14]
Вот задержка, которая обрабатывает сообщения и при этом ничего не загружает сверх необходимого для нормальной работы программы.
procedure Delay(MSec: DWORD);
var
T: DWORD;
H: THandle;
begin
T := GetTickCount + MSec;
while (T > GetTickCount) and
(MsgWaitForMultipleObjects(0, H, False, T - GetTickCount, QS_ALLEVENTS or QS_SENDMESSAGE) WAIT_TIMEOUT) do
Application.HandleMessage
end;
Примечание: код набросан "на скорую руку" и показывает лишь идею. В рабочем варианте нужно предусмотреть возможность переполнения при больших GetTickCount и самостоятельное завершение цикла по таймауту при отстутствии сообщений.
Начинаюший2 (2005-01-07 17:24:00) [4]>Anatoly Podgoretsky © (07.01.05 17:04) [25]
Наверно ничего в твоем случае. Поскольку ты спишь Up.Position*1000) времени
Вообщето я уже не использую Sleep, как уже написал выше, сделал с таймером без Sleep. Я имел ввиду, для чего Application.ProcessMessages;нужна.
Anatoly Podgoretsky (2005-01-07 17:04:00) [5]Наверно ничего в твоем случае. Поскольку ты спишь Up.Position*1000) времени
Начинаюший2 (2005-01-07 16:44:00) [6]>Экспериментатор (06.01.05 20:44) [22]
На таймере я уже и сделал.
>Grotesque (07.01.05 04:05) [23]
Не совсе понял, куда эту строку Application.ProcessMessages; вставить, и что она даст.
Grotesque (2005-01-07 04:05:00) [7]Application.ProcessMessages;
Экспериментатор (2005-01-06 20:44:00) [8]Да. Наверно именно таймер тут нужен IMHO
Начинаюший2 (2005-01-06 18:04:00) [9]Уже разобрался, всё работает как надо.
>KSergey © (05.01.05 15:08) [19]
>А по другому разве может быть? Разве что перепоручить работу другому, но тогда придется з/п делиться. Хотя в принципе - вариант.
Вообщето я стараюсь всегда сам разобраться, а потом спашивать, просто я недавно начал изучать дельфяк, а книг пока нет.
Эта тема закрыта.
AlterEgo of WondeRu (2005-01-05 17:23:00) [10]Начинаюший2 (05.01.05 14:46) [14]
Неправилльно, быстрее так:
ОРЕХ! ;)
KSergey (2005-01-05 15:08:00) [11]> [18] Начинаюший2 (05.01.05 15:03)
> Ладно, разберусь сам
А по другому разве может быть? Разве что перепоручить работу другому, но тогда придется з/п делиться. Хотя в принципе - вариант.
Начинаюший2 (2005-01-05 15:03:00) [12]Ладно, разберусь сам, всем спасибо.
KSergey (2005-01-05 15:00:00) [13]> [16] Начинаюший2 (05.01.05 14:57)
> может кой пример или ссылку подкинеш.
Пример чего? Как использовать компонент TTimer - дык справка есть. гугль, опять же... Уж про книжки и не говорю..
Начинаюший2 (2005-01-05 14:57:00) [14]>KSergey © (05.01.05 14:48) [15]
Уже проверил, не то. Нет больше времени шас разбираться, закругляюсь на сёдня, может кой пример или ссылку подкинеш. Вообшемто если не брать больше 3х секунд, то и так пойдёт, только каспер слишком при старте грузит.
KSergey (2005-01-05 14:48:00) [15]> [14] Начинаюший2 (05.01.05 14:46)
Здесь таймер вообще не используется
Начинаюший2 (2005-01-05 14:46:00) [16]Неправилльно, быстрее так:
procedure TForm1.StartClick(Sender: TObject);
var
APchar:array[0..254] of char;
i:Integer;
begin //
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.OpenKey('\Software\StartManager\List\'+ProgList.Text,true) then
Timer.enabled;
Timer.Interval:=Up.Position*1000;
begin
for i:=0 to ListView3.Items.Count -1 do
begin
ShellExecute(handle,nil,StrPCopy(APchar,reg.ReadString(ListView3.Items.
Item[i].Caption)),nil,nil,sw_restore);
end;
end;
Timer.Disbled;
end;
KSergey (2005-01-05 14:45:00) [17]Нет, не то. Я бы сделал так.
По нажатию батона вычитываем список что запускается с задержками (что-то не понял как именно тут сделано, ну да не важно).
Вызываем метод запуска проги номер i.
В этом методе после запуска настраиваем интервал в таймере и стартуем его. Увеличиваем i на 1. Все, выход (из метода).
В OnTimer таймера стопим таймер и вызываем этот метод запуска процесса.
Ну и где-то тут надо конечно проверять выход из этого цикла.
Почитайте про таймер. Sleep никакого не нудно. Ну разве что не плох бы еще Button1 задизаблить, чтобы во время цикла по нему не клацнуть.
Начинаюший2 (2005-01-05 14:39:00) [18]>KSergey © (05.01.05 14:25) [11]
С перерисовкой и задержкой загрузки доп.окон этих прог, пока пропускаем. А на счет привязки к таймеру я уже думал, только не чего не надумал, в смысле как. Типа как ниже:
procedure TForm1.StartClick(Sender: TObject);
var
APchar:array[0..254] of char;
i:Integer;
begin //
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.OpenKey('\Software\StartManager\List\'+ProgList.Text,true) then
Timer.enabled;
begin
for i:=0 to ListView3.Items.Count -1 do
begin
ShellExecute(handle,nil,StrPCopy(APchar,reg.ReadString(ListView3.Items.
Item[i].Caption)),nil,nil,sw_restore);
if ListView3.Items.Item[i].Index=i-i then
Sleep(Up.Position*1000);
end;
end;
Timer.Disbled;
end;
KSergey (2005-01-05 14:25:00) [19]> [10] Начинаюший2 (05.01.05 14:19)
> что дополнительно грузит
> процесор.
Глупость, рано или позно он все равно болжен выполнить работу по отрисовке - какая разница когда? Так что на счет "дополнительно" - ябы не скаал.
А вообще - так это же совсем другой вопрос!
Разумеется, что на момент sleep все останавливается (в смысле этот поток этого процесса). Он собственно для того и нужен.
Выход - иди делать задержку на таймере (здесь, по моему - идеально), или в отдельном потоке, вот только стоит ли овчинка выделки?
Начинаюший2 (2005-01-05 14:19:00) [20]>TUser © (05.01.05 14:04) [8]
>У себя попробовал - все как надо работает. Загружаем одну прогу, ждем, загружаем вторую, ждем и т.д. Что подразумевается под 'торможением загрузки'?
Под этим подразумевается, что прога на некоторое время(время выполнения Sleep) прекрашает загрузку дополнительных модулей, окон, также тормозится динамически изменяемая информация на моей форме, как писал выше не происходит перерисовка окон, если сдвинуть любое окно поверх другого. А при старте следуюшей, догружается всё в месте, что дополнительно грузит процесор.