Конференция "WinAPI" » консольных программ прога зависает на некоторое время на строке l [D7]
 
  • mamedovvms © (25.08.09 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<>'');


    но главное что бы не зависало на строке читки
  • Сергей М. © (25.08.09 12:12) [1]
    Зачем плодишь одни и те же ветки ?
    Чем тебе
    http://pda.delphimaster.net/?id=1251175537&n=5
    не угодила ?
  • mamedovvms © (25.08.09 12:35) [2]
    просто там название темы как бы уже раскрыто
  • clickmaker © (25.08.09 13:21) [3]
    > это из за того что нечего считывать

    if (PeekNamedPipe(start.hStdInput, nil, 0, nil, dwAvail, nil)) and (dwAvail > 0) then
     // есть, чего считывать
  • mamedovvms © (25.08.09 13:34) [4]
    так в том то и дело что у меня есть что считать просто программа еще не все вывела, но надо считать то что уже есть
  • Сергей М. © (25.08.09 13:36) [5]

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


    Так вот PeekNamedPipe как раз и предназначена для того чтобы узнать, есть хоть что-нибудь к чтению или нет ничего.
  • clickmaker © (25.08.09 13:39) [6]
    ну так PeekNamedPipe для этого и заточена.
    в dwAvail будет размер того, что уже есть.
    а цикл примерно такой
    repeat
     if (PeekNamedPipe(... then
     begin
       ReadFile
       ...
     end
     Sleep(10);
    until (ExitCode <> STILL_ACTIVE) and (dwAwail = 0);
  • mamedovvms © (25.08.09 13:46) [7]
    да дело как раз в том что у меня сразу после запуска уже есть что считать , но как я понимаю из-за того что стоит 512 ждем пока забьется полностью, но как мне сделать что бы считывалось не 512 а например 10, я ставил 10 но это не насколько не делает процесс быстрее я подозреваю что вся проблема при создании пайпа, там тоже как то надо прописать колличество байт
  • clickmaker © (25.08.09 13:48) [8]
    > там тоже как то надо прописать колличество байт

    там можно прописать предполагаемое количество байт. Винда его расширит, если надо
  • mamedovvms © (25.08.09 14:01) [9]
    спасибо огромное буду пробывать
  • mamedovvms © (25.08.09 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 © (25.08.09 15:40) [11]

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

    >    start.hStdInput := ReadPipe;

    start.hStdInput := 0;

    --
    Regards, LVT.
  • Сергей М. © (25.08.09 16:24) [12]

    > WaitForSingleObject(ProcessInfo.hProcess, 1000);


    И опять тот же вопрос - что ты делаешь в этой строке ?
 
Конференция "WinAPI" » консольных программ прога зависает на некоторое время на строке l [D7]
Есть новые Нет новых   [134434   +26][b:0][p:0.003]