Преобразование кода C # в Delphi, что эквивалентно SafeWaitHandle?

Я пытаюсь преобразовать проект C # в Delphi, сам код C # импортирует функции из собственной dll, позвольте нам назвать его dmp.dll, у меня нет подписи его собственных функций, и я должен посмотреть, как эти функции импортируются в C # и пытаются импортировать их в код Delphi, и я действительно импортировал их много, и они работают нормально, но теперь я борюсь с этой функцией (StartLogging). Вот как они импортированы в C #:

[DllImport("dmp.dll", CharSet = CharSet.Auto, EntryPoint = "StartLogging")]
public static extern int StartLogging(String AdapterName, 
  PLOG_RECORD_CALLBACK LogRecordCallback, 
  SafeWaitHandle StopLoggingEvent);

нет проблем с PLOG_RECORD_CALLBACK, но проблема в этом параметре SafeWaitHandle, который является классом, существующим в пространстве имен Microsoft.Win32.SafeHandles. Как его перенести на Delphi? Какой тип данных эквивалентен ему в Delphi?

И вот как они используют это в коде C #:

AutoResetEvent StopEvent = new AutoResetEvent(false);

Класс AutoResetEvent существует в System.Threading Затем они вызывают метод следующим образом:

StartLogging(comboBox1.Text, CallbackProcedure, StopEvent.SafeWaitHandle);

Затем, наконец, чтобы остановить ведение журнала, они используют:

StopEvent.Set();

Я действительно сбит с толку и не знаю, как это сделать, благодарю за вашу помощь. Спасибо


person Robin-Hood    schedule 22.11.2011    source источник
comment
В этом случае это звучит как дескриптор события. Возвращается CreateEvent API. Не могу вспомнить, предлагает ли Delphi RTL оболочку TEvent.   -  person David Heffernan    schedule 23.11.2011


Ответы (2)


Вероятно, вы можете использовать SyncObjs TEvent. Если вы создадите его с аргументом ManualReset, установленным на False, он должен работать примерно так же. Просто передайте Event.Handle (который является THandle и совместим со всем в API, ожидающем его).

У меня нет примера использования события сброса без ручного сброса, но пример создания TEvent можно найти в принятом ответе здесь; чтобы сбросить его не вручную (IOW, AutoReset), просто измените второй параметр на False.

person Ken White    schedule 23.11.2011
comment
+1 Но было бы хорошо, если бы вы определили, как воспроизвести AutoResetEvent в Delphi и что SafeWaitHandle является дескриптором события win 32. Поэтому я только комментировал. - person David Heffernan; 23.11.2011
comment
TLightweightEvent - это событие ручного сброса без дескриптора ожидания. Не могу использовать это здесь. TSimpleEvent идентичен TEvent: TSimpleEvent = class(TEvent); Ответ TEvent создан с ManualReset, установленным на False. Я не буду публиковать ответ, потому что вы уже сделали это, но, на мой взгляд, вам нужно улучшить его. - person David Heffernan; 23.11.2011
comment
@ Дэвид: Лучше? Я бы хотел, чтобы он был более полным с примером использования события, но сейчас нет времени. Если вы хотите опубликовать лучший ответ, я позже удалю свой. - person Ken White; 23.11.2011

Как сказал Дэвид Хефферман в ответ на утвержденный ответ: TSimpleEvent (System.SyncObjs) работает так же, как AutoResetEvent в C #.

Его можно использовать как:

_WaitEvent := TSimpleEvent.Create(nil, resetmanual {boolean}, false, '', false);
_WaitEvent.SetEvent;
_WaitEvent.WaitFor;

Если вы используете ручной сброс, просто используйте: _WaitEvent.ResetEvent;

person JvA    schedule 16.01.2018