Вверх ↑
Этот топик читают: Гость
Ответов: 1926
Рейтинг: 172
#1: 2017-12-13 15:23:05 ЛС | профиль | цитата
НЕБОЛЬШАЯ СПРАВКА, адаптированная для HiAsm.

Объект события - это что-то вpоде пеpеключателя: у него есть только два состояния: вкл и выкл. Вы создаете объект события и помещаете его в поток, где наблюдаете за состоянием объекта. Если объект события выключен, ждущие его потоки "спят". В подобном состоянии потоки мало загpужают CPU.

Вы можете изменять состояние объекта события с помощью двух методов: doSet и doReset. Функция doSet устанавливает объект события в положение "включенно". doReset делает обpатное.

Когда объект события создан, вы должны поместить вызов WaitObject в поток, который должен следить за состоянием объекта события.

Если указанное вpемя Time пpойдет, а объект события все еще выключен, WaitObject веpнет управление. Если вы хотите, чтобы функция наблюдала за объектом бесконечно, вы должны указать значение -1 в качестве этого паpаметpа.


Вот пример:

Add(Button,1552085,238,189)
{
Left=5
Top=20
Caption="Create"
Data=Integer(1)
link(onClick,743170:doEvent1,[])
}
Add(Message,4787959,574,336)
{
}
Add(Events,6468002,532,189)
{
Point(doDestroy)
}
Add(WaitObject,1779119,532,336)
{
link(onWait,4787959:doMessage,[])
link(ObjHandle,6468002:ObjHandle,[])
}
Add(Thread,1853572,483,336)
{
Delay=0
FastStop=0
link(onExec,1779119:doWait,[])
}
Add(Button,8953745,322,196)
{
Left=5
Top=40
Caption="Set"
link(onClick,4904875:doEvent1,[])
}
Add(Button,9200564,357,217)
{
Left=5
Top=60
Caption="Reset"
link(onClick,10983787:doEvent1,[])
}
Add(Button,10359823,434,336)
{
Left=5
Top=120
Caption="Поток"
link(onClick,1853572:doStart,[])
}
Add(LED,2249643,462,126)
{
Left=70
Top=20
Visible=1
Point(doVisible)
}
Add(Hub,4904875,399,196)
{
link(onEvent1,6468002:doSet,[])
link(onEvent2,2249643:doOn,[(434,209)(434,146)])
}
Add(Hub,10983787,399,217)
{
link(onEvent1,6468002:doReset,[(461,223)(461,209)])
link(onEvent2,2249643:doOff,[(428,230)(428,139)])
}
Add(Hub,743170,287,189)
{
link(onEvent1,6468002:doCreate,[])
link(onEvent2,10481761:doWork2,[(378,153)])
}
Add(Button,3907896,357,259)
{
Left=5
Top=80
Caption="Destroy"
Data=Integer(0)
link(onClick,246742:doEvent1,[])
}
Add(Hub,246742,413,259)
{
link(onEvent1,6468002:doDestroy,[(479,265)(479,216)])
link(onEvent2,10481761:doWork3,[(445,272)])
}
Add(HubEx,10481761,441,147)
{
link(onEvent,2249643:doVisible,[])
}

1. Сначала мы создаём "событие" (Create) - появляется символизирующий его светодиод.
2. Потом запускаем поток. Но так как наше "событие" выключено, поток будет ожидать на компоненте WaitObject.
3. Включаем "событие" кнопкой Set - поток исполняется, появляется сообщение.
4. Теперь при каждом запуске потока включенное "событие" будет его пропускать.
5. Выключаем - Reset. После чего запуск потока опять остановится в ожидании, пока мы опять не включим "событие".
6. Наконец, "событие" можно уничтожить.

Редактировалось 2 раз(а), последний 2017-12-13 15:30:32
карма: 9
0
Ответов: 4628
Рейтинг: 749
#2: 2017-12-13 15:39:25 ЛС | профиль | цитата
Предлагаю голосовать за следующее изменение компонента Events: /post/269657. Нынешняя реализация ну просто капец.
карма: 26

1
Голосовали:andrestudio
Ответов: 1926
Рейтинг: 172
#3: 2017-12-13 16:42:20 ЛС | профиль | цитата
Netspirit, пожалуй, соглашусь, что doCreate, onCreate, doDestroy можно убрать. На мой взгляд, выполнять doCreate для компонента - это то же самое, что выполнять doCreate для поставленного на форму текстового поля (но ведь поле создаётся автоматически!).
Думаю, совместимость не должна пострадать (в старых проектах исчезнут связи к этим точкам, но они уже будут и не нужны).

Редактировалось 1 раз(а), последний 2017-12-13 16:42:38
карма: 9
0
Ответов: 2059
Рейтинг: 132
#4: 2017-12-13 17:25:10 ЛС | профиль | цитата
Я давно применяю модифицированный Events.
А вот
Netspirit писал(а):
Я тут подумал, что можно добавить верхнюю точку, которую при RunEvent=Wait компонент может периодически опрашивать и при получении 1 - прекратить ожидание.
в WinExec решение кажется притянутым.
Это так, к слову.

