2) При запуске консольных программ нет необходимости запускать сначала cmd.exe, а затем передавать ему команду на запуск другой программы.
3) При запуске программы следует дожидаться её завершения перед тем как запускать следующую.
doConsoleExec следует использовать тогда, когда есть необходимость подавать команды и получать результаты через стандартные потоки ввода-вывода (doConsoleInput, onConsoleResult, onConsoleError). При этом есть некоторые сложности с приостановкой запускающего потока в ожидании завершения консольной программы.
В остальных случаях использовать doExec при RunEvent=Wait.
Вот твоя работающая схема, демонстрирующая оба варианта запуска:
Add(MainForm,14353687,413,217)
{
Width=1033
Height=674
link(onCreate,7277277:In,[])
}
Add(FormatStr,14142354,798,357)
{
DataCount=3
Mask="-i "%1" -vf thumbnail,scale=300:200 -frames:v 1 -y "%2\\%3.jpg""
Point(FString)
link(onFString,6287769:doExec,[])
link(Str2,818578:getVar,[])
link(Str3,16517087:GetData,[(818,331)(867,331)])
}
Add(ListBox,7781240,672,252)
{
Left=25
Top=60
Width=400
Height=500
}
Add(ArrayEnum,2870508,686,357)
{
link(onItem,14142354:doString,[])
link(Array,7781240:Array,[])
}
Add(Button,11600324,525,252)
{
Left=90
Top=580
Width=90
Height=40
Font=[MS Sans Serif,10,1,255,1]
Caption="..."
link(onClick,9684769:doExecute,[])
}
Add(ODialog,9684769,581,252)
{
Select=1
link(onExecute,9059087:doWork2,[])
}
Add(WinExec,4524503,1057,532)
{
RunEvent=1
Action="print"
Point(doConsoleExec)
Point(onErrorExec)
Point(onConsoleTerminate)
Point(onConsoleResult)
Point(onConsoleError)
link(FileName,7674889:getVar,[])
link(onErrorExec,8713623:doEvent1,[])
link(onConsoleTerminate,8713623:doEvent2,[])
link(onConsoleResult,7049640:doSynchronize,[])
link(onConsoleError,4315632:doSynchronize,[])
}
Add(Button,10794893,560,357)
{
Left=215
Top=580
Width=90
Height=40
Font=[MS Sans Serif,10,1,255,1]
Caption="screen"
link(onClick,10510774:doStart,[])
}
Add(Thread,10510774,609,357)
{
FastStop=0
link(onExec,2870508:doEnum,[])
}
Add(Memo,4290836,1274,560)
{
Left=435
Top=60
Width=565
Height=105
ScrollBars=3
}
Add(Memo,13653695,1176,567)
{
Left=435
Top=205
Width=565
Height=355
ScrollBars=3
}
Add(DropFile,13390911,581,294)
{
link(onDropFile,9059087:doWork3,[(641,300)])
}
Add(HubEx,9059087,637,252)
{
link(onEvent,7781240:doAdd,[])
}
Add(Edit,15735182,693,112)
{
Left=100
Top=5
Width=270
Text="c:\\Program Files\\VideoTools\\ffmpeg\\ffmpeg.exe"
}
Add(EventFromData,16517087,861,273)
{
link(onEvent,6965336:doNext,[])
}
Add(CounterEx,6965336,903,273)
{
Min=1
Max=99999999
link(onNext,16517087:doData,[(947,279)(947,267)(849,267)(849,279)])
}
Add(LineBreakEx,8656684,693,154)
{
Caption="FF"
Type=3
link(_Data,15735182:Text,[])
}
Add(LineBreakEx,7674889,1057,490)
{
Caption="FF"
Type=2
}
Add(LineBreakEx,15350282,763,154)
{
Caption="Dir"
Type=3
link(_Data,3459322:Text,[])
}
Add(LineBreakEx,818578,805,308)
{
Caption="Dir"
Type=2
}
Add(Label,11584814,413,280)
{
Left=380
Top=10
Width=114
Height=17
Caption="Папка для миниатюр:"
}
Add(Edit,3459322,763,112)
{
Left=495
Top=5
Width=290
Text="."
}
Add(Events,10127768,1330,539)
{
Name=""
ManualReset=1
}
Add(WaitObject,15276499,1330,595)
{
link(ObjHandle,10127768:ObjHandle,[])
}
Add(LineBreak,9432964,1281,511)
{
Caption="ev"
link(Out,10127768:doCreate,[(1317,517)(1317,545)])
Primary=[7277277,-812,-280]
}
Add(Hub,5696776,1001,546)
{
link(onEvent1,4524503:doConsoleExec,[])
link(onEvent2,15276499:doWait,[(1037,559)(1037,601)])
}
Add(Hub,8713623,1106,546)
{
InCount=2
OutCount=1
link(onEvent1,10127768:doSet,[])
}
Add(InfoTip,11811478,980,462)
{
Info=#50:Запуск консольной программы с ожиданием завершения|
Width=414
Height=179
}
Add(InfoTip,3204755,980,245)
{
Info=#15:Простой вариант|55:Для скрытия консольного окна использовать свойство Mode|
Width=190
Height=179
}
Add(WinExec,6287769,1057,357)
{
RunEvent=1
Action="print"
link(FileName,15721497:getVar,[])
}
Add(LineBreakEx,15721497,1057,315)
{
Caption="FF"
Type=2
}
Add(Synchronize,7049640,1225,560)
{
link(onSync,4290836:doAdd,[])
}
Add(Synchronize,4315632,1127,567)
{
link(onSync,13653695:doAdd,[])
}
nesco, есть предложение поправить WinExec - сделать чтобы свойство RunEvent также работало и для метода doConsoleExec. То-есть, по doConsoleExec при RunEvent=Wait метод приостанавливается до завершения работы консольной программы. Это позволит избежать того огорода из Events+WaitObject в моей схеме (а Events - надо переработать!).