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

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

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

Re[5]: 再 時間計測


(過去ログ 36 を表示中)

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

■18098 / inTopicNo.1)  再 時間計測
  
□投稿者/ tanaka (44回)-(2008/05/08(Thu) 17:53:14)

分類:[C#] 

以前質問してその回答を元に検証用に作成したときには無事成功したので実際のプログラムで処理を
入れたところ正常に動作しませんでした。検証用に作成した時とだいたい一緒ですがデバックでは
Timerコントロールのイベント事態発生していません。


private Stopwatch stopWatchElapsed;

private void FrmMain_Load(object sender, EventArgs e)
{
    stopWatchProcessing = new Stopwatch();
}

private void btnExec_Click(object sender, EventArgs e)
{
    tmrStopWatch.Enabled = true;
    stopWatchElapsed.Start();
    // 処理
    stopWatchElapsed.Stop();
}

// 1秒間隔でラベルに経過時間を表示
private void tmrStopWatch_Tick(object sender, EventArgs e)
{
    if (stopWatchProcessing.IsRunning)
    {
        TimeSpan ts = stopWatchProcessing.Elapsed;
        lblTime.Text = String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);
    }
}

引用返信 編集キー/
■18100 / inTopicNo.2)  Re[1]: 再 時間計測
□投稿者/ 魔界の仮面弁士 (719回)-(2008/05/08(Thu) 18:06:05)
No18098 (tanaka さん) に返信
> private Stopwatch stopWatchElapsed;
ここで宣言されたフィールドと

> private void FrmMain_Load(object sender, EventArgs e)
> {
>     stopWatchProcessing = new Stopwatch();
> }
ここで使われている変数は、それぞれ別の変数を意味しますが、その点は大丈夫ですよね?


> Timerコントロールのイベント事態発生していません。
tmrStopWatch.Tick イベントに、void tmrStopWatch_Tick のメソッドを
割り当てるのを忘れていた…という事は無いでしょうか。昨日あったスレッド No18007 のように。

引用返信 編集キー/
■18102 / inTopicNo.3)  Re[2]: 再 時間計測
□投稿者/ tanaka (45回)-(2008/05/08(Thu) 19:16:56)
2008/05/08(Thu) 19:40:10 編集(投稿者)
2008/05/08(Thu) 19:39:52 編集(投稿者)

<pre><pre>■No18100 (魔界の仮面弁士 さん) に返信
> ■No18098 (tanaka さん) に返信
>>private Stopwatch stopWatchElapsed;
> ここで宣言されたフィールドと
>
>>private void FrmMain_Load(object sender, EventArgs e)
>>{
>> stopWatchProcessing = new Stopwatch();
>>}
> ここで使われている変数は、それぞれ別の変数を意味しますが、その点は大丈夫ですよね?
すいません。記載ミスです。
private Stopwatch stopWatchProcessing;

>
>>Timerコントロールのイベント事態発生していません。
> tmrStopWatch.Tick イベントに、void tmrStopWatch_Tick のメソッドを
> 割り当てるのを忘れていた…という事は無いでしょうか。昨日あったスレッド No18007 のように。
確認しましたが割り当てされております。

private void FrmMain_Load(object sender, EventArgs e)
{
// ここで宣言するとイベントが発生します。
tmrStopWatch.Enabled = true;
}
</pre></pre>
引用返信 編集キー/
■18105 / inTopicNo.4)  Re[3]: 再 時間計測
□投稿者/ levin (2回)-(2008/05/08(Thu) 19:41:55)
ほとんど同じコードで動かすことができましたよ。
コード掲載しときます。
タイマーの Interval は Default の 100 (msec) です。
----------

namespace sampleTimer
{
    public partial class Form1 : Form
    {
        private System.Diagnostics.Stopwatch stopWatchElapsed;
    
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            stopWatchElapsed = new System.Diagnostics.Stopwatch();
            stopWatchElapsed.Start();
        }
    
        private void timer1_Tick(object sender, EventArgs e)
        {
            TimeSpan ts = stopWatchElapsed.Elapsed;
            label1.Text = String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);
        }
    }
}

引用返信 編集キー/
■18106 / inTopicNo.5)  Re[4]: 再 時間計測
□投稿者/ なちゃ (122回)-(2008/05/08(Thu) 19:55:48)
多分クリックイベント内での処理自体を実行しながら計測表示したいのでしょう。
さてどうするのが簡単でしょうかね〜

あ、念のため、つまり計測表示出来ないのは、クリックイベントから抜けるまで
タイマーイベントハンドラが呼ばれないからです。

引用返信 編集キー/
■18107 / inTopicNo.6)  Re[3]: 再 時間計測
□投稿者/ 魔界の仮面弁士 (721回)-(2008/05/08(Thu) 19:56:45)
No18102 (tanaka さん) に返信
>>>private Stopwatch stopWatchElapsed;
>>>private void FrmMain_Load(object sender, EventArgs e)
>>>{
>>>    stopWatchProcessing = new Stopwatch();
>>>}
>>ここで使われている変数は、それぞれ別の変数を意味しますが、その点は大丈夫ですよね?
> すいません。記載ミスです。
> private Stopwatch stopWatchProcessing;

ボタンの Click で使われているのは、stopWatchElapsed の方ですよね。
ボタン側も記載ミスで、実際には stopWatchProcessing だけ、ということでしょうか?


てっきり、時間経過測定用の stopWatchElapsed と、
「処理」の部分で使われる、stopWatchProcessing の
2 つの Stopwatch があるのかと思ったのですが。


>>> private void btnExec_Click(object sender, EventArgs e)
>>> {
>>>     tmrStopWatch.Enabled = true;
>>>     stopWatchElapsed.Start();
>>>     // 処理
>>>     stopWatchElapsed.Stop();
>>> }

で、ここが原因かと思います。

最後の Stop を取り除くと、(「処理」の最中ではなく)Click イベントが終了した後で
タイマーが稼働し始めるのでは無いでしょうか。

恐らく、「処理」の最中にイベントが発生する事を期待しているのだと思いますが、
この場合、「処理」中にメッセージが処理されないので、Timer が稼働する余裕がありません。

「処理」部を BackgroundWorker の DoWork イベント内に移動し、
非同期で処理させることを検討してください。

# この他に、Application.DoEvents() という逃げ方もあるけれど、こちらは個人的には非推奨。

引用返信 編集キー/
■18113 / inTopicNo.7)  Re[4]: 再 時間計測
□投稿者/ tanaka (47回)-(2008/05/08(Thu) 20:59:31)
No18107 (魔界の仮面弁士 さん) に返信
>ボタンの Click で使われているのは、stopWatchElapsed の方ですよね。
>ボタン側も記載ミスで、実際には stopWatchProcessing だけ、ということでしょうか?
すいませんご指摘のとおり記載ミスでstopWatchProcessingだけを使用です。

>てっきり、時間経過測定用の stopWatchElapsed と、
>「処理」の部分で使われる、stopWatchProcessing の
>2 つの Stopwatch があるのかと思ったのですが。
実際のプログラムでは2つ使用していますが質問の意図がわかり易くなるように
1つだけの部分をコピーしたつもりがミスしてしまいかえってわかり難くなって
しまいました。

private Stopwatch stopWatchProcessing;

private void FrmMain_Load(object sender, EventArgs e)
{
    stopWatchProcessing = new Stopwatch();
}

private void btnExec_Click(object sender, EventArgs e)
{
    tmrStopWatch.Enabled = true;
    stopWatchProcessing.Start();
    // 処理
    stopWatchProcessing.Stop();
}

// 1秒間隔でラベルに経過時間を表示
private void tmrStopWatch_Tick(object sender, EventArgs e)
{
    if (stopWatchProcessing.IsRunning)
    {
        TimeSpan ts = stopWatchProcessing.Elapsed;
        lblTime.Text = String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);
    }
}

引用返信 編集キー/
■18120 / inTopicNo.8)  Re[5]: 再 時間計測
□投稿者/ tanaka (48回)-(2008/05/08(Thu) 22:28:35)
> ■No18107 (魔界の仮面弁士 さん) に返信
>「処理」部を BackgroundWorker の DoWork イベント内に移動し、
>非同期で処理させることを検討してください。
この方法で解決しました。ありがとうございました。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -