Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.10.02;
Скачать: CL | DM;

Вниз

консольных программ прога зависает на некоторое время на строке l   Найти похожие ветки 

 
mamedovvms ©   (2009-08-25 11:42) [0]

бывает так что для некоторых консольных программ прога зависает на некоторое время на строке
l:=ReadFile(start.hStdInput,Buffer[0],ReadBuffer,BytesRead,nil) ;
что можно сделать, я как понимаю это из за того что нечего считывать
ну у меня же есть строка
WaitForSingleObject(ProcessInfo.hProcess, 10); то есть как я понимаю выдерживается определенное время для выполнения программы, так вот собственно вопрос как сделать такое, или можно ли

repeat

WaitForSingleObject(ProcessInfo.hProcess, 10);

ReadFile(start.hStdInput,Buffer[0],ReadBuffer,BytesRead,nil) ;

until(buffer<>"");

но главное что бы не зависало на строке читки


 
Сергей М. ©   (2009-08-25 12:12) [1]

Зачем плодишь одни и те же ветки ?
Чем тебе
http://delphimaster.net/view/4-1251175537/
не угодила ?


 
mamedovvms ©   (2009-08-25 12:35) [2]

просто там название темы как бы уже раскрыто


 
clickmaker ©   (2009-08-25 13:21) [3]

> это из за того что нечего считывать

if (PeekNamedPipe(start.hStdInput, nil, 0, nil, dwAvail, nil)) and (dwAvail > 0) then
 // есть, чего считывать


 
mamedovvms ©   (2009-08-25 13:34) [4]

так в том то и дело что у меня есть что считать просто программа еще не все вывела, но надо считать то что уже есть


 
Сергей М. ©   (2009-08-25 13:36) [5]


> надо считать то что уже есть


Так вот PeekNamedPipe как раз и предназначена для того чтобы узнать, есть хоть что-нибудь к чтению или нет ничего.


 
clickmaker ©   (2009-08-25 13:39) [6]

ну так PeekNamedPipe для этого и заточена.
в dwAvail будет размер того, что уже есть.
а цикл примерно такой
repeat
 if (PeekNamedPipe(... then
 begin
   ReadFile
   ...
 end
 Sleep(10);
until (ExitCode <> STILL_ACTIVE) and (dwAwail = 0);


 
mamedovvms ©   (2009-08-25 13:46) [7]

да дело как раз в том что у меня сразу после запуска уже есть что считать , но как я понимаю из-за того что стоит 512 ждем пока забьется полностью, но как мне сделать что бы считывалось не 512 а например 10, я ставил 10 но это не насколько не делает процесс быстрее я подозреваю что вся проблема при создании пайпа, там тоже как то надо прописать колличество байт


 
clickmaker ©   (2009-08-25 13:48) [8]

> там тоже как то надо прописать колличество байт

там можно прописать предполагаемое количество байт. Винда его расширит, если надо


 
mamedovvms ©   (2009-08-25 14:01) [9]

спасибо огромное буду пробывать


 
mamedovvms ©   (2009-08-25 14:53) [10]

вот что у меня получилось, но почему то долго не выводит результат зато потом больше 4000 что сделал не так вроде все проверил и перепроверил

procedure RunDosInMemo(DosApp:String;AMemo:TMemo) ;
var
l:boolean;
dwAvail:Cardinal;
Security : TSecurityAttributes;
ReadPipe,WritePipe : THandle;
start : TStartUpInfo;
ProcessInfo : TProcessInformation;
BytesRead : DWord;
Apprunning : DWord;
x : Integer;
MyStr,s : String;
begin

 x := 0;
 With Security do
 begin
  Security.nlength := SizeOf(TSecurityAttributes) ;
  Security.binherithandle := true;
  Security.lpsecuritydescriptor := nil;
 end;

 if Createpipe (ReadPipe, WritePipe,
                @Security, 0) then
 begin
   ZeroMemory(@start, SizeOf(TStartupInfo)); ;
   start.cb := SizeOf(STARTUPINFO) ;
   start.hStdOutput := WritePipe;
   start.hStdInput := ReadPipe;
   start.dwFlags := STARTF_USESTDHANDLES ;
   start.wShowWindow := SW_SHOW;

   if CreateProcess(nil,
         PChar(DosApp),
         @Security,
         @Security,
         true,
         NORMAL_PRIORITY_CLASS,
         nil,
         nil,
         start,
         ProcessInfo)
   then
   begin
   CloseHandle(WritePipe) ;
   repeat

      WaitForSingleObject(ProcessInfo.hProcess, 1000);

       PeekNamedPipe(ReadPipe, nil, 0, nil, @dwAvail, nil);
       if dwAvail>0 then
        begin
         SetLength(S, dwAvail);

        ReadFile(ReadPipe,PChar(S)^, Length(S), BytesRead,nil);
         ShowMessage(s);

        end;

   until(dwAvail>0);
     ShowMessage("Нет");

     CloseHandle(ProcessInfo.hProcess) ;
     CloseHandle(ProcessInfo.hThread) ;
     CloseHandle(ReadPipe) ;

  {   TerminateProcess(pi.hProcess,NO_ERROR);}
   end;

 end;

end;


 
Leonid Troyanovsky ©   (2009-08-25 15:40) [11]


> mamedovvms ©   (25.08.09 14:53) [10]

>    start.hStdInput := ReadPipe;

start.hStdInput := 0;

--
Regards, LVT.


 
Сергей М. ©   (2009-08-25 16:24) [12]


> WaitForSingleObject(ProcessInfo.hProcess, 1000);


И опять тот же вопрос - что ты делаешь в этой строке ?



Страницы: 1 вся ветка

Текущий архив: 2011.10.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.008 c
2-1307976499
Push
2011-06-13 18:48
2011.10.02
ПРоверака логина и пароля


15-1307527244
Sergey
2011-06-08 14:00
2011.10.02
Удаленный доступ к интернет


15-1307430272
RGV
2011-06-07 11:04
2011.10.02
Актуальность Delphi.


2-1307635571
Leon-Z
2011-06-09 20:06
2011.10.02
БД в виде *.xml файлов.


2-1308121329
mefodiy
2011-06-15 11:02
2011.10.02
Разница между TIdAttachment и TIdAttachmentFile