Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];

Вниз

Есть какая нибудь альтернатива Sleep?   Найти похожие ветки 

 
Начинаюший2   (2005-01-05 12:57) [0]

Проблема в том что 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;


 
KSergey ©   (2005-01-05 13:05) [1]

>      if ListView3.Items.Item[i].Index=i-i then

Это юмор такой??
А по существу - странно это... По идее на запуск других прог влиять не должно (хотя может я что не знаю?). Может это ошибочный вывод? На чем он основан?


 
TUser ©   (2005-01-05 13:14) [2]

Боюсь облажаться - но это никак не связано с тем, что есть parent-процесс. Я обычно там 0 пишу.


 
Начинаюший2   (2005-01-05 13:14) [3]

>KSergey ©   (05.01.05 13:05) [1]
>Это юмор такой??
А по существу - странно это... По идее на запуск других прог влиять не должно (хотя может я что не знаю?). Может это ошибочный вывод? На чем он основан?


Нет здесь не какого юмора, если я ставлю больше 3х секунд, то происходит торможение, вторичные формы висят до загрузки следуюшей проги, а если переташить какую форму, остаются следы.


 
KSergey ©   (2005-01-05 13:25) [4]

> [3] Начинаюший2   (05.01.05 13:14)
> Нет здесь не какого юмора

А в подчеркнутом? Или это я для себя подчеркивал?
А вот по поводу указания парент-процесса - возможно TUser прав...


 
Начинаюший2   (2005-01-05 13:40) [5]

>KSergey ©   (05.01.05 13:25) [4]
>А в подчеркнутом? Или это я для себя подчеркивал?


Про подчёркнутое я забыл, это чтоб после последней проги Sleep не выполнялся, а то моя форма тоже не перерисовывается в течении этого времени.

>А вот по поводу указания парент-процесса - возможно TUser прав...

Про подсказу TUser я прочёл когда ответил на твой ответ, щас попробую.


 
Начинаюший2   (2005-01-05 13:47) [6]

Не, проверил, как и было, тормозит и не стесняется. Я тут подумал, может запускать как из отдельного потока, вот только я с этим ешо не занимался. Что скажите по этому поводу.


 
KSergey ©   (2005-01-05 13:49) [7]

> [5] Начинаюший2   (05.01.05 13:40)
> Про подчёркнутое я забыл, это чтоб после последней проги
> Sleep не выполнялся,

Все равно не понимаю
i-i всяко равно 0
приоритет у арифменических операций - больше логических. Зачем там i-i??!


 
TUser ©   (2005-01-05 14:04) [8]

У себя попробовал - все как надо работает. Загружаем одну прогу, ждем, загружаем вторую, ждем и т.д. Что подразумевается под "торможением загрузки"?


 
Начинаюший2   (2005-01-05 14:09) [9]

>KSergey ©   (05.01.05 13:49) [7]
>Все равно не понимаю
i-i всяко равно 0
приоритет у арифменических операций - больше логических. Зачем там i-i??!


Точно, не заметил, должно быть i-1, отнимаю 1 от индекса ListView3. Хотя щас исправил, задержка пропала вообще. Я хотел убрать задержку после последней проги, из за ошибки не заметил что if ListView3.Items.Item[i].Index=i-i then всёравно не дает количество записаных строк. Буду разбираться с этим дальше. Вот только что делать с тормазами при загрузке прог?


 
Начинаюший2   (2005-01-05 14:19) [10]

>TUser ©   (05.01.05 14:04) [8]
>У себя попробовал - все как надо работает. Загружаем одну прогу, ждем, загружаем вторую, ждем и т.д. Что подразумевается под "торможением загрузки"?


Под этим подразумевается, что прога на некоторое время(время выполнения Sleep) прекрашает загрузку дополнительных модулей, окон, также тормозится динамически изменяемая информация на моей форме, как писал выше не происходит перерисовка окон, если сдвинуть любое окно поверх другого. А при старте следуюшей, догружается всё в месте, что дополнительно грузит процесор.


 
KSergey ©   (2005-01-05 14:25) [11]

> [10] Начинаюший2   (05.01.05 14:19)
> что дополнительно грузит
> процесор.

Глупость, рано или позно он все равно болжен выполнить работу по отрисовке - какая разница когда? Так что на счет "дополнительно" - ябы не скаал.

А вообще - так это же совсем другой вопрос!
Разумеется, что на момент sleep все останавливается (в смысле этот поток этого процесса). Он собственно для того и нужен.
Выход - иди делать задержку на таймере (здесь, по моему - идеально), или в отдельном потоке, вот только стоит ли овчинка выделки?


 
Начинаюший2   (2005-01-05 14:39) [12]

>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:45) [13]

