Форум: "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