1

10 個のスレッド + タスク リストを作成するスレッドを作成する Windows サービスがあります。

これらの 11 のスレッドはそれぞれ、CoInitialize(nil) を呼び出すことによって STA に入ります。

  1. タスク リストは 1 つのスレッドによって作成され、他のスレッドはアイテムを取得し、処理して解放します ....

a) 他のスレッドは、他のスレッドによって作成されたオブジェクトを使用できますか? (それはうまくいくようですが..) b)他のスレッドは、他のスレッドによって割り当てられたメモリを解放できますか?(それはうまくいかないようです...)

どうにかしてスレッド間でポインターをマーシャリングする必要がありますか? または、少なくともアイテムを取得して処理する必要がありますが、それを作成したスレッドの「所有者」として解放する必要がありますか?

  1. 私のWindowsサービスでは、サービスを開始/停止するために使用できる機能を作成しました(スレッドの一時停止と再開)。

ただし、実際にデータを収集して間隔で実行するスレッドに問題があります。スレッドが処理する項目をロードすると、その後 5 分間スリープ状態になります。そのようなスレッドを安全に終了するにはどうすればよいですか? スリープ状態を中止するには?

よろしくお願いします。

4

2 に答える 2

2

STA スレッド間で STA オブジェクト ポインタをマーシャリングするにはCoMarshallInterThreadInterfaceInStream、 と を使用しCoGetInterfaceAndReleaseStreamます。

STA スレッドは、Windows メッセージを使用して STA スレッドが COM を使用する方法であるため、メッセージをポンプする必要があります。つまり、GetMessage/TranslateMessage/DispatchMessage を呼び出す必要があります。おそらく、フレームワークには、これを行うために使用できる単純なメッセージ ポンプ関数があります。

5 分間のスリープ状態を中止するには、より短い間隔で複数のスリープを実行し、"shouldquit" フラグをチェックします。Service Main で shouldquit フラグを設定します。

于 2011-03-13T10:22:05.310 に答える
2

スレッド間でインターフェイスをマーシャリングする必要がある場合があります。ここに C++ の例があり、同じ記事で使用できる 3 つの手法が示されています (oMarshalInterThreadInterfaceInStream/CoMarshalInterface/Global Interface Table(GIT))。それらの詳細については、MSDN を参照してください。

スレッドを待機させるが、スリープが終了する前にスレッドを終了できるようにするには、WaitForSingleObject() を適切なタイムアウト値と、たとえば待機する Windows イベントと共に使用します。関数が終了すると、タイムアウトが経過したか、イベントが設定されたために終了したかどうかがわかります。タイムアウトに達する前に待機関数を終了するには、単純にイベントを設定します。これにより、別の待機ループに入るか終了するかを選択できます。

于 2011-03-13T11:53:05.067 に答える