Вверх ↑
Этот топик читают: Гость
Ответов: 207
Рейтинг: 14
#1: 2020-10-12 21:29:33 ЛС | профиль | цитата
Подскажите как сделать задержку onEvent2, например, на одну секунду после выполнения onEvent?

Add(InlineCode,8329617,553,294)
{
WorkPoints=#6:doWork|
EventPoints=#7:onEvent|8:onEvent2|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|2: |9: public|23: onEvent:THI_Event;|24: onEvent2:THI_Event;|55: procedure doWork(var Data:TData; Index:word); |5: end;|0:|14:implementation|0:|29:procedure THiAsmClass.doWork;|5:begin|26: _hi_OnEvent(onEvent,'1');|27: _hi_OnEvent(onEvent2,'2');|5: end;|4:end.|
}
карма: 2

0
Ответов: 1926
Рейтинг: 172
#2: 2020-10-13 04:25:14 ЛС | профиль | цитата
Как-то так:
Add(MainForm,2953706,574,217)
{
Position=1
}
Add(InlineCode,8329617,441,224)
{
WorkPoints=#6:doWork|
EventPoints=#7:onEvent|8:onEvent2|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|30:uses kol,Share,Debug,mmsystem;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|2: |9: public|23: onEvent:THI_Event;|24: onEvent2:THI_Event;|55: procedure doWork(var Data:TData; Index:word); |5: end;|0:|14:implementation|0:|29:procedure THiAsmClass.doWork;|22:var FCounter:cardinal;|5:begin|26: _hi_OnEvent(onEvent,'1');|25: FCounter := timeGetTime;|77: repeat {Applet.ProcessMessages} until integer(timeGetTime - FCounter)>=1000;|27: _hi_OnEvent(onEvent2,'2');|4:end;|0:|4:end.|
link(onEvent,15554054:doWork2,[])
link(onEvent2,15554054:doWork3,[(494,237)])
}
Add(HubEx,15554054,490,224)
{
link(onEvent,11666535:doNext,[])
}
Add(Button,15616064,371,224)
{
Left=250
Top=185
link(onClick,8329617:doWork,[])
}
Add(CounterEx,11666535,518,224)
{
link(onNext,2953706:doCaption,[(562,230)(562,223)])
}
Если нужно, чтобы прога на эту секунду не зависала - раскомментируй Applet.ProcessMessages.
ps. Про модуль mmsystem не забывай.

Редактировалось 1 раз(а), последний 2020-10-13 04:25:51
карма: 9
1
Голосовали:Joiner
Ответов: 207
Рейтинг: 14
#3: 2020-10-13 10:30:20 ЛС | профиль | цитата
3042, Спасибо, то что нужно.
карма: 2

0
Ответов: 4628
Рейтинг: 747
#4: 2020-10-13 11:05:45 ЛС | профиль | цитата
Делать задержку путем загрузки процессора ненужной работой - плохо. Для правильной задержки есть процедура Sleep().
карма: 26

0
Ответов: 207
Рейтинг: 14
#5: 2020-10-13 11:35:39 ЛС | профиль | цитата
Netspirit, А можно пример?
карма: 2

0
Ответов: 4628
Рейтинг: 747
#6: 2020-10-13 11:44:05 ЛС | профиль | цитата

procedure THiAsmClass.doWork;
begin
_hi_OnEvent(onEvent,'1');
Sleep(1000);
_hi_OnEvent(onEvent2,'2');
end;
карма: 26

0
Ответов: 207
Рейтинг: 14
#7: 2020-10-13 11:56:37 ЛС | профиль | цитата
Netspirit, Мне нужно асинхронно задерживать события, а со Sleep засыпает вся программа.
карма: 2

0
Ответов: 4628
Рейтинг: 747
#8: 2020-10-13 12:24:41 ЛС | профиль | цитата
Под "всей программой" подразумевается главный поток приложения. Тогда есть такие варианты:
1) Выполнять работу в параллельном потоке, в нём же делать задержки. Тогда главный поток будет работать.
2) Использовать таймер с помощью функций SetTimer()/KillTimer(). Требует иного подхода, чем показано выше, в том смысле что это не "задержка", а вызов функции с некоторым интервалом. Соответственно, нужен подсчет вызовов с реакцией в нужные моменты.
3) Можно мой пример модифицировать, как в самом первом, чтобы немного "разморозить" главный поток. Но выглядит такой подход несколько странно:
procedure THiAsmClass.doWork;
var
I: Integer;
begin
_hi_OnEvent(onEvent,'1');

// 20 задержек по 50 мс = 1000 мс
// После каждой задержки даём главному потоку обработать накопившиеся сообщения
for I := 1 to 20 do
begin
Sleep(50);
Applet.ProcessMessages;
end;

_hi_OnEvent(onEvent2,'2');
end;
Интерфейс может быть немного дерганым, чтобы был более плавным - нужно увеличивать количество циклов и уменьшать значение Sleep. При этом ожидать точности задержки не стоит - в главном потоке может стартовать обработка хоть на минуту, задержав соответственно твой метод.

Редактировалось 3 раз(а), последний 2020-10-13 12:28:24
карма: 26

1
Голосовали:Joiner
Ответов: 207
Рейтинг: 14
#9: 2020-10-13 12:36:44 ЛС | профиль | цитата
Netspirit, Спасибо, отлично работает.
И спасибо за разъяснения!

Редактировалось 1 раз(а), последний 2020-10-13 12:43:36
карма: 2

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