Вверх ↑
Этот топик читают: Гость
Ответов: 83
Рейтинг: 0
#1: 2020-06-24 12:12:36 ЛС | профиль | цитата
Ребята, опять прошу вашей помощи. Как через консоль выполнить поочередно пакет команд? Сами команды формируются через formatStr. Я пробовал связку перебор массива и поток, но так это не работвет. После чего пришла идея формировать список команд, сохранять их в BAT файле, после чего выполнять- это работает, но все же хочется, чтобы команды выполнялись поочередно из самой программы, а не через BAT. И было бы круто выводить панель прогресса)

* Команды для работы с ffmpeg и winrar

Редактировалось 4 раз(а), последний 2020-06-24 13:56:19
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 4220
Рейтинг: 660
#2: 2020-06-24 13:28:17 ЛС | профиль | цитата
Перебор массива с компонентом WinExec должен работать. В WinExec.FileName указывается постоянное имя исполняемого файла, а на верхнюю точку WinExec.Params подается то, что получается при переборе. Поставить WinExec.RunEvent=Wait, чтобы дожидаться завершения каждой команды (иначе будет одновременно запускаться множество процессов).

Редактировалось 1 раз(а), последний 2020-06-24 13:28:59
карма: 21

0
Ответов: 83
Рейтинг: 0
#3: 2020-06-24 14:40:56 ЛС | профиль | цитата
Netspirit писал(а):
Перебор массива с компонентом WinExec должен работать. В WinExec.FileName указывается постоянное имя исполняемого файла, а на верхнюю точку WinExec.Params подается то, что получается при переборе. Поставить WinExec.RunEvent=Wait, чтобы дожидаться завершения каждой команды (иначе будет одновременно запускаться множество процессов).

Редактировалось 1 раз(а), последний 2020-06-24 13:28:59


Спасибо работает, но есть одно НО, при генерации скриншотов через ffmpeg обрабатывает не все файлы, только первые 15-25 файлов из 160, хотя эти же команды через BAT обрабатывают все файлы
карма: 0

0
Ответов: 4220
Рейтинг: 660
#4: 2020-06-24 15:03:56 ЛС | профиль | цитата
Возможно в схеме у тебя что-то не так. Например, имена, содержащие пробелы, должны указываться в кавычках.

Редактировалось 1 раз(а), последний 2020-06-24 15:04:40
карма: 21

0
Ответов: 83
Рейтинг: 0
#5: 2020-06-27 17:00:46 ЛС | профиль | цитата
Пробовал без кавычек с кавычками, пути только латиницей - один черт делает первые пару штук и встает


Add(MainForm,2953706,21,105)
{
Width=1835
Height=733
link(onCreate,3362353:In,[])
}
Add(Edit,8162964,336,140)
{
Left=20
Top=20
Width=195
Text="450"
}
Add(Edit,5479174,378,140)
{
Left=235
Top=20
Width=195
Text="2"
}
Add(Edit,9091653,427,140)
{
Left=455
Top=20
Width=195
Text="2"
}
Add(FormatStr,14142354,364,266)
{
DataCount=5
Mask=""C:\\Projects\\postilka\\bin\\ffmpeg.exe" -i "%1" -vf thumbnail,scale=300:200 -frames:v 1 "%5""
Point(FString)
link(onFString,4624052:doStrCat,[(436,272)(436,279)])
link(Str1,2870508:Item,[(370,261)(300,261)])
link(Str2,8162964:Text,[(377,219)(342,219)])
link(Str3,5479174:Text,[])
link(Str4,9091653:Text,[(391,219)(433,219)])
link(Str5,7375549:FString,[(398,236)(531,236)])
}
Add(ListBox,7781240,280,140)
{
Left=25
Top=60
Width=400
Height=500
}
Add(ArrayEnum,2870508,294,224)
{
link(onItem,2679778:doEvent1,[])
link(Array,7781240:Array,[])
}
Add(Button,11600324,133,140)
{
Left=90
Top=580
Width=90
Height=40
Font=[MS Sans Serif,10,1,255,1]
Caption="..."
link(onClick,9684769:doExecute,[])
}
Add(ODialog,9684769,189,140)
{
Select=1
link(onExecute,7781240:doAdd,[])
}
Add(SymbolsGen,1303461,525,119)
{
Count=12
Symbols="abcdefghijklmnopqrstuvwxyz"
link(onResult,7375549:doString,[(569,125)(569,153)(513,153)(513,181)])
}
Add(FormatStr,7375549,525,175)
{
Mask="D:\\igor\\screen\\%1.jpg"
Point(FString)
link(Str1,1303461:Result,[])
}
Add(StrCat,4624052,469,273)
{
Str2="\13\10"
link(onStrCat,1664676:In,[])
link(Str1,14142354:FString,[(475,254)(423,254)(423,309)(370,309)])
}
Add(WinExec,4524503,763,252)
{
FileName="cmd.exe"
Action="print"
Point(doConsoleInput)
Point(doConsoleExec)
Point(onConsoleResult)
Point(onConsoleTerminate)
Point(Action)
Point(onConsoleError)
link(onConsoleResult,11231444:doCharset,[])
link(Action,3898921:Var,[(783,228)(790,228)])
link(onConsoleError,1314437:doCharset,[(835,286)(835,216)])
}
Add(Button,10794893,168,224)
{
Left=215
Top=580
Width=90
Height=40
Font=[MS Sans Serif,10,1,255,1]
Caption="screen"
link(onClick,10510774:doStart,[])
}
Add(Hub,2679778,336,224)
{
link(onEvent1,1303461:doGenerate,[(477,230)(477,125)])
link(onEvent2,14142354:doString,[(357,237)(357,272)])
}
Add(LineBreak,9444856,707,259)
{
link(Out,4524503:doConsoleInput,[(757,265)(757,272)])
Primary=[1664676,-119,14]
}
Add(LineBreak,13867316,721,273)
{
link(Out,4524503:doConsoleExec,[])
Primary=[3362353,-658,-154]
}
Add(Thread,10510774,217,224)
{
FastStop=0
link(onExec,2870508:doEnum,[])
}
Add(Charset,11231444,861,266)
{
link(onCharset,4290836:doAdd,[])
}
Add(Memo,4290836,931,266)
{
Left=435
Top=55
Width=565
Height=505
ScrollBars=3
}
Add(Charset,1314437,875,210)
{
link(onCharset,13653695:doAdd,[])
}
Add(Memo,13653695,945,210)
{
Left=1015
Top=55
Width=760
Height=505
ScrollBars=3
}
Add(LineBreak,5328632,469,315)
{
Type=1
link(Data,4624052:Result,[])
Primary=[3898921,315,-126]
}

