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

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

консольных программ прога зависает на некоторое время на строке l [D7]


mamedovvms ©   (2009-08-25 11:42:00) 

бывает так что для некоторых консольных программ прога зависает на некоторое время на строке
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 16:24:00) [1]


> WaitForSingleObject(ProcessInfo.hProcess, 1000);


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


Leonid Troyanovsky   (2009-08-25 15:40:00) [2]


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

>    start.hStdInput := ReadPipe;

start.hStdInput := 0;

--
Regards, LVT.


mamedovvms   (2009-08-25 14:53:00) [3]

вот что у меня получилось, но почему то долго не выводит результат зато потом больше 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;


mamedovvms   (2009-08-25 14:01:00) [4]

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


clickmaker   (2009-08-25 13:48:00) [5]

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

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


mamedovvms   (2009-08-25 13:46:00) [6]

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


clickmaker   (2009-08-25 13:39:00) [7]

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


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


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


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


mamedovvms   (2009-08-25 13:34:00) [9]

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


clickmaker   (2009-08-25 13:21:00) [10]

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

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


mamedovvms   (2009-08-25 12:35:00) [11]

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


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

Зачем плодишь одни и те же ветки ?
Чем тебе
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1251175537&n=5
не угодила ?


Наверх

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