0

画像処理を行うコードをc#で書いています。スレッドを使用したいのですが、WPF アプリケーションでのスレッドは少し違うと思います。スレッドを実行しようとしましたが、関数が void() の場合、つまり引数を取らない場合にのみ機能します。

ただし、私の関数はこのような3つの引数を取ります

frame_extract.Frame_Processing(_colorFrame_, widht, height);

したがって、以下は機能しません

depth_Threads = new System.Threading.Thread(**) since ** takes on void() type.

おそらく私は何かが欠けていますが、私の質問は、引数を取る関数のスレッド化をどのように処理できるかです。

4

5 に答える 5

2

多分あなたはTPLを使うことができます。

次に、次のようになります。

Task.Factory.StartNew(() => frame_extract.Frame_Processing(_colorFrame_, widht, height));

ただし、UI スレッドにマーシャリングする必要がある場合があることに注意してください。

ui スレッドでスレッドを作成し、新しいスレッドが前述の ui スレッドと対話するようにするには、次のようにします。

var task = new Task(() => frame_extract.Frame_Processing(_colorFrame_, widht, height));
task.Start(TaskScheduler.FromCurrentSynchronizationContext());

それはうまくいくはずです。

于 2013-06-12T10:05:28.723 に答える
1

それがあなたが望むものかどうかは100%わかりませんが、これを行う必要があると思います:

depth_Threads = new System.Threading.Thread(()=>frame_extract.Frame_Processing(_colorFrame_, widht, height));
于 2013-06-12T10:06:05.520 に答える
0

以下をせよ。メソッドは、このような単一のオブジェクト引数を受け取る必要がありますvoid SomeVoid(object obj)SomeVoidこのようにメソッドに渡したいすべての変数を含むオブジェクト配列を作成し、Start() メソッドは 1 つのオブジェクト パラメータを受け取るため、スレッド オブジェクトの Start メソッドを引数object[] objArr = { arg1, arg2, arg3 };付きで呼び出します。objArrメソッドに戻り、Start メソッドから受け取ったキャストと obj を次のようにオブジェクト配列に変換すると、これらの 3 つの引数に次のようにobject arr = obj as object[];アクセスできます。arr[0] arr[1]arr[2]

于 2013-06-12T10:17:14.977 に答える
0

渡す値によって異なります。オブジェクトを使用している場合、特定のスレッドにロックされることがあります。この場合、事前に複製を作成してから、複製を新しいスレッドに渡す必要があります。

于 2013-06-12T10:06:03.537 に答える
0

ParameterizedThreadStartクラスを使用できます。

1)3つの引数を保持するクラスを作成します

 public class FrameProcessingArguments
 {
     public object ColorFrame { get; set; }
     public int Width { get; set; }
     public int Height { get; set; }
 }

2)Frame_Processingメソッドを変更して、インスタンスをパラメーターとして取り、Objectその内部でそのインスタンスをキャストしますFrameProcessingArguments

if (arguments == null) throw new NullArgumentException();
if(arguments.GetType() != typeof(FrameProcessingArguments)) throw new InvalidTypeException();
FrameProcessingArguments _arguments = (FrameProcessingArguments) arguments;

3) スレッドを作成して開始する

FrameProcessingArguments arguments = new FrameProcessingArguments() 
{
     ColorFrame = null,
     Width = 800,
     Height = 600
}

Thread thread = new Thread (new ParameterizedThreadStart(frame_extract.Frame_Processing));
// You can also let the compiler infers the appropriate delegate creation syntax:
// and use the short form : Thread thread = new Thread(frame_extract.Frame_Processing);
thread.Start (arguments);
于 2013-06-12T10:17:16.763 に答える