Вверх ↑
Ответов: 4612
Рейтинг: 746
#1: 2018-12-04 18:21:12 ЛС | профиль | цитата
В проекте "Консольное приложение" имеется проблема: вызов метода doWrite консоли работает как-то странно, а именно, вывод как-бы "буферизуется". Проверить можно так:
- скомпилировать эту схему
Cons.sha


Add(Console,2953706,35,105)
{
Title="Console"
link(onStart,7839409:doEvent1,[])
}
Add(InfoTip,14734582,161,21)
{
Info=#17:Не даём программе|23:завершиться без команды|
Width=169
Height=186
}
Add(LineBreakEx,7207913,-21,105)
{
Caption="write"
Type=1
link(OnEvent,2953706:doWrite,[])
}
Add(LineBreakEx,5047505,231,231)
{
Caption="exit"
}
Add(LineBreakEx,6905843,581,98)
{
Caption="write"
}
Add(WaitObject,13558677,273,140)
{
link(ObjHandle,14477716:ObjHandle,[])
}
Add(Events,14477716,273,70)
{
Name=""
}
Add(Hub,7839409,175,105)
{
OutCount=3
link(onEvent1,14477716:doCreate,[(204,111)(204,76)])
link(onEvent3,13558677:doWait,[(205,125)(205,146)])
}
Add(LineBreakEx,15618268,217,77)
{
Caption="exit"
Type=1
link(OnEvent,14477716:doSet,[])
}
Add(CounterEx,14035755,476,98)
{
Max=9999999
link(onNext,10057423:doStrCatDlm,[])
}
Add(MMTimer,16197017,427,98)
{
link(onTimer,14035755:doNext,[])
}
Add(StrCatDelim,10057423,532,98)
{
Str1="This is write string #"
Str2="\r\n"
link(onStrCatDlm,6905843:doWork,[])
}
- скомпилировать и запустить эту схему рядом с Cons.exe
Run cons.sha


Add(MainForm,2953706,21,105)
{
Height=209
Caption="Console run"
Position=1
}
Add(Button,7067558,126,154)
{
Left=170
Top=5
Width=95
Caption="Start console"
link(onClick,3405001:doConsoleExec,[])
}
Add(WinExec,3405001,231,140)
{
FileName="ConsOut.exe"
Point(doConsoleExec)
Point(onConsoleResult)
Point(doConsoleInput)
Point(doConsoleTerminate)
Point(onConsoleError)
link(FileName,1356518:Text,[])
link(onConsoleResult,602325:doAdd,[])
}
Add(Edit,1356518,231,98)
{
Left=5
Top=5
Width=160
Text="Cons.exe"
}
Add(Label,8429589,21,154)
{
Left=5
Top=30
Width=45
Height=17
Caption="On read:"
}
Add(Memo,602325,329,154)
{
Left=5
Top=45
Width=375
Height=125
ScrollBars=2
}
Add(Button,1034865,168,168)
{
Left=270
Top=5
Width=95
Caption="Terminate"
link(onClick,3405001:doConsoleTerminate,[])
}

- в окне нажать "Start console"
- вывод консольной программы в текстовом поле будет появляться порциями примерно по 128 байт.
- если вместо "Cons.exe" указать "cmd.exe" - вывод появится сразу после запуска.

Предлагается заменить метод doWrite в hiConsole.pas:

procedure THIConsole._work_doWrite;
var
S: string;
BW: DWord;
begin
S := ToString(_Data);
if S <> '' then
WriteFile(FStdOut, S[1], Length(S), BW, nil);
end;
(заодно можно добавить и метод doWriteStdErr скрытой точкой - чтобы было)
карма: 26

0
Редактировалось 1 раз(а), последний 2018-12-04 18:21:35