2010-12-31 8 views
0

私はタイマーとスレッドに関する質問があります。私は、タイマーがWinformの一部である間に、スレッドがスレッド内で起動したときに、タイマが誤動作していることに気付きました。タイマーとマルチスレッド

一般的に私は、スレッドとタイマーに関連する問題に興味があります。あなたのすべてに

ハッピーニューイヤー、答えは2011年まで待たなければかもしれ:)

答えて

1

あなたがSystem.Threading.Timerを使用し、GUIの更新を行いTimerCallbackを使用しているような音。それですか?

これに対処するにはいくつかの正しい方法があります。 UIを更新する場合は、System.Windows.Forms.Timerを使用し、Tickイベントを処理します。 BackgroundWorkerを使用し、DoWorkイベントで非UI作業を行い、長期実行バックグラウンドタスクを実行している場合は、RunWorkerCompletedイベントでUI更新を実行します。

一般に、Windowsフォームに関するマルチスレッドについて理解することは重要です。すべてのWindowsフォームアプリケーションにはUIスレッドがあります。これはです。スレッドのみがUI更新を実行できます。ユーザーアクションがプッシュされ、イベントを介して処理されるキューを継続的に処理しています。このスレッド以外のスレッドからUIコントロールを更新しようとすると、この動作がWindowsフォームコンポーネントの設計で計画されていないため、例外が発生するため、バグが発生する可能性が高く、アプリケーション全体がクラッシュする可能性があります。

したがって、マルチスレッド化のアプローチは、一般に、作業をバックグラウンド(非UIスレッド)とUIスレッドによって処理されるキューに送信する必要がある作業の2つに分けることです。安全な方法で取り扱うことができます。 System.Windows.Forms.TimerBackgroundWorkerのようなタイプの有用性は、このプロセスの難しい詳細の多くをカプセル化して、実行したいコードに集中できるようにすることです。

これは、Windowsフォームでのマルチスレッドのしくみを説明しています。私は、他の人が、あなたがその主題についてのより多くの情報を指し示す参照をたくさん提供することができると確信しています(そして誰もそうでなければ、後で見ることができるかもしれません)。

+0

私はUIを更新するためにSystem.Windows.Forms.Timerを使用しています。ボタンをクリックすると、スレッドが開始され、そのスレッドから2つのタイマーを開始しています。毎秒1回点滅していて、もう1つは長いティックイベントです。ときどき正しく動作していることもありますが、間違いがあります。 –

+0

プログラムを起動すると、win2の起動時にtimer2が奇妙になりますが、これはコードでまだタイマーを開始しなかったためです。おそらく、Timer Enabledプロパティーをtrue(Enabled世代のElapsedイベント)として設定しているからです。 –

+0

質問はWinformスレッドに属するタイマーを別のスレッドから開始する方法です。 –

関連する問題