Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.055 c
6-1121961178
Hkr
2005-07-21 19:52
2005.11.13
Программирование NetBIOS


2-1129784806
SMATMP
2005-10-20 09:06
2005.11.13
LoadFromFile


2-1129572587
~SaM~
2005-10-17 22:09
2005.11.13
А в паскале есть функции аналогичные дельфовским StrToInt и т.п.?


1-1130239532
DelphiLexx
2005-10-25 15:25
2005.11.13
МасштабированиеTImahe.Canvas


14-1129731119
ArtemESC
2005-10-19 18:11
2005.11.13
Старый добрый Turbo Pascal