別スレッドで発行したイベントをフォームで処理する方法
- 題名: 別スレッドで発行したイベントをフォームで処理する方法
- 著者: セニョモン
- 日時: 2009/12/17 0:21:03
- ID: 26071
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: 別スレッドで発行したイベントをフォームで処理する方法
- 著者: Hongliang
- 日時: 2009/12/17 1:00:46
- ID: 26072
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: 別スレッドで発行したイベントをフォームで処理する方法
- 著者: セニョモン
- 日時: 2009/12/17 10:45:23
- ID: 26077
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: 別スレッドで発行したイベントをフォームで処理する方法
- 著者: Hongliang
- 日時: 2009/12/17 11:11:54
- ID: 26078
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: 別スレッドで発行したイベントをフォームで処理する方法
- 著者: セニョモン
- 日時: 2009/12/22 16:56:26
- ID: 26121
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
皆さんはじめまして、C#初心者のものです。
いま、Visual Studio .NET C#にて、『フォームが表示されてから1000(ms)経過したら「フォルダ選択」ダイアログを表示する』、といったプログラムを試用で作成しています。
動作自体は問題なく動いたのですが、よりスマートなプログラム手法がございましたらご教授お願いします。
簡単に説明させていただくと、フォーム初期表示時(Form_Shown)にて別スレッドとしてタイマーを起動し、そのスレッドが1000(ms)経過を認知した時に、フォームクラスのイベント処理ハンドラが呼び出される仕組みになっています。
そこで、『タイマを起動する関数をデリゲートで呼び出し、更にその関数の引数にフォームクラスのイベントハンドラのデリゲートを渡す』という『複雑な作り』になってしまっています。
// フォーム
public partial class Form1 : Form
{
// OnTimePassedのデリゲート
private delegate void delegateOnTimePassed( object sender, EventArgs e );
// タイマスレッド起動のためのデリゲート
private delegate void delegateStartTimer( delegateOnTimePassed funcTimePassed );
// フォーム表示後に呼び出される。
private void Form1_Shown(object sender, EventArgs e)
{
delegateOnTimePassed dOnTimePassed = new delegateOnTimePassed( OnTimePassed );
delegateStartTimer dStartTimer = new delegateStartTimer ( StartTimer );
// タイマ開始
dStartTimer.BeginInvoke( dOnTimePassed , null, null );
}
// タイマスレッドで1000(ms)経過後に呼び出されるイベントハンドラ
private void OnTimePassed ( object sender , EventArgs e )
{
// フォルダ選択ダイアログを表示する
}
// タイマ起動関数
private void StartTimer( delegateOnTimePassed funcTimePassed )
{
TimerObject timer = new TimerObject( 1000 );
timer.EventTimer += new TimerObject.TimerHandler( funcTimePassed );
timer.Start();
}
}
// タイマクラス
public class TimerObject
{
readonly private uint mTimeNum = 0;
// 構築
public TimerObject ( uint timeNum )
{
mTimeNum = timeNum;
}
// イベントハンドラ ( mTimeNum(ms)経過後に発行される。)
public delegate void TimerHandler ( object sender , EventArgs e );
// イベント
public event TimerHandler EventTimer;
// 指定時間経過後に呼び出される。
protected virtual void OnTimer ( EventArgs e )
{
if ( EventTimer != null ) {
EventTimer( this , e );
}
}
// 開始
public void Start ()
{
Thread.Sleep( (int)mTimeNum );
OnTimer( new EventArgs() );
}
}