Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как отловить одновременно два события [D7, WinXP]


Ка ©   (2005-08-12 11:36:00) 

В программе необходимо реализовать, что бы определённый код, выполнялся только если одновременно произойдёт два события причём у разных компонентов. Как можно одновременно отловить два события ?


pasha_golub   (2005-08-12 12:11:00) [1]

Digitman ©   (12.08.05 12:06) [5]
Мощно! Уважаю!


Digitman   (2005-08-12 12:06:00) [2]

var
 hEvents: array[0..1] of THandle;
..
hEvents[0] := CreateEvent(nil, True, False, nil);
hEvents[1] := CreateEvent(nil, True, False, nil);

..

while not Application.Terminated do
case MsgWaitForMultipleObjects(2, hEvents, True, INFINITE, QS_ALLINPUT) of
 WAIT_OBJECT_0: begin
                  ResetEvent(hEvents[0]);
                  ResetEvent(hEvents[1]);
                  SendMessage('На сей момент произошли Исобытие 0 Исобытие 1 !')ж
                  break;
                end;
 WAIT_OBJECT_0 + 2: Application.ProcessMessages;

...
procedure TForm1.SomeEventHandler0(..);
begin
SetEvent(hEvents[0]);
end;

procedure TForm1.SomeEventHandler0(..);
begin
SetEvent(hEvents[1]);
end;


pasha_golub   (2005-08-12 11:55:00) [3]


Var EventFlag: boolean
   EventTime: cardinal;

const Epsilon = 100000;

procedure TForm1.Button1Click(Sender: TObject);
begin
EventFlag := True;
EventTime:= GetTickCount;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
If EventFlag and (GetTickCount - EventTime <= Epsilon) then
 begin
  EventFlag := False;
  DoMyStuff;
 end;
end;


vrem   (2005-08-12 11:48:00) [4]

одновременно отловить <> одновременно произошли
определить сколько это в мсек - "одновременно", сравнивать


KilkennyCat   (2005-08-12 11:47:00) [5]

А вообще - два потока и один флаг. Первый компонент в своем потоке по событию изменяет состояние флага, второй в своем потоке по своему событию проверяет состояние флага. При совпадении - можно считать, с определенной погрешностью, что получилось одновременно.


KilkennyCat   (2005-08-12 11:44:00) [6]

В теории, если они меняют какой-то бит в памяти (каждое - свой) то логическое сравнение позволяет отловить их одновременно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо