2011-08-10 11 views
1
public void timer_thing() 
{ 
    Thread timer = new Thread(new ThreadStart(() => 
     { 
      Thread.Sleep(500); 
      if (is_mouse_down) 
       timer1.Enabled = true; 
     } 
    )); 
    timer.Start(); 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    //some stuff happens here 
} 

ご覧のとおり、スレッドがタイマーをアクティブにします。しかし、タイマーは作動しません。私はこれが正しい方法ではないと思う。それとも私は何かが欠けている。C#WinForms:スレッドからタイマーをアクティブにする

答えて

1

is_mouse_downfalseである可能性があります。スレッドがその命令にヒットしたとき。スレッドは魔法のようにそれがtrueになるのを待つつもりはありません。

しかし、別の大きな問題があります。つまり、ワーカースレッドやUIスレッド以外のUI要素には触れないということです。これにはSystem.Windows.Forms.Timerが含まれます。すべての種類の未定義の混乱が続くかもしれません。あなたのアプリケーションは、予期せず、壮観に失敗するかもしれません。

最初にスレッドが必要な理由はわかりません。 Control.MouseDownイベントを処理できず、そのイベントのイベントハンドラでタイマーを有効にすることはできますか?それが私が問題を解決する方法です。 、あなたのスレッドを

1)アクティブ

2)通知

あなたが本当に時代遅れの一つであり、アクティブ待機ソリューションを(必要な場合

を待っている:

+0

Control.MouseDownイベントがスレッドをアクティブにします。私は2つのタイマーを使用してみました(最初のタイマーはしばらくしてから2番目のタイマーを起動し、それ自身を非アクティブにします)。しかし、私がタイマでThread.Sleep(int)を使用すると、プログラム全体が一時停止します。だから、私はスレッドで試しています。 – AlexSavAlexandrov

+0

したがって、 'MouseDown'イベントから、500ms待つタイマー' A'をアクティブにします。 'Tick'イベントがタイマーAから来たら、タイマーBを起動することができます。 –

+0

何かをする前にタイマーをしばらくお待ちください...しかしどうですか?私は、タイマでThread.Sleep(int)を使用すると、プログラム全体が一時停止すると書いていました。そして、タイマーを動作させる前にタイマーを待つように教えてください...私はC#で実際に経験していないので、短い答えでいつも助けになるとは限りません。 – AlexSavAlexandrov

1

スレッドはis_mouse_downイベントを待っていません。それはちょうど0.5秒後にチェックし、時間がない場合は有効にならず、トレッドは閉じます。あなたはイベントを使ってみるべきでしょうか?

+0

「if(is_mouse_down)」行を削除してみました。しかし、それは動作しませんでした。 – AlexSavAlexandrov

0

AutoResetEventを使用すると、ボタンクリックハンドラから自動的にトリガすることができます。

だけ設定だから、スレッドで:

autoResetEvent.WaitOne(); 
timer1.Enabled = true; 

とボタンのクリックハンドラで:

autoResetEvent.Set(); 

ところで、なぜあなたはクリックハンドラ内でタイマーを初期化することはできませんか?

0

文献に記載されるよう、この問題は、二つの解決策を持っていますwhileループを持つ必要があります)。

あなたは、あなたがthis記事をお読みくださいマルチスレッドのC#について質問がある場合は、マウスダウンイベントハンドラ

0

にタイマーを開始し、いくつかのメソッドを呼び出す必要があります通知をしたい場合。これは本当に役に立ち、AutoresetEvent、ManualResetEvents、スレッドタイマー、タイマーなどを表示します。本当に良い一般的な記事です。

0

タイマーオブジェクトを宣言するときにtimer1_Tickコールバックを渡す必要があります。

関連する問題