Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Вниз

Win API   Найти похожие ветки 

 
Тонго   (2006-07-24 01:50) [0]

Добрый день. Помогите с такой ситуацией. Есть DLL-ка ActiveX, в которой два метода WaitEvent – проверяет есть ли Event с именем EvName, если есть то ожидает его, если нет, создает и также ожидает. Второй метод ResEvent- проверяет есть ли Event с именем EvName, если есть то сигналит и закрывает хендл Event-а.
Из другого приложения, в отдельном потоке создается объект DLL-ки и запускается метод WaitEvent. Также в отдельном потоке создается объект DLL-ки и запускается метод ResEvent.
Объясняю в чем проблема. Из программы создается несколько Event-ов с разными именами, и ожидается сигнального состояния конкретного Event-а, но после запуска ResEvent сигналят сразу все Event-ы которые ожидались, хотя должен сигналить один, чье имя было передано.
Подскажите что я не так сделал. Заранее благодарен за ответы.
Код процедур ниже.

Initialization // DLL-ки
 TAutoObjectFactory.Create(ComServer, TRunEvent, Class_RunEvent,
   ciSingleInstance, tmFree);

---------------------------- в DLL --------------------------------
procedure TRunEvent.ResEvent(const EvName: WideString);
var
 hEvent: Cardinal;
 LastError: Integer;
begin
 hEvent := OpenEvent(EVENT_ALL_ACCESS, True, PChar(EvName));

 if hEvent = 0 then
 begin
   LastError := GetLastError;
   MessageBox(0, Pchar("#" + IntToStr(LastError) + ". " +
     SysErrorMessage(LastError)), "AddIn.RunEvent", MB_ICONERROR);
   Exit;
 end;

 if not PulseEvent(hEvent) then
 begin
   LastError := GetLastError;
   MessageBox(0, Pchar("#" + IntToStr(LastError) + ". " + SysErrorMessage(LastError)), "AddIn.RunEvent", MB_ICONERROR);
 end;

 if not CloseHandle(hEvent) then
 begin
   LastError := GetLastError;
   MessageBox(0, Pchar("#" + IntToStr(LastError) + ". " + SysErrorMessage(LastError)), "AddIn.RunEvent", MB_ICONERROR);
 end;
end;

procedure TRunEvent.WaitEvent(const EvName: WideString; var OutStr: WideString);
var
 hEvent: Cardinal;
 LastError: Integer;
 SA: TSecurityAttributes;
 SD: TSecurityDescriptor;
begin
 InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION);
 SA.nLength := SizeOf(SA);
 SA.lpSecurityDescriptor := @SD;
 SA.bInheritHandle := True;

 hEvent := OpenEvent(SYNCHRONIZE, True, PChar(EvName));
 if hEvent = 0 then
 begin
   LastError := GetLastError;
   if LastError <> 2 then  // 2 = нет такого Eventa
   begin
     MessageBox(0, Pchar("#" + IntToStr(LastError) + ". " +
       SysErrorMessage(LastError)), "AddIn.RunEvent", MB_ICONERROR);
     Exit;
   end;

   hEvent := CreateEvent(@SA, True, False, PChar(EvName));
   if hEvent = 0 then
   begin
     LastError := GetLastError;
     MessageBox(0, Pchar("#" + IntToStr(LastError) + ". " +
       SysErrorMessage(LastError)), "AddIn.RunEvent", MB_ICONERROR);
     Exit;
   end;
 end;

 if WaitForSingleObject(hEvent, INFINITE) = WAIT_OBJECT_0 then
  OutStr := "SetEvent "" + EvName + ""."
 else
 begin
   LastError := GetLastError;
   if LastError <> 0 then
     MessageBox(0, Pchar("#" + IntToStr(LastError) + ". " +
       SysErrorMessage(LastError)), "AddIn.RunEvent", MB_ICONERROR);
   OutStr := "Not SetEvent "" + EvName + "".";
 end;
end;

---------------------------- в приложении --------------------------------
// один поток
procedure REv.Execute;
var
 CC: Variant;
begin
 try
   CoInitializeEx(nil, COINIT_MULTITHREADED);
   CC := CreateOleObject("AddIn.RunEvent");
 except
   MessageBox(0, Pchar(SysErrorMessage(GetLastError)), "", MB_ICONERROR);
   CC := Unassigned;
   Exit;
 end;

 CC.WaitEvent(EventName, OutStr);
 Synchronize(UpdateMemo);
 CC := Unassigned;
 CoUninitialize;
end;

// второй поток
procedure RevRes.Execute;
var
 CC: Variant;
begin
 try
   CoInitializeEx(nil, COINIT_MULTITHREADED);
   CC := CreateOleObject("AddIn.RunEvent");
 except
   MessageBox(0, Pchar(SysErrorMessage(GetLastError)), "", MB_ICONERROR);
   CC := Unassigned;
   Exit;
 end;

 CC.ResEvent(EventName);
 CC := Unassigned;
 CoUninitialize
end;


 
KilkennyCat ©   (2006-07-24 03:30) [1]

я б для начала REV.EXecute и RevRes.Execute нормально бы переписал, вспомнив про finally.


 
Тонго   (2006-07-24 06:23) [2]

Переписал, но проблемму это не решет.

// один поток
procedure REv.Execute;
var
 CC: Variant;
begin
 try
   CoInitializeEx(nil, COINIT_MULTITHREADED);
   CC := CreateOleObject("AddIn.RunEvent");
   CC.WaitEvent(EventName, OutStr);
   Synchronize(UpdateMemo);  
 finally
   //MessageBox(0, Pchar(SysErrorMessage(GetLastError)), "", MB_ICONERROR);
   CC := Unassigned;
   CoUninitialize;
 end;
end;

// второй поток
procedure RevRes.Execute;
var
 CC: Variant;
begin
 try
   CoInitializeEx(nil, COINIT_MULTITHREADED);
   CC := CreateOleObject("AddIn.RunEvent");
   CC.ResEvent(EventName);
 finally
   //MessageBox(0, Pchar(SysErrorMessage(GetLastError)), "", MB_ICONERROR);
   CC := Unassigned;
   CoUninitialize;
 end;
end;


 
Сергей М. ©   (2006-07-24 09:54) [3]


> сигналят сразу все Event-ы


Приведи дословно фрагмент лога, подтверждающего это ..



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.044 c
2-1163404646
YOjik
2006-11-13 10:57
2006.12.03
Хочу обрезать начало у файла, ...


4-1153131943
Balkon
2006-07-17 14:25
2006.12.03
Различное поведение различных СОМ портов при асинхронном доступе


6-1152614617
WhiteBarin
2006-07-11 14:43
2006.12.03
Как передать файл через стандартное соединение Windows?


2-1163252466
cc33
2006-11-11 16:41
2006.12.03
class class


3-1159773144
Megabyte
2006-10-02 11:12
2006.12.03
Выборка списка пользователей из rdb$user_privileges





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский