2016-08-23 6 views
-1

だから、私が持っているものはすべて、スレッドAと呼ばれるSystem.Threading.Threadの参照であり、私は別のスレッド上にあり、スレッドBと言うことができます。スレッドAで少しのコードをしばらく実行してから、元に戻してください。私が持っている参照を使用して、どのように私はそれにアクションを行うスレッドAを呼び出すことができますか?System.Threading.Thread - 操作を実行する

私はC++/cliライブラリを作っています。私のオブジェクトの1つはスレッド親和性を持っています。メソッドに入ると、Dispatcher.Invokeのようにスレッドを交換する必要があります。

void AllegroSharp::Display::DrawToBackBuffer(BitmapImage^ image) 
{ 
    al_draw_bitmap(image->GetBitmap(), (float)image->Rect->Position->X, (float)image->Rect->Position->Y, 0); 
} 

DrawToBackBufferは、スレッドBとal_draw_bitmapに呼び出されるが、私はへの参照を持っているスレッドA、上で呼び出す必要があります。どのようにスレッドAでこれを行うことができますか?スレッドBは、管理されたコードでTask.Runを実行したときにC#が生成したスレッドの一部です。

+0

このWinforms、WPFなどですか? –

+1

*特定のスレッドで任意のコードを実行することは一般的に不可能です。スレッドが協力しない限り、[プロデューサ - コンシューマの問題](https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem)を解決する必要があります。スレッドセーフなキューを取り出し、スレッドを空にするスレッドでループします。どのスレッドもキューにアイテムを追加できます(例:デリゲートオブジェクト)。 GUIプログラムのUIスレッドは、常にそれを解決し、Control :: Begin/Invoke()またはDispatcher :: Begin/Invoke()をとります。おそらくあなたが本当に求めているものでしょう。 –

+0

黒板のデザインパターンはあなたが望むことをしますか? https://en.wikipedia.org/wiki/Blackboard_(design_pattern) – EJoshuaS

答えて

1

スレッドは、最初から最後まで一連の命令を実行します。スレッドAが既に実行されている場合、スレッドAは、開始から終了まで実行するよう指示されたコードを実行します。共有メモリを監視して、次に何をするかの指示がない限り、実行中の内容を変更することはできません。通常、これを実装する方法は、スレッド内でループを実行し、そのループ内でメッセージキューをチェックすることです。次に、他のスレッドがそのキューにメッセージを追加して、ループスレッドが実行できるようにします。それを正しく動作させるためには、もっと多くの詳細がありますが、それは基本的な考え方です。

スレッドAがアプリケーションのGUIスレッドである場合、このメッセージ受け渡しメカニズムはすでに設定されており、Control.Invoke(winforms)またはDispatcher.Invoke(WPF)を使用して、 GUIスレッドを終了し、それが完了するのを待ちます。

編集:この回答は、質問に新しい情報を追加することであまり適用されません。まぁ。

関連する問題