C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 非同期に値を追加したい


(過去ログ 27 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■12532 / inTopicNo.1)  非同期に値を追加したい
  
□投稿者/ 四十 (1回)-(2008/01/11(Fri) 11:34:40)

分類:[.NET 全般] 

マルチスレッド関係のプログラムを作っています。

フォームにListBox1とListBox2を配置してある状態です。
この状態でプログラムを起動すると、
・ListBox1には、5秒ごとに列を追加(追加した時間を表示)
・ListBox2には、3秒ごとに列を追加(追加した時間を表示)
以上のような処理を行いたいと思っています。

今現在、スレッドタイマーを使ってみたり、デザインパターンの
マルチスレッド入門(Java用ですが)のFutureパターンを見たりで
四苦八苦しています。

考え方のヒント等など頂けないでしょうか。
よろしくお願いします。


引用返信 編集キー/
■12534 / inTopicNo.2)  Re[1]: 非同期に値を追加したい
□投稿者/ なちゃ (94回)-(2008/01/11(Fri) 11:45:06)
それをやりたいだけならスレッド使うまでもなく単なるWindows用のタイマー使えば出来そうですが、
もっと他の条件がありませんか?

引用返信 編集キー/
■12535 / inTopicNo.3)  Re[2]: 非同期に値を追加したい
□投稿者/ 四十 (2回)-(2008/01/11(Fri) 12:00:45)
すみません、はしょりすぎました。

プログラム起動後、一定時間間隔で(例えば10秒間隔)で、とにかく検索ロジックを
走らせたいと考えています。検索ロジックの中の処理が何秒かかるか不明なので、
早い場合もあれば遅い場合もあります。

処理の流れとしては
1.起動
2.検索開始
2−1.ListBox1に値を追加。ListBox2に入れる値は計算中・・・
3.10秒経過したので、もう一度検索開始
4.ListBox1に値を追加。
5.ListBox2に値を追加。
6.「2−2」で計算した値をListBox2に追加。

以上のような感じです。

引用返信 編集キー/
■12537 / inTopicNo.4)  Re[2]: 非同期に値を追加したい
□投稿者/ 七曜 (34回)-(2008/01/11(Fri) 12:05:31)
No12534 (なちゃ さん) に返信
> それをやりたいだけならスレッド使うまでもなく単なるWindows用のタイマー使えば出来そうですが、
> もっと他の条件がありませんか?

他に条件が無ければ・・・こんな感じで如何でしょう・・・
#もちろん、デザイナでTimerは貼り付けても良いでしょうね。

        private void Form1_Load(object sender, EventArgs e)
        {
            Timer timer5sec = new Timer(this.components);
            timer5sec.Interval = 5000;
            timer5sec.Tick += new EventHandler(timer5sec_Tick);
            timer5sec.Start();

            Timer timer3sec = new Timer(this.components);
            timer3sec.Interval = 3000;
            timer3sec.Tick += new EventHandler(timer3sec_Tick);
            timer3sec.Start();
        }

        void timer5sec_Tick(object sender, EventArgs e)
        {
            listBox1.Items.Add(DateTime.Now.ToLocalTime().ToLongTimeString());
        }

        void timer3sec_Tick(object sender, EventArgs e)
        {
            listBox2.Items.Add(DateTime.Now.ToLocalTime().ToLongTimeString());
        }

引用返信 編集キー/
■12547 / inTopicNo.5)  Re[3]: 非同期に値を追加したい
□投稿者/ 四十 (3回)-(2008/01/11(Fri) 14:39:40)
そうですね・・・Timerを使えばそれで良いのですが、今はスレッドで処理してみたいと思っています。
難しい・・・
引用返信 編集キー/
■12549 / inTopicNo.6)  Re[3]: 非同期に値を追加したい
□投稿者/ 魔界の仮面弁士 (567回)-(2008/01/11(Fri) 15:11:59)
No12535 (四十 さん) に返信
> プログラム起動後、一定時間間隔で(例えば10秒間隔)で、とにかく検索ロジックを
> 走らせたいと考えています。検索ロジックの中の処理が何秒かかるか不明なので、
> 早い場合もあれば遅い場合もあります。

検索スレッドと、メインスレッドの関係が良く分かりませんでした。

(1) 10秒ごとに、メインスレッドがワーカースレッドの検索状況を拾い上げる。
(2) ワーカスレッドが、10秒ごとに進捗をメインスレッドに通知する。
(3) 一つの検索処理は最大10秒で打ち切られ、次の検索処理が開始される。
(4) その他の処理パターン


Imports System.ComponentModel
Class Form1
    Sub Form1_Load(ByVal s As Object, ByVal e As EventArgs) Handles Me.Load
        BackgroundWorker1.WorkerReportsProgress = False
        BackgroundWorker1.RunWorkerAsync()
        BackgroundWorker2.WorkerReportsProgress = True
        BackgroundWorker2.RunWorkerAsync()
    End Sub

    Private Sub DoWork1(ByVal s As Object, ByVal e As DoWorkEventArgs) _
    Handles BackgroundWorker1.DoWork
        Threading.Thread.Sleep(5000)
        e.Result = Now.ToString("hh:mm:ss.ffff")
    End Sub

    Private Sub Completed1(ByVal s As Object, ByVal e As RunWorkerCompletedEventArgs) _
    Handles BackgroundWorker1.RunWorkerCompleted
        ListBox1.Items.Add(e.Result)
        BackgroundWorker1.RunWorkerAsync()
    End Sub

    Private Sub DoWork2(ByVal s As Object, ByVal e As DoWorkEventArgs) _
    Handles BackgroundWorker2.DoWork
        Dim bgw As BackgroundWorker = DirectCast(s, BackgroundWorker)
        Do Until bgw.CancellationPending
            Threading.Thread.Sleep(3000)
            bgw.ReportProgress(0, Now.ToString("hh:mm:ss.ffff"))
        Loop
    End Sub

    Private Sub ProgressChanged2(ByVal s As Object, ByVal e As ProgressChangedEventArgs) _
    Handles BackgroundWorker2.ProgressChanged
        ListBox2.Items.Add(e.UserState)
    End Sub
End Class

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -