Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как исключить ошибку [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]


>  Как сделать так чтобы это исключить

Написать эту "некую процедуру" так, чтобы она не приводил к таким эффектам, как "зависание приложения".


Наверх

Титульная страница Поиск, карта сайта Написать письмо