Я должен выполнить некоторый код в контексте основного потока.Я использую Lazarus + FPC.Я получаю событие из потока внутри DLL (разделяемой библиотеки, если в Linux), и вызывается моя функция обратного вызова.Обратите внимание, что эта функция не является членом какого-либо класса, но представляет собой отдельную традиционную функцию с присоединенной директивой "cdecl".
Мне нужно вызывать обработчик события свойства coresponding для каждого такого сообщения, которое я получаю.И эти события должны быть переданы в контексте основного потока.Я знаю два таких решения:
- PostMessage
- Application.QueueAsyncCall
Первое решение в порядке, но для него требуется дескриптор окна.А поскольку это код библиотеки, дескриптор недоступен.AllocateHWND не вариант, так как он не кроссплатформенный.Я знаю, что могу создать фиктивную форму, но это очень плохое решение
Второе работает нормально, но у меня есть проблема, что вызов не обрабатывается, пока я, например, не перемещаю мышь внутри приложения.Может быть, я делаю что-то не так, я не знаю.Я точно так же, как мой вызов обрабатывается только тогда, когда начинается обработка сообщения. Но, очевидно, это может быть долгим ожиданием.
Поэтому я хочу знать, какое решение лучше здесь (вероятно, QueueAsyncCall) и как я могубыть уверенным, что мое сообщение (звонок) будет обработано в приемлемые сроки?