2016-04-14 11 views
0

まずは、私は非常に熟練したプログラマーです。私は学士号プロジェクトのための簡単な音楽アプリの基盤を構築しています。私の質問は、整数値を1つ増やすことを意味する内部クロックメソッドに関するものです。BPM分。RichTextBox.Textを2秒に2回更新するスレッドは機能しません。

私はinternalClockクラスを作成しました:

public class internalClock 
{ 

    // THIS METHOD WILL BE CALLED WHEN THE THREAD IS STARTED 
    public static void clockMethod() 
    { 
     int BPM = 135; 
     int clockTick = 1; 
     Form1 clockForm = new Form1(); 
     // infinite loop 
     while (true) 
     { 
      if (clockTick == 8) 
      { 
       clockTick = 1; 

      } 
      else 
      { 
       clockTick++; 

      } 

      clockForm.metrobox.Text = clockTick.ToString(); 
      Thread.Sleep(60 * 1000/BPM); 
     } 


    } 
} 

これは、私は、リッチテキストボックス自体へのアクセスを得ることができた方法です:メインの 'Program.csの' I」で

public RichTextBox metrobox 
    { 

     get { return metroBox; } 
     set { metroBox = value; } 

    } 

プログラムが終了するまでclockMethodを実行する別のスレッドを開始するためのものを記述しました。

// THREADING 
     // Create a thread 
     internalClock oClock = new internalClock(); 
     Thread oClockThread = new Thread(new ThreadStart(internalClock.clockMethod)); 
     // Start the internalClock thread 
     oClockThread.Start(); 

RichTextBox内のテキストを更新しないでください。また、別のスレッドを作成せずにclockMethod()を呼び出すと、アプリケーションがフリーズします。私のアマチュアの質問に申し訳ありません、私はちょうどC#(ええと、私のユニは役に立たない)で始まっています。私のコードで何が間違っていますか?

+0

スレッド/無限ループを使用しないで、特別なクラスがあります。 [**タイマー**](http://www.c-sharpcorner.com/UploadFile/mahesh/C-Sharp-timer/) – Eser

+0

しかし、他の方法などと同時に作業することはできますか? – Yurieff

+0

Timerクラスの基本的な使い方については、[ここ](https://msdn.microsoft.com/en-us/library/system.timers.timer.elapsed(v = vs.110).aspx)を参照してくださいTimer.Elapsedを使用します(これはあなたが望むものです)。編集:Eserによって提供された前のリンクは本質的に同じ情報を持っています。 – pay

答えて

0

上記のコードにはいくつかの問題がありますが、特定の間隔または特定の「チック」で処理するフォームに追加できるタイマーコントロールをチェックすることをおすすめします。 MSDN Form Timer

タイマーを使用すると、そのクラスを削除して新しいスレッドなどを呼び出すことができます。私は、指定されたリンクのTimerクラスを読んで、アプリケーション構造をどのように再構築できるかを考えますそれ。そのスレッドがうまくいかない理由のコンセプトは、あなたがどこにいるのか、率直にはそれほど重要ではありません。私はあなたが今は自分がしたいことを既に行っているツールに焦点を当てる必要があると思っています。私はこれがタイマーだと信じています。

通常、.NETでrawスレッドを作成する必要はありません。 .NET 4.0以降、タスクと呼ばれるタイプにアクセスして、マルチスレッドのロジックと処理を実行できます。後でそれを行う必要があることがわかったら、それをチェックしてください。 Task Type MSDN

+0

ありがとう!非常に役立ちます! – Yurieff

+0

@Yurieff問題ありません。この回答が十分な解決策であれば、受け入れることを忘れないでください!ありがとう。 – davidallyoung

+0

Timerの利点は、間隔を60 * 1000/BPMに設定でき、Tickイベントが60 * 1000/BPM msごとに発生することです。元のコードでThread.Sleepを使用しても、残りのコードの実行時間は考慮されないため、更新間隔は目的のBPMよりも遅くなります。 Tickイベントのコードが間隔よりも長い時間を要した場合、次のイベントを保持しますが、イベント内のコードに応じて実行できる速度の上限があります。 – Marc

関連する問題