2011-04-20 13 views
13

こんにちは、私はタイマーに関連するいくつかの問題に足を踏み入れました。 希望の誰かが..Cで別のスレッドからタイマーを起動する#

  1. を助けることができる私は
  2. ボタン私はそのボタンをクリックしたとき、私はパラメータ化スレッド
Thread thread1 = new Thread(new ParameterizedThreadStart(execute2)); 
thread1.Start(externalFileParams); 
  1. コードを開始を含むWindowsフォームを持っていますスレッド内は非常にうまく実行されます
  2. このスレッドの最終行で私はタイマーを開始します

public void execute2(Object ob) 
{ 
    if (ob is ExternalFileParams) 
    { 
     if (boolean_variable== true) 
      executeMyMethod();//this also executes very well if condition is true 
     else 
     { 
      timer1.enabled = true; 
      timer1.start(); 
      } 
     } 
    } 
} 

5が、タイマーのTickイベントは、私はVS2008 3.5フレームワークに取り組んでいます

を解雇されていません。私は、ツールボックスからタイマーをドラッグし、300からIntervalEnabled真/偽 方法がtimer1_Tick(Object sender , EventArgs e)ですが、誰も私が間違っているのものを提案することができます

を発射しないでその設定しようとしたその設定されていますか?

+2

これは、あなたが望むものを達成するための最良の方法であるとはほとんど考えられません。進行中のフォームを更新する必要がある長期実行タスクがある場合は、BackgroundWorkerを使用するとよい方法です。より多くの手動制御が必要な場合は、プールスレッド(ThreadPool.QueueUserWorkItemを参照)が独自のスレッドを作成するよりも優れています。 –

+0

あなたは、ホストフォーム/コントロールのスレッド上でtimer.startを呼び出す必要がありますが、それを行うのは厄介な方法です。適切なデリゲートを呼び出すには、 'Control.BeginInvoke'を使います。 – Jodrell

答えて

18


あなたは、タイマーをこのように起動しようとすることができます:

はフォームコンストラクタで、この追加:

System.Timers.Timer aTimer = new System.Timers.Timer(); 
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
// Set the Interval to 1 second. 
aTimer.Interval = 1000; 

をForm1に、このメソッドを追加します。ボタンクリックイベントで

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    //do something with the timer 
} 

をこれを追加:

aTimer.Enabled = true; 

このタイマーは既にスレッド化されているので、新しいスレッドを開始する必要はありません。

3

System.Windows.Forms.Timerはシングルスレッドアプリケーションで動作します。このリンク

チェック:

備考氏は述べています:

Aタイマーは ユーザ定義の間隔でイベントを発生させるために使用されます。このWindows タイマーは、 シングルスレッド環境で、 スレッドを使用して の処理を実行するように設計されています。ユーザー コードには利用可能なUIメッセージポンプ があり、常に同じ スレッドから操作するか、または別のスレッド に呼び出しをマーシャリングする必要があります。

詳細については、「備考」を参照してください。このタイマーをUIスレッドと同期させることをお勧めします。

+0

解決策があります。私の答えは – 321X

+0

です。私の最後の文章を読んでください(それは1時間ありました!!)とにかくありがとう! –

+0

ハハ:-)私の悪い! – 321X

7

MatíasFidemraizerは言うとおりです。しかし、回避策があります。

フォーム上に呼び出し可能なコントロール(ステータスバーなど)がある場合は、そのコントロールを呼び出してください。

C#コードサンプル:

private void Form1_Load(object sender, EventArgs e) 
{ 
    Thread sampleThread = new Thread(delegate() 
    { 
     // Invoke your control like this 
     this.statusStrip1.Invoke(new MethodInvoker(delegate() 
     { 
      timer1.Start(); 
     })); 
    }); 
    sampleThread.Start(); 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    MessageBox.Show("I just ticked!"); 
} 
1

私はBackgroundWorker(代わりにスレッドの)を使用します。メインスレッドは、作業者のRunWorkerCompleted eventを購読します。スレッドが完了すると、メインスレッドでイベントが発生します。このイベントハンドラを使用して、タイマーを再起動します。

関連する問題