Нет, не то. Я бы сделал так.
По нажатию батона вычитываем список что запускается с задержками (что-то не понял как именно тут сделано, ну да не важно).
Вызываем метод запуска проги номер i.
В этом методе после запуска настраиваем интервал в таймере и стартуем его. Увеличиваем i на 1. Все, выход (из метода).
В OnTimer таймера стопим таймер и вызываем этот метод запуска процесса.

Ну и где-то тут надо конечно проверять выход из этого цикла.

Почитайте про таймер. Sleep никакого не нудно. Ну разве что не плох бы еще Button1 задизаблить, чтобы во время цикла по нему не клацнуть.


 
Начинаюший2   (2005-01-05 14:46) [14]

Неправилльно, быстрее так:

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:48) [15]

> [14] Начинаюший2   (05.01.05 14:46)

Здесь таймер вообще не используется


 
Начинаюший2   (2005-01-05 14:57) [16]

>KSergey ©   (05.01.05 14:48) [15]

Уже проверил, не то. Нет больше времени шас разбираться, закругляюсь на сёдня, может кой пример или ссылку подкинеш. Вообшемто если не брать больше 3х секунд, то и так пойдёт, только каспер слишком при старте грузит.


 
KSergey ©   (2005-01-05 15:00) [17]

> [16] Начинаюший2   (05.01.05 14:57)
> может кой пример или ссылку подкинеш.

Пример чего? Как использовать компонент TTimer - дык справка есть. гугль, опять же... Уж про книжки и не говорю..


 
Начинаюший2   (2005-01-05 15:03) [18]

Ладно, разберусь сам, всем спасибо.


 
KSergey ©   (2005-01-05 15:08) [19]

> [18] Начинаюший2   (05.01.05 15:03)
> Ладно, разберусь сам

А по другому разве может быть? Разве что перепоручить работу другому, но тогда придется з/п делиться. Хотя в принципе - вариант.


 
AlterEgo of WondeRu ©   (2005-01-05 17:23) [20]

Начинаюший2   (05.01.05 14:46) [14]
Неправилльно, быстрее так:


ОРЕХ! ;)


 
Начинаюший2   (2005-01-06 18:04) [21]

Уже разобрался, всё работает как надо.

>KSergey ©   (05.01.05 15:08) [19]
>А по другому разве может быть? Разве что перепоручить работу другому, но тогда придется з/п делиться. Хотя в принципе - вариант.


Вообщето я стараюсь всегда сам разобраться, а потом спашивать, просто я недавно начал изучать дельфяк, а книг пока нет.

Эта тема закрыта.


 
Экспериментатор   (2005-01-06 20:44) [22]

Да. Наверно именно таймер тут нужен IMHO


 
Grotesque   (2005-01-07 04:05) [23]

Application.ProcessMessages;


 
Начинаюший2   (2005-01-07 16:44) [24]

>Экспериментатор   (06.01.05 20:44) [22]

На таймере я уже и сделал.

>Grotesque   (07.01.05 04:05) [23]

Не совсе понял, куда эту строку Application.ProcessMessages; вставить, и что она даст.


 
Anatoly Podgoretsky ©   (2005-01-07 17:04) [25]

Наверно ничего в твоем случае. Поскольку ты спишь Up.Position*1000) времени


 
Начинаюший2   (2005-01-07 17:24) [26]

>Anatoly Podgoretsky ©   (07.01.05 17:04) [25]
Наверно ничего в твоем случае. Поскольку ты спишь Up.Position*1000) времени


Вообщето я уже не использую Sleep, как уже написал выше, сделал с таймером без Sleep. Я имел ввиду, для чего Application.ProcessMessages; нужна.


 
GuAV ©   (2005-01-07 17:27) [27]

http://delphimaster.net/view/1-1102856803/

Юрий Зотов ©   (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:38) [28]

>GuAV ©   (07.01.05 17:27) [27]
http://delphimaster.net/view/1-1102856803/


Сылка уже отсутствует.
А по поводу кода(идеи), спасибо. В данный момент этот код для меня тёмный лес, но попробую разобраться.


 
GuAV ©   (2005-01-07 17:44) [29]

Начинаюший2   (07.01.05 17:38) [28]
Сылка уже отсутствует.


Знаю, поэтому привёл код Юрия Зотова



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.042 c
14-1104573126
Меломан
2005-01-01 12:52
2005.01.23
Чтение новостных групп


1-1105280027
Skiner_Y
2005-01-09 17:13
2005.01.23
Как грузить DLL в ToolBar


9-1097928324
Werwolf
2004-10-16 16:05
2005.01.23
2д под DelphiX


1-1105439083
Ega23
2005-01-11 13:24
2005.01.23
Breakpoint - мистика какая-то...


1-1105544827
chir
2005-01-12 18:47
2005.01.23
Sender... кто же вызвал процедуру?...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский