PDA

Просмотр полной версии : [Информация] Замена к функции Sleep() чтобы программа не зависал.


rufat2005
21.04.2012, 09:12
Изначально как начинающий программист я в своём боте начал использовать функцию Sleep() между открытием коробок, выбросом , точкой вещей.
Но в момент паузы функции Sleep() окно программы зависало, что как говорится не приятно.
Покопался в сети и нашол решении этой проблемы.
Думал может быть кому пригодится.

Procedure Delay(mSec:Cardinal);
Var
TargetTime:Cardinal;
Begin
TargetTime:=GetTickCount+mSec;
While TargetTime>GetTickCount Do
begin
Application.ProcessMessages;
Sleep(1);
If Application.Terminated then Exit;
end;
End;


теперь вместо функции Sleep() используем Delay() и программа не будет зависать. Покра не мере я только что у себя проверил!

Источник [Ссылки могут видеть только зарегистрированные и активированные пользователи]
Тыкни спасибо если помог.
:wow:

Kitsune
21.04.2012, 09:29
Очевидно же, что Sleep приостанавливает работу потока, в котором выполняется, а поскольку вы все действия выполняете в потоке GUI, то и ваш GUI будет зависать от этого.
Все ресурсоёмкие действия следует выполнять в отдельном потоке.

rufat2005
21.04.2012, 09:36
Да изначально я этого не знал.

BritishColonist
21.04.2012, 10:53
While TargetTime>GetTickCount Do
begin
Application.ProcessMessages;
Sleep(1);
If Application.Terminated then Exit;
end;

Слишком толсто. Будет сильно жрать оперативу и/или процент загрузки ЦП.
Как вариант, можно через GetTickCount применить ещё один способ, но он скорее подойдёт для проверки нажатий клавиш в перерывах между "долгими" обработчиками этих нажатий. Но есть существенный минус - сложно всё это будет организовать. Плюс - нет Sleep, который многим так страшен.

Вывод: проще использовать отдельный поток, причём, если это бот, то для разных типов действий лучше даже создать несколько потоков.

rufat2005
21.04.2012, 18:57
по мне так реализовать лутше
// открываем коробки по ид
procedure OtkritieKorobok;
var
Chast1, Chast2:String;
i, e:Integer;
titemId:array [1..16] of Integer;
label
dalshe;
begin
if hProcess <> 0 then
begin
tOtkritiyaKorobok:=GetTickcount+9999999999;
titemid[1] := StrToInt(Form1.Edit19.Text);
titemid[2] := StrToInt(Form1.Edit20.Text);
titemid[3] := StrToInt(Form1.Edit21.Text);
titemid[4] := StrToInt(Form1.Edit22.Text);
titemid[5] := StrToInt(Form1.Edit23.Text);
titemid[6] := StrToInt(Form1.Edit24.Text);
titemid[7] := StrToInt(Form1.Edit25.Text);
titemid[8] := StrToInt(Form1.Edit26.Text);
titemid[9] := StrToInt(Form1.Edit27.Text);
titemid[10] := StrToInt(Form1.Edit28.Text);
titemid[11] := StrToInt(Form1.Edit29.Text);
titemid[12] := StrToInt(Form1.Edit30.Text);
titemid[13] := StrToInt(Form1.Edit31.Text);
titemid[14] := StrToInt(Form1.Edit32.Text);
titemid[15] := StrToInt(Form1.Edit33.Text);
titemid[16] := StrToInt(Form1.Edit34.Text);
for e:=1 to 16 do
begin
for i:=0 to (MaksKolYacheek-1) do
begin
If (ItemId[i] = titemid[e]) and (ItemId[i]>0) then
begin
Chast1:= copy(IntToHex(titemid[e], 4),1,2);
Chast2:= copy(IntToHex(titemid[e], 4),3,2);
Packet('28000001'+IntToHex(i, 2)+'00'+Chast2+Chast1+'0000');
goto dalshe;
end;
end;
dalshe:
Delay(StrToInt(form1.edit46.text));
end;
tOtkritiyaKorobok:=GetTickcount+StrToInt(form1.Edi t41.Text);
end;
end;

NebesaBag
31.05.2013, 01:01
Автору большое спасибо.
Стыдно сказать как долго искал данную информацию, хотя давно сижу на жуке, но искал чисто в гугле)