私はタイマを使用して非同期関数を実装したC++ライブラリ(Win32コンソール)を持っています。非同期メソッドは、デバイス情報を返します。Windowsメッセージループを使用したコールバック実装
別のスレッド「タイマースレッド」を作成して非表示のウィンドウを作成した後、SetTimer()
を呼び出して、実装されたメッセージループを呼び出します。
タイマーが期限切れになると、コールバックが有効になります。
コンソールアプリケーションでライブラリを使用するとうまくいきます。
MFCアプリケーションでは、コールバックがトリガされたときにユーザーインターフェイスを更新するためのポストメッセージを出しています。投稿メッセージが機能していません。
ライブラリ内のメッセージループを削除すると、MFCアプリケーションで問題なく動作しています。
私はという結論に来た:私は、問題が原因2つのメッセージにあると思い
は、1 MFC(メインスレッド)とTimerThreadメッセージループをループします。したがって、コールバックが呼び出され、その後のPostMessage
はTimerThreadメッセージループを引き起こし、MFC(メインスレッド)メッセージループでは報告されません。
TimerThreadメッセージループを削除すると、MFCアプリケーションで問題なく動作しますが、コンソールアプリケーションでは機能しません。
どのようにこの問題を解決できますか?私は、コールバックを得るためにIDeviceEnumerationCallback
を実装していますMFC /コンソールアプリケーションで
class IDeviceEnumerationCallback
{
public:
virtual void onDeviceDiscovered(DeviceInfo* pDeviceInfo,unsigned short nNoOfDevice) = 0;
};
class IDeviceDiscovery
{
public:
virtual int InitialiseDiscovery(IDeviceEnumerationCallback*) = 0;
virtual void UnInitialiseDiscovery() = 0;
virtual int EnumerateDevice() = 0;
};
class CDeviceDiscovery:IDeviceDiscovery
{
//Implementation
}
。
私はBonjour APIを使用してデバイスを列挙しています。Bonjour APIのすべてのメソッドはコールバックです。
Bonjour APIを使用してデバイスを列挙してから400 ms後に結果を返すよう呼びかけています。コールバックが呼び出されたときのMFCアプリケーションでは、ユーザーインターフェイスを更新するためにPostMessage()
を実行しています。
私はWindowsメッセージポンプなしで試しました。私はSetTimer
関数を持っていましたが、MFCアプリケーションでは動作していますが、コンソールアプリケーションではコールバックが呼び出されないため、ここでメッセージポンプを実装しました。今はMFCアプリケーションのために働いていません。
あるスレッドから別のスレッド/メッセージループによって管理されているウィンドウにメッセージを投稿するのは問題ありません。ハンドルが正しいと仮定して、WindowProcはOKというメッセージで呼び出されます。 PostMessage()は何を返しますか? –
'SetTimer'は悪名高くねじれていて、エラーを起こしやすいことが知られています。メッセージは投稿されませんが、 'GetMessage'を呼び出したときにのみ作成されますが、キューに優先度の高いメッセージがすでに存在する場合は作成されません(冗談なし)。待機可能なタイマーを使用してください。 – Damon