メインスレッドのコンテキストでコードを実行する必要があります。Lazarus + FPC を使用しています。DLL (Linux の場合は共有ライブラリ) 内のスレッドからイベントを受け取り、コールバック関数が呼び出されます。この関数はどのクラスのメンバーでもなく、「cdecl」ディレクティブが付加されたスタンドアロンの従来の関数であることに注意してください。
このようなメッセージを受信するたびに、対応するプロパティ イベント ハンドラーをトリガーする必要があります。これらのイベントは、メイン スレッドのコンテキストで渡す必要があります。私は2つのそのような解決策を知っています:
- 投稿メッセージ
- Application.QueueAsyncCall
最初のものは問題ありませんが、ウィンドウ ハンドルが必要です。これはライブラリ コードであるため、使用できるハンドルはありません。AllocateHWND はクロス プラットフォームではないため、オプションではありません。ダミーフォームを作成できることは知っていますが、これは非常に悪い解決策です
2番目は問題なく動作しますが、たとえばアプリケーション内でマウスを移動するまで呼び出しが処理されないという問題があります。たぶん、私は何か間違ったことをしているのかもしれません。メッセージ処理が開始されたときにのみ通話が処理されているようです。しかし、これは明らかに長い待ち時間になる可能性があります。
したがって、ここでの最善の解決策 (おそらく QueueAsyncCall) と、メッセージ (呼び出し) が許容時間内に処理されることを確認する方法を知りたいですか?