Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2011.10.02;
Скачать: [xml.tar.bz2];

Вниз

консольных программ прога зависает на некоторое время на строке 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2011.10.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.004 c
2-1307696769
Drowsy
2011-06-10 13:06
2011.10.02
Форма не разворачивается на весь экран.


15-1307593117
Sergey
2011-06-09 08:18
2011.10.02
перезагрузка адсл модема


4-1251086922
GrayFace
2009-08-24 08:08
2011.10.02
Как бы перевести код клавиши в символ с учетом языка?


15-1307548488
Rouse_
2011-06-08 19:54
2011.10.02
Может и боян, но все-же хочется поделиться ссылочкой :)


2-1308231708
@!!ex
2011-06-16 17:41
2011.10.02
TPageControl не получается сделать OwnerDraw





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский