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

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

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

Re[2]: ウェイトのかけ方について


(過去ログ 11 を表示中)

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

■2202 / inTopicNo.1)  ウェイトのかけ方について
  
□投稿者/ 終 (3回)-(2007/03/26(Mon) 14:45:14)

分類:[C# (Windows)] 

前回質問させて頂いた内容にもかぶるのですが、C#において、
処理の途中で一定のウェイトをかけるにはどのような方法が適切なのでしょうか。

例えば、テキストボックス等に所定の間隔をおいて文字を表示させたい場合に、
これまで試したのは、Thread.Sleep()と、あるいはEnvironment.TickCountを
利用して設定した時間が経過するまでループさせておく方法なのですが、
どちらも同じメソッド内で二回以上使用すると正常に動作しなくなってしまいました。
(ウェイト時間の合計だけ待ってから、その後全ての文字が同時に表示されます。)

記述の仕方に問題があるのかとも思うのですが、
Google等で検索しても手がかりを発見できず、現在行き詰まっております。
このようなウェイトをかける場合には、どのような方法が一般的なのでしょうか。

どなたか、ご教授いただければ幸いです。
どうぞよろしくお願い致します。(_ _)

引用返信 編集キー/
■2204 / inTopicNo.2)  Re[1]: ウェイトのかけ方について
□投稿者/ 中博俊 (998回)-(2007/03/26(Mon) 15:14:58)
中博俊 さんの Web サイト
Timerです
引用返信 編集キー/
■2205 / inTopicNo.3)  Re[2]: ウェイトのかけ方について
□投稿者/ Hirotow (80回)-(2007/03/26(Mon) 17:33:39)
Hirotow さんの Web サイト
あらかじめStackもしくはQueに保存しておきTimerの周期ごとにひとつずつ取り出して表示とかどでしょう。
リニアに実行したい場合は、BackgroundWorkerからInvokeしてThread.Sleepをかける方法もありですが面倒です。
引用返信 編集キー/
■2231 / inTopicNo.4)  Re[3]: ウェイトのかけ方について
□投稿者/ 終 (4回)-(2007/03/28(Wed) 00:30:17)
ご回答ありがとうございます。
Timerも試すには試したのですが、全く同じ処理を繰り返すやり方は解るのですが
今回の件に適切な組み込み方が解りませんでした。

> あらかじめStackもしくはQueに保存しておきTimerの周期ごとにひとつずつ取り出して表示

なるほど、表示に関してはこれでいけそうですね。
ただ、最終的には表示以外の処理を挟んだりしなければならないため、Timerでそれが可能なのか、
可能だとしてもかなり複雑なことにならないかなというのが不安です。
正直、Thread.Sleep()くらい分かりやすい方法があればなぁと思うのですが…
取り敢えず、Timerを使ってまたいろいろと試行錯誤してみます。

もし他に応用できそうな手法がありましたら、ご教示頂けると助かります。
ひょっとするととても初歩的なことなのかもしれませんが…どうぞよろしくお願い致します。(_ _;

引用返信 編集キー/
■2654 / inTopicNo.5)  Re[1]: ウェイトのかけ方について
□投稿者/ WonderRabbit (1回)-(2007/04/13(Fri) 01:14:39)
WonderRabbit さんの Web サイト
2007/04/13(Fri) 01:16:51 編集(投稿者)
> どちらも同じメソッド内で二回以上使用すると正常に動作しなくなってしまいました。
> (ウェイト時間の合計だけ待ってから、その後全ての文字が同時に表示されます。)

先についているレスのように、別スレッドでウェイト付きの処理を行うのが宜しいかと
思いますが、可能な処理であれば手動で表示なりデータなりの更新処理を挟めば解決す
る程度の事であれば以下のようにしても解決できるかと思います。
例としてフォーム(form1)にラベル(label1)を配置してクリックに反応して
System.Threading.Thread.Sleep()でウェイトをかけた処理をしつつラベルを更新する
コードを書いて置きます、参考になればどうぞ。

class form1: Form{
 ...
 protected override void OnClick(EventArgs e){
  for(int n = 0; n < 10; n++){
   label1.text = n.ToString();
   label1.Update();//ここをコメントアウトするとスレ主さんの悩んでいる状態?かな
   Thread.Sleep(100);
  }
 }
 ...
}

#わんくまの諸兄各位には初カキコでご挨拶に代えさせて頂く失礼をお許しくださいませ。
つい先日から加入させて頂きましたWonderRabbitです、よろしくお願いいたします。

引用返信 編集キー/
■2689 / inTopicNo.6)  Re[2]: ウェイトのかけ方について
□投稿者/ ぼのぼの (30回)-(2007/04/13(Fri) 13:52:12)
既にご存知かもしれませんが、Timerには3種類あるみたいですね。

http://www.atmarkit.co.jp/fdotnet/dotnettips/372formstimer/formstimer.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/373threadtimer/threadtimer.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/374timerstimer/timerstimer.html

しかし、一定間隔ごとの処理でテキストボックスに触るみたいなので、
System.Windows.Forms.Timerを使うのが現実的なのかな、と思います。

で、System.Windows.Forms.Timerを継承したクラスを使う
簡単なサンプルを作ってみました。こんな感じのはどうでしょう?
#めんどくさかったので「public変数」という横着をやらかしてますが。

using System;
using System.Windows.Forms;

namespace BonoTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private int _Counter = 1;

        private void button1_Click(object sender, EventArgs e)
        {
            TimerEx timer = new TimerEx();
            timer.Tick += new EventHandler(UpdateTextBox);
            timer.Interval = 1000;
            timer.Name = string.Format("Timer{0}", _Counter++);
            timer.Start();
        }

        private void UpdateTextBox(object sender, EventArgs e)
        {
            TimerEx timer = (TimerEx)sender;
            textBox1.Text += string.Format("{0} {1}\r\n", timer.Name, timer.Counter++);
            textBox1.Select(textBox1.Text.Length, 0);
            textBox1.ScrollToCaret();
            textBox1.Update();
        }
    }

    public class TimerEx : System.Windows.Forms.Timer
    {
        public string Name;
        public int Counter = 1;
    }
}

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -