Текущий архив: 2005.11.13;
Скачать: CL | DM;
Вниз
как исключить ошибку Найти похожие ветки
← →
snowkam © (2005-10-26 04:06) [0]Привет! Подскажите как это побороть.
В программе запускается некая процедура. Которая в большенстве случаев отрабытывается нормально. Но иногда приводит к зависанию приложения. Как сделать так чтобы это исключить. Может по таймауту??? не знаю подскажите пож......
← →
Джо © (2005-10-26 04:31) [1]
> Как сделать так чтобы это исключить
Написать эту "некую процедуру" так, чтобы она не приводил к таким эффектам, как "зависание приложения".
← →
snowkam © (2005-10-26 07:51) [2]так в этом вся и фишка. Не могу понять где возникает ошибка. Все тестировал все проверял все работает. Но иногда просто процедура зависает вернее зависает на процедуре и все.
← →
clickmaker © (2005-10-26 10:01) [3]
> snowkam © (26.10.05 07:51) [2]
заинтриговал. мож покажешь эту загадочную процедуру?
← →
snowkam1 (2005-10-27 00:10) [4]procedure TForm1.RunDosInMemo(CmdLine: string);
const
ReadBuffer = 2400;
var
Security: TSecurityAttributes;
ReadPipe, WritePipe: THandle;
start: TStartUpInfo;
ProcessInfo: TProcessInformation;
Buffer: Pchar;
BytesRead: DWord;
Apprunning: DWord;
begin
with Security do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe(ReadPipe, WritePipe,
@Security, 0) then
begin
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Start, Sizeof(Start), #0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;
if CreateProcess(nil,
PChar(CmdLine),
@Security,
@Security,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo) then
begin
repeat
Apprunning := WaitForSingleObject
(ProcessInfo.hProcess, 100);
ReadFile(ReadPipe, Buffer[0],
ReadBuffer, BytesRead, nil);
Buffer[BytesRead] := #0;
OemToAnsi(Buffer, Buffer);
fin_str:= string(Buffer);
Application.ProcessMessages;
until (fin_str<> "");
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
stat_str:= Copy(fin_str,1, AnsiPos(" ", fin_str));
info_str:= Copy(fin_str, AnsiPos(" ", fin_str) + 1, Length(fin_str));
logm.Insert;
logm.FieldByName("data").Value:= date;
logm.FieldByName("time").Value:= time;
logm.FieldByName("sysnom").Value:= serv.FieldByName("sysnom").Value;
logm.FieldByName("stat").Value:= stat_str;
logm.FieldByName("rez").Value:= Trim(info_str);
logm.FieldByName("modul").Value:= moduls.FieldByName("mod").Value;
logm.Post;
end;
И что характерно процедура спокойно работает всю ночь. Тоесть вызывается при определенном исключении и работает нормально. Зависание происходит обычно тогда когда я чтолибо делаю на машине тоесть работаю!
← →
Kolan © (2005-10-27 01:25) [5]Можно писать лог, увидишь где остановился.
← →
Digitman © (2005-10-27 09:34) [6]
> snowkam © (26.10.05 04:06)
дщля начала заведи себе привычку не игнорировать результаты выполнения вызываемых тобой WinAPI-ф-ций, а получив их прежде всего анализировать успешность выполнения.
та же самая WaitForSingleObject() может вернуть совершенно разные результаты, в зависимости от состояния интересующего объекта синхронизации и таймаута .. только проанализировав, ЧТО реально вернула ф-ция, можно принимать дальнейшее решение о том читать ли из пайпа или делать что-то иное ... да и само чтение из пайпа может вернуть True или False, и в зависимости от этого следует принимать соотв. алгоритм. решения
Страницы: 1 вся ветка
Текущий архив: 2005.11.13;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.041 c