前提・実現したいこと
現在業務でC#のWPFを使っています。
WPFの"Threading.Timer"というタイマー機能を使って、100ms毎に現在時刻と指定した時刻を比較して、指定した時刻になった時に別クラスの処理を実行するために通知を飛ばす仕組みを検討しています。
別クラスに通知して処理を実行するとするなら、イベントでの通知を思いつきましたが、どのように作ればいいのかイメージができていません。
良ければこのようなタイマー作りのアドバイスが欲しいです。
(イベント以外での通知方法もあれば嬉しいです。)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
この仕様だと、監視スレッドがずっと動いているのでかなり負荷は高くなります。
コメントを見ると 8 時とか 15 時とか間隔が大きいのでここまで厳しく監視する必要はないように思います。
また負荷が高い割には 100ms 毎というのは不正確です。
この仕様よりも、タイマーを目的の時間にセットしてイベントが起こるまで待機する方がいいのではないでしょうか。
次のコードを実行するとボタンクリックでタイマーが次の 8 時にセットされます。
時間が来ると「時間ですよ!」と表示され、それが 24 時間毎に行われます。
ここでは単純化のために timer1 Method1 という名前にしましたが、当然リストや配列を使ってください。
時間が来るまで負荷はほとんどありません。
C#
1static Timer timer1; 2 3private void Button_Click(object sender, RoutedEventArgs e) 4{ 5 // time1 に今日の 8 時までの時間を代入 6 var time1 = DateTime.Today + new TimeSpan(8, 0, 0) - DateTime.Now; 7 8 // 8 時過ぎていれば次の日の 8 時にする 9 if (time1 < TimeSpan.Zero) time1 += new TimeSpan(24, 0, 0); 10 11 // 時間になったらそこから 24 時間毎に Method1 を呼び出すようタイマーをセット 12 timer1 = new Timer(Method1, null, time1, new TimeSpan(24, 0, 0)); 13} 14 15private void Method1(object state) 16{ 17 MessageBox.Show($"時間ですよ!({DateTime.Now.ToString("HH:mm")})"); 18}
投稿2018/04/21 10:15
総合スコア28669
0
イベント(デリゲート)を使った通知、でもいいですが、
manualreseteventなどを使って各スレッドに通知とかいうテもありますな
投稿2018/04/15 15:56
総合スコア88051
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/16 22:39
2018/04/17 15:14
2018/04/17 23:05
0
ベストアンサー
こんなイメージでしょうか?
以下を参考に作ってみました。
https://qiita.com/hibara/items/9fd56a5d594c000a5df0
public delegate void イベント1ハンドラ(イベント1Arg e);
public delegate void イベント2ハンドラ(イベント2Arg e);
public event イベント1ハンドラ イベント1;
public event イベント2ハンドラ イベント2;
public コンストラクタ()
{
this.イベント1 += new this.イベント1ハンドラ(処理1);
this.イベント2 += new this.イベント2ハンドラ(処理2);
}
private void timer_callback()
{
if(指定時刻1)
{
イベント1(new イベント1Arg());
}
if(指定時刻2)
{
イベント2(new イベント2Arg());
}
}
private void 処理1(イベント1Arg e)
{
別Class.処理1();
}
private void 処理2(イベント2Arg e)
{
別Class.処理2();
}
投稿2018/04/25 04:55
総合スコア136
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
指定時刻と判定したら、別クラスのメソッドをコール
もしくは、別クラスでタイマー監視するとかじゃダメなんですか?
投稿2018/04/15 11:27
総合スコア10505
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/15 12:17
2018/04/15 13:15
2018/04/15 14:38
2018/04/15 15:03
2018/04/16 15:16
2018/04/16 22:16
2018/04/17 15:08
2018/04/17 22:06
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。