0

アプリケーションをwinformするためのC#プログラムがあります。これは、記憶ゲームとして意図されています。まず、内部に値の数を含むマトリックスを表示する必要があります。3 または 4 と言ってください。ユーザーがメモリに保存できるように、マトリックスをしばらく一時停止する必要があります。そのために、thread1 を使用します。次に、マトリックスを空白にして、フォームの右側のパネルにいくつかのオプションを表示する必要があります。これは Thread2 を使用して行われます。問題は、実際には thread2 が最初に実行されることです。誰でも私を助けてくれますか.私はC#が初めてです...

Thread Thread1 = new Thread(new ParameterizedThreadStart(invokedisplaymatrix));
Thread1.IsBackground = true;
Thread1.Start(MatrixInfoValues);


            Thread Thread2 = new Thread(new ThreadStart(invokedisplayblankmatrix));
            Thread2.IsBackground = true;
            Thread2.Start();
}

 private void invokedisplaymatrix(object indx)
            {
    Invoke(new displaymatrixdelegate(displaymatrix),new object[] {indx});

Thread.sleep(5000);
              }

private void invokedisplayblankmatrix()
        {
Invoke(new displayblankmatrixdelegate(displayblankmatrix));
         }...

.. public delegate void displaymatrixdelegate(int[] ind1);
    public delegate void displayblankmatrixdelegate();
}//end of main form
4

4 に答える 4

5

Thread2 を作成し、invokedisplaymatrix の最後で開始します。

ただし、同時実行が意図されていないのに、なぜスレッドを使用しているのかわかりません。

于 2012-06-04T11:43:39.600 に答える
2

TPLを参照してください。タスクは、すぐに使用できるシナリオをサポートします ( ContinueWithメソッドを使用)。

ただし、ここで 2 つのスレッドが必要な理由はわかりません。スレッドは、並列作業を行うときに使用するのに適していますが、ここではそうではありません。

于 2012-06-04T11:43:18.760 に答える
0

AutoResetEvent を使用して実装する必要があります。

そう...

var sync = new AutoResetEvent();

var thread1 = new Thread(new ParameterizedThreadStart(invokedisplaymatrix));
thread1.IsBackground = true;
thread1.Start(MatrixInfoValues);


thread Thread2 = new Thread(new ThreadStart(invokedisplayblankmatrix));
thread2.IsBackground = true;
thread2.Start();

private void invokedisplaymatrix(object indx)
{
  Invoke(new displaymatrixdelegate(displaymatrix),new object[] {indx});
  Thread.sleep(5000);
  sync.Set();
}

private void invokedisplayblankmatrix()
{
  sync.Wait();
  Invoke(new displayblankmatrixdelegate(displayblankmatrix));
}

ただし、このケースを実装するために個別のスレッドは必要ありません。これは単純な 1 つのスレッド タスクです。

于 2012-06-04T12:27:59.783 に答える
0

Look at System.Threading.Semaphore:

in this sample we need to run "work2" delegate fisrt:

static void Main(string[] args)
{
   var sem = new Semaphore(0, 1);

    Action<object> work1 = o =>
    {
        sem.WaitOne();
        Console.WriteLine("enter " + o);
        Thread.Sleep(2000);
        Console.WriteLine("exit " + o);
    };

    Action<object> work2 = o =>
    {
        Console.WriteLine("enter " + o);
        Thread.Sleep(2000);
        Console.WriteLine("exit " + o);
        sem.Release();
    };

    work1.BeginInvoke("first", ar => { }, null);
    work2.BeginInvoke("second", ar => { }, null);       

    Console.ReadKey();
}
于 2013-06-19T09:40:50.000 に答える