карма: 0

0
Ответов: 4220
Рейтинг: 660
#6: 2020-06-29 13:59:07 ЛС | профиль | цитата
1) Компонента SymbolsGen у нас нет
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 - надо переработать!).

Редактировалось 1 раз(а), последний 2020-06-29 15:28:35
карма: 21

0
Разработчик
Ответов: 25623
Рейтинг: 2082
#7: 2020-06-29 14:12:31 ЛС | профиль | цитата
Давай законченный вариант, добавлю на SVN.
карма: 19

0
Ответов: 4220
Рейтинг: 660
#8: 2020-06-29 15:26:58 ЛС | профиль | цитата
Вот. В архиве также обновленный Events (если посчитаешь нужным).
карма: 21

1
Голосовали:Konst
Разработчик
Ответов: 25623
Рейтинг: 2082
#9: 2020-06-29 17:51:26 ЛС | профиль | цитата
Netspirit писал(а):
Вот

А на SVN что я буду писать? Мы же договаривались, что все изменения для добавления на SVN снабжаются комментами.
карма: 19

0
Ответов: 4220
Рейтинг: 660
#10: 2020-06-29 17:58:40 ЛС | профиль | цитата
WinExec - property RunEvent work also for doConsoleExec
карма: 21

0
Разработчик
Ответов: 25623
Рейтинг: 2082
#11: 2020-06-29 19:15:01 ЛС | профиль | цитата
А на Events?
карма: 19

0
Ответов: 4220
Рейтинг: 660
#12: 2020-06-29 20:39:24 ЛС | профиль | цитата
Events - removed points doCreate, doDestroy, onCreate
карма: 21

0
Ответов: 83
Рейтинг: 0
#13: 2020-06-30 01:57:47 ЛС | профиль | цитата
Netspirit, Спасибо тебе! Ты просто волшебник!
карма: 0

0
Разработчик
Ответов: 25623
Рейтинг: 2082
#14: 2020-06-30 12:18:27 ЛС | профиль | цитата
Netspirit писал(а):
removed points doCreate, doDestroy, onCreate

Это что, событие всегда будет создаваться по дефолту при запуске, а не так как раньше, когда надо? А в чем сакральный смысл сего решения?

Редактировалось 1 раз(а), последний 2020-06-30 12:19:58
карма: 19

0
Ответов: 4220
Рейтинг: 660
#15: 2020-07-01 14:40:00 ЛС | профиль | цитата
Смысл - не тянуть постоянно связь к точке doCreate. Так как раз компонент вставлен схему, значит будет использоваться - а какая разница в какой момент инициализировать объект?
В коде можно, конечно, сделать чтобы объект создавался при первом обращении к нижней точке.

Редактировалось 1 раз(а), последний 2020-07-01 14:40:59
карма: 21

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)