2

メッセージを受信するたびにメッセージを送り返す Skype API を使用しています。これが本当に原因かどうかはわかりませんが、私が得ることができる最も近いものです.メッセージを送信しすぎると、COM コントロールはすべての応答を処理できず、アプリ全体がクラッシュします. forこれは、ループを使用すると発生します。

スレッドを使用して仕事をしているので、プログラムはハングしません。私Sleep();はスレッドでできることを知っており、プログラム全体をスリープ状態にする (べきではない) ことはありません。ただし、問題は、COM コントロールもスリープ状態になるため、必要なものを処理できず、再び追いつくことができることです。

問題は、スレッド全体を一時停止せずにルーチンを一時停止して、オーバーロードせずに COM オブジェクトで応答を処理できるようにするにはどうすればよいかということです。

4

4 に答える 4

4

CoWaitForMultipleHandlesを使用してスレッドをブロックできますが、それでも COM メッセージ (STA の場合) やその他の Windows メッセージをポンプし、タイムアウトがあります。何か使えそうですね。

于 2011-03-22T21:36:34.097 に答える
1

私はそのような場合に TSimpleEvent を使用する傾向があります。一定時間 (タイムアウト) スレッドをブロックする場合がありますが、外部でスレッドを起動することもできます (たとえば、Terminate の呼び出しの直前)。CPUはかかりません。他のスレッドからの呼び出しによってブロック解除される場合があります。これは、5 秒ごとに起動して何かを実行するなど、タイミングが合っているかのように動作する必要があるスレッドに使用します。

*)正確な問題はわかりませんが、スリープせずにスレッドを一時停止することが私が答えたものです。ソリューション (の一部) として使用できるかもしれません。頑張ってください。

于 2011-03-22T20:13:54.333 に答える
0

スレッドは、常にメッセージを送信するのではなく、呼び出されるたびにメッセージを送信する必要があるかどうかをテストする必要があるようです。

これを行う方法は実装によって異なります。満たす必要があるある種の条件 (サイズのしきい値、したがって、自明なほど小さいメッセージを送信することはありません) がある場合や、レート制限 (最後に送信されたメッセージが十分に前に送信されたかどうかを確認して、送信する余裕があるかどうかを確認してください) がある場合があります。別)。

これがお役に立てば幸いです。非常にレベルが高いことが分かります。

于 2011-03-22T19:06:00.637 に答える
0

このコンシューマー/プロデューサーの例のように、送信用と受信用に 1 つずつ、2 つのスレッドを使用してロックできますか( Delphi 2009 以降の場合は「Delphi での保護されたブロックによるスレッドの同期」)。消費者がそれを処理したときにプロデューサーによって送信されますか?

于 2011-03-29T20:21:15.880 に答える