Add(MultiElement,16056968,343,210)
{
@Color=43775
link(onEvent2,10085835:doEvent1,[])
}
BEGIN_SDK
Add(EditMulti,3920564,21,21)
{
EventCount=2
WorkCount=1
Width=412
link(doWork1,9210074:doData,[(87,27)(87,139)])
}
Add(WinExec,13023946,154,119)
{
FileName="powershell"
Param="-nologo -noprofile -command "& {(Get-PnpDevice -PresentOnly -InstanceId 'USB\VID_0483"&"PID_5740*').Name }""
Mode=0
Point(doConsoleExec)
Point(onConsoleResult)
Point(onConsoleError)
link(onConsoleResult,1345852:doCharset,[])
link(onConsoleError,14212254:doCharset,[(223,146)(223,181)])
}
Add(Charset,1345852,231,133)
{
link(onCharset,3780311:doSearch,[])
}
Add(Charset,14212254,231,175)
{
link(onCharset,3867453:doSearch,[(275,181)(275,188)])
}
Add(BlockFind,3867453,287,182)
{
StartBlock="не удалось"
EndBlock="обнаружить"
link(onSearch,568899:doData,[])
}
Add(DoData,568899,329,182)
{
@Color=43775
Data=String()
link(onEventData,1466602:doWork3,[(376,188)])
}
Add(DoData,9210074,112,133)
{
link(onEventData,13023946:doConsoleExec,[])
}
Add(BlockFind,3780311,287,133)
{
IncludeBlock=1
StartBlock="("
EndBlock=")"
Point(onNotFind)
Point(doStop)
link(onSearch,4082409:doEvent1,[])
link(onNotFind,1466602:doWork2,[])
}
Add(Hub,4082409,329,133)
{
link(onEvent1,3780311:doStop,[(347,139)(347,125)(275,125)(275,146)])
link(onEvent2,3920564:onEvent1,[(388,146)(388,27)])
}
Add(HubEx,1466602,372,147)
{
Angle=3
link(onEvent,3920564:onEvent2,[(376,34)])
}
END_SDK
Add(Timer,5674699,441,210)
{
Interval=500
Enable=1
AutoStop=1
Point(onStop)
link(onTimer,16196945:doData,[])
link(onStop,15408543:In,[])
}
Add(Button,6789410,287,210)
{
Left=65
Top=85
link(onClick,16056968:doWork1,[])
}
Add(Hub,10085835,399,217)
{
link(onEvent1,5674699:doTimer,[(427,223)(427,216)])
link(onEvent2,5302195:doData,[])
}
Add(Hub,13166820,686,210)
{
InCount=3
OutCount=1
link(onEvent1,15061016:doAdd,[])
}
Add(HilightMemo,15061016,791,210)
{
Left=165
Top=70
Width=215
Height=185
Font=[Courier New,8,0,0,1]
HilightFont=[Courier New,8,0,0,1]
}
Add(DoData,16196945,630,210)
{
Data=String(123)
link(onEventData,13166820:doEvent1,[])
}
Add(DoData,5302195,567,224)
{
Data=String(333)
link(onEventData,13166820:doEvent2,[(643,230)(643,223)])
}
Add(LineBreak,10818245,588,280)
{
link(Out,2330533:doData,[])
Primary=[15408543,-105,-63]
}
Add(DoData,2330533,637,280)
{
Data=String(стоп)
link(onEventData,13166820:doEvent3,[(677,286)(677,230)])
}
Этот топик читают: Гость
|
Ответов: 215
Рейтинг: 6
|
|||
|
Всем привет. Столкнулся с непонятным поведением таймера в данной ситуации. Он не запускается. Что это? Пробовал пересоздать таймер не помогло.
|
|||
| карма: 1 |
|
|
Ответов: 1061
Рейтинг: 219
|
|||
|
strannik_nebes писал(а): олкнулся с непонятным поведением таймера в данной ситуации. Он не запускается. Что это?А так? |
|||
| карма: 20 |
| ||
| Голосовали: | strannik_nebes |
|
Ответов: 1061
Рейтинг: 219
|
|||
|
strannik_nebes, Попробуй эту схему. Определение названия устройства по VID и PID.
Не забудь прописать данные своего устройства. У меня находит полное название. Работает быстрее чем PowerShell. IC мой потому могут быть ошибки. https://forum.hiasm.com/getfile/40616 |
|||
| карма: 20 |
| ||
| файлы: 1 | Get Device Name.zip [1.6KB] [51] |
|
Ответов: 4673
Рейтинг: 768
|
|||
|
Схему не смотрел, попробую предположить.
Обычный таймер нельзя запускать из параллельного потока. Если в данной схеме таймер включается по событиях onConsoleXXX, то они как раз происходят в пар. потоке. Тогда в линк включения таймера нужно вставить компонент Synchronize. Компонент DeferredEvent делает то же самое, только другим путем. |
|||
| карма: 26 |
|
|
Ответов: 215
Рейтинг: 6
|
|||
|
Gunta, Спасибо за помощь. По сути, можно элемент создать на базе этого кода.
1. Я доработал чуток схему, чтобы можно получить информацию обо всех подключенных устройств такого типа, в делфи я не шарю, чисто опираясь на язык С/С++. Редактировалось 2 раз(а), последний 2026-02-12 08:37:38 |
|||
| карма: 1 |
|
|
Ответов: 4673
Рейтинг: 768
|
|||
Если сначала нажать "Не работает", то можно увидеть что таймер не запустился, как и предполагалось. Если после этого нажать "Работает" - то таймер все равно не запустится. Более того, после уже ни один таймер не запустится. Если же сначала нажать "Работает" или "Работает 2", то после этого будут работать все таймеры, даже из параллельного потока без Synchronize/DeferredEvent. Причина в том, что для получения событий таймер создаёт окно, куда приходят сообщения. Окно создается 1 раз на всю программу при первом включении любого таймера. И если первый раз таймер включить из параллельного потока, то окно создаётся из этого потока и сообщения приходят в очередь этого же потока. Но параллельный поток не для того создавался и не подозревает, что ему нужно обрабатывать оконные сообщения. После того как поток завершится, сообщения окна таймера вообще некому обрабатывать и все последуюшие таймеры перестают выдавать события. Когда же мы первый раз включаем таймер кнопкой или Synchronize/DeferredEvent - это происходит из главного потока (который создавался при запуске программы). Этот поток занимается обработкой сообщений от элементов пользовательского интерфейса, в том числе и от окна таймера. А сообщения окну таймера приходят в этот главный поток и всё работает как надо. MMTimer не имеет такой особенности, так как работает по другому принципу. Редактировалось 2 раз(а), последний 2026-02-15 19:06:59 |
|||
| карма: 26 |
|
|
Разработчик
Ответов: 26328
Рейтинг: 2148
|
|||
|
Netspirit писал(а): Synchronize/DeferredEvent - это происходит из главного потока (который создавался при запуске программы)Тут немного уточню. DeferredEvent создает окно верхнего уровня при создании программы и не зависит от параллельных потоков, созданных позднее, а значит, должен отрабатывать без проблем сообщения из параллельных потоков. К тому же, он ставит сообщения в следующую очередь обработки, те все его сообщения отложенные. |
|||
| карма: 22 |
|
7



Поиск
Друзья
Администрация