Мне нужно выполнить некоторый код в контексте основного потока. Я использую Lazarus + FPC. Я получаю событие из потока внутри DLL (разделяемая библиотека if on linux), и моя функция обратного вызова вызывается. Обратите внимание, что эта функция не является членом какого-либо класса, а является автономной традиционной функцией с прилагаемой директивой «cdecl».Выполнить код в контексте основной темы (Lazarus)
У меня есть триггер, соответствующий обработчику событий свойств для каждого такого сообщения, которое я получаю. И эти события должны быть переданы в контексте основного потока. Я знаю двух таких решений:
- PostMessage
- Application.QueueAsyncCall
Первый хорошо, но это требует дескриптор окна. И поскольку это код библиотеки, ручка недоступна. AllocateHWND не является вариантом, поскольку он не является перекрестной платформой. Я знаю, что могу создать фиктивную форму, но это очень плохое решение.
Второй работает нормально, но у меня есть проблема, что вызов не обрабатывается до тех пор, пока я, например, не буду перемещать мышь внутри приложения. Может быть, я что-то делаю неправильно, я не знаю. Я точно так же, как мой вызов обрабатывается только тогда, когда обрабатывается обработка сообщений. Но это может быть долгое ожидание.
Итак, я хочу знать, что является лучшим решением здесь (возможно, QueueAsyncCall) и как я могу быть уверен, что мое сообщение (вызов) будет обработано в приемлемые сроки?
Мне хорошо известно, что я не могу быть на 100% уверенным, но мое приложение ничего не делает, и все же вызовы не обрабатываются, пока я не двигаю мышь. Поэтому я лучше с PostMessage. Но недостатком является то, что AllocateHWND еще не реализован в кроссплатформенном виде. Или это? Я думал, что Application.QueueAsyncCall является потокобезопасным. Я проверю реализацию. Спасибо за ответ, хотя. У меня довольно много опыта в многопоточном окружении, но я довольно новичок в Lazarus. При этом проблемы :) – Runner
Ужас :) Это trully ни в коем случае нитевое. Так что есть альтернатива обмену сообщениями, помимо PostMessage. Я имею в виду простой, без IPC или TCP/IP? – Runner
Не совсем. Я предполагаю, что они понесли проблемы с реализацией эмуляции postmessage на других платформах по какой-то причине. –