![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как исключить ошибку [D6, Win2k]
snowkam © (2005-10-26 04:06:00)Привет! Подскажите как это побороть.
В программе запускается некая процедура. Которая в большенстве случаев отрабытывается нормально. Но иногда приводит к зависанию приложения. Как сделать так чтобы это исключить. Может по таймауту??? не знаю подскажите пож......
Digitman (2005-10-27 09:34:00) [1]
> snowkam © (26.10.05 04:06)
дщля начала заведи себе привычку не игнорировать результаты выполнения вызываемых тобой WinAPI-ф-ций, а получив их прежде всего анализировать успешность выполнения.
та же самая WaitForSingleObject() может вернуть совершенно разные результаты, в зависимости от состояния интересующего объекта синхронизации и таймаута .. только проанализировав, ЧТО реально вернула ф-ция, можно принимать дальнейшее решение о том читать ли из пайпа или делать что-то иное ... да и само чтение из пайпа может вернуть True или False, и в зависимости от этого следует принимать соотв. алгоритм. решения
Kolan (2005-10-27 01:25:00) [2]Можно писать лог, увидишь где остановился.
snowkam1 (2005-10-27 00:10:00) [3]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;
И что характерно процедура спокойно работает всю ночь. Тоесть вызывается при определенном исключении и работает нормально. Зависание происходит обычно тогда когда я чтолибо делаю на машине тоесть работаю!
clickmaker (2005-10-26 10:01:00) [4]
> snowkam © (26.10.05 07:51) [2]
заинтриговал. мож покажешь эту загадочную процедуру?
snowkam (2005-10-26 07:51:00) [5]так в этом вся и фишка. Не могу понять где возникает ошибка. Все тестировал все проверял все работает. Но иногда просто процедура зависает вернее зависает на процедуре и все.
Джо (2005-10-26 04:31:00) [6]
> Как сделать так чтобы это исключить
Написать эту "некую процедуру" так, чтобы она не приводил к таким эффектам, как "зависание приложения".