Редактировалось 5 раз(а), последний 2017-12-13 17:27:27
карма: 6

0
Ответов: 4628
Рейтинг: 749
#5: 2017-12-13 17:38:58 ЛС | профиль | цитата
flint2 писал(а):
в WinExec решение кажется притянутым.
Просто смысл в том, что раз есть ожидание завершения программы, значит должен быть механизм прекращения ожидания.
карма: 26

0
Ответов: 2059
Рейтинг: 132
#6: 2017-12-13 19:10:21 ЛС | профиль | цитата
Сброс ожидания "doResetWait" - это куда ни шло.
А вот мониторить точку, по средствам таймера, или в цикле, как то не очень...

Редактировалось 1 раз(а), последний 2017-12-14 01:05:55
карма: 6

0
Ответов: 4628
Рейтинг: 749
#7: 2017-12-14 11:48:37 ЛС | профиль | цитата
Там ожидание реализуется WaitForSingleObject() по хендлу запущенного процесса. Для того, чтобы реализовать doResetWait нужно создавать отдельный объект Events и ждать по нему и по хендлу через WaitForMultipleObjects(). А в текущей реализации достаточно WaitForSingleObject() с таймаутом в 1 сек поместить в цикл, в котором проверять состояние верхней точки.

Редактировалось 2 раз(а), последний 2019-05-16 11:33:06
карма: 26

0
Ответов: 5227
Рейтинг: 587
#8: 2017-12-14 15:53:43 ЛС | профиль | цитата
Netspirit писал(а):
Предлагаю голосовать за следующее изменение компонента Events: /post/269657. Нынешняя реализация ну просто капец.

Ну я за.
Только маленькое уточнение
Events.ini писал(а):
Name=Имя события. Если задано - компоненты с одинаковыми именами будут срабатывать одновременно.|2|

Тут похоже есть маленькое недоразумение может возникнуть.
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 2059
Рейтинг: 132
#9: 2017-12-14 16:11:10 ЛС | профиль | цитата
и я за.
------------------
Отдельно:
Не плохо сделать компонент, который раздаёт события из одной точки на множество кубиков с одним именем, как хаб, только без проводов. Внешнее оформление, как у LineBreakEx.
карма: 6

0
Ответов: 4628
Рейтинг: 749
#10: 2017-12-14 16:35:16 ЛС | профиль | цитата
andrestudio писал(а):
Тут похоже есть маленькое недоразумение может возникнут
Чтобы не возникало - имя надо оставить пустым, тогда будет работать только данное событие. А срабатывание с одинаковыми именами позволяет синхронизироваться даже разным программам. Кроме того, это не специально в HiAsm так реализовано, это системная фишка.

Если кто-то решит принять изменения Events - там ещё можно свойство Name "особачить" - ну, чтоб на все случаи жизни.
карма: 26

0
Ответов: 1926
Рейтинг: 172
#11: 2017-12-14 19:25:41 ЛС | профиль | цитата
Как я понимаю, доступ к правке SVN есть только у nesco? Тогда мы просим его принять эти изменения: http://forum.hiasm.com/post/269657.

Редактировалось 1 раз(а), последний 2017-12-14 19:27:14
карма: 9
0
Ответов: 4628
Рейтинг: 749
#12: 2017-12-15 12:54:57 ЛС | профиль | цитата
flint2 писал(а):
Я давно применяю модифицированный Events.
А я, кстати, не могу - невозможно выложить в паблик схему с таким компонентом, если у других его нет.

Редактировалось 1 раз(а), последний 2017-12-15 12:55:17
карма: 26

0
Ответов: 2059
Рейтинг: 132
#13: 2017-12-15 13:34:42 ЛС | профиль | цитата
Netspirit писал(а):
А я, кстати, не могу - невозможно выложить в паблик схему с таким компонентом, если у других его нет.

Но у себя то можно, втихоря, только чтобы никто не видел.
карма: 6

0
Ответов: 4628
Рейтинг: 749
#14: 2017-12-15 14:21:35 ЛС | профиль | цитата
Ну, это да. Но опять же, надо иметь 2 HiAsm - один чистый официальный, а второй - с экспериментами и несовместимостями. Иначе придётся периодически менять файлы компонента.

Редактировалось 3 раз(а), последний 2017-12-15 14:27:58
карма: 26

0
Ответов: 2059
Рейтинг: 132
#15: 2017-12-15 15:38:34 ЛС | профиль | цитата
надо иметь 2 HiAsm - один чистый официальный, а второй - с экспериментами

Я делаю так: Переименовываю копи файлов с изменениями в *Ex.pas, *Ex.ini и *Ex.ico(картинку тоже надо поправить для отличия), а в *Ex.pas делаю замену всех name на nameEx.
unit hiCheckBox; -> unit hiCheckBoxEx;
....
type
THICheckBox = class(THIWin) -> THICheckBoxEx = class(THIWin)
...
procedure THICheckBox.Init; -> procedure THICheckBoxEx.Init;
begin begin

И устанавливаю, как новый компонент.
В результате, в одной схеме, можно использовать мод и штатный компонент.

Редактировалось 8 раз(а), последний 2017-12-16 02:45:46
карма: 6

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