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

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

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

Re[9]: Timerの処理の重さ


(過去ログ 87 を表示中)

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

■51628 / inTopicNo.1)  Timerの処理の重さ
  
□投稿者/ たぐぅ* (14回)-(2010/07/12(Mon) 18:35:59)

分類:[C#] 

よろしくお願いします。
開発言語はC#です。

以下の3つのタイマーを回しているのですが、Timer3の画像処理が重たいらしく
Timer1(1文字づつ出力)の文字出力処理がTimer3の処理とぶつかったときに、文字出力が一瞬詰まったような感じになります。

Image.FromFileでは重たいことがわかりましたので、Image.FromStreamにしてもましたが改善されませんでした。

他に改善策はありますでしょうか?
よろしくお願いいたします。



Timer1 100ms
label3.Text += temp[j].ToString();
j++;

Timer2 100ms
progressBar1.PerformStep();

Timer3 2000ms
pictureBox4.Image = Image.FromStream(fs2, false, false);
pictureBox5.Image = Image.FromStream(fs1, false, false);

引用返信 編集キー/
■51629 / inTopicNo.2)  Re[1]: Timerの処理の重さ
□投稿者/ Jitta on the way (654回)-(2010/07/12(Mon) 18:53:50)
No51628 (たぐぅ* さん) に返信
> よろしくお願いします。
> 開発言語はC#です。
>
> 以下の3つのタイマーを回しているのですが、Timer3の画像処理が重たいらしく
> Timer1(1文字づつ出力)の文字出力処理がTimer3の処理とぶつかったときに、文字出力が一瞬詰まったような感じになります。
>
> Image.FromFileでは重たいことがわかりましたので、Image.FromStreamにしてもましたが改善されませんでした。
>
> 他に改善策はありますでしょうか?
> よろしくお願いいたします。
>
>
>
> Timer1 100ms
> label3.Text += temp[j].ToString();
> j++;
>
> Timer2 100ms
> progressBar1.PerformStep();
>
> Timer3 2000ms
> pictureBox4.Image = Image.FromStream(fs2, false, false);
> pictureBox5.Image = Image.FromStream(fs1, false, false);
>

これは、「100ミリ秒毎に label3 に1文字追加」という事でしょうか。

タイマーを使っていても、処理は1つなので、必ず指定時間で割り込みが発生するわけではありません。
非同期読み込みを使えば、ある程度改善するかもしれません。
しかし、2秒毎に PictureBox 2つを書き換えるという処理は、間に合っているのでしょうか?(2つのファイル読み込みが2秒以内に完了している?)

引用返信 編集キー/
■51631 / inTopicNo.3)  Re[2]: Timerの処理の重さ
□投稿者/ たぐぅ* (15回)-(2010/07/12(Mon) 22:03:35)
No51629 (Jitta on the way さん) に返信
>
> これは、「100ミリ秒毎に label3 に1文字追加」という事でしょうか。

はい、そうです。クイズ等で問題文が1文字づつ出てくる、というような感じです。


> タイマーを使っていても、処理は1つなので、必ず指定時間で割り込みが発生するわけではありません。
> 非同期読み込みを使えば、ある程度改善するかもしれません。

すみません。良く理解ができなかったです。。


> しかし、2秒毎に PictureBox 2つを書き換えるという処理は、間に合っているのでしょうか?(2つのファイル読み込みが2秒以内に完了している?)

2秒には間に合ってます。
ただ、この処理を行っているときにTimer1の処理が0.5秒程度遅れます。


引用返信 編集キー/
■51632 / inTopicNo.4)  Re[3]: Timerの処理の重さ
□投稿者/ 甕星 (15回)-(2010/07/13(Tue) 00:01:49)
No51631 (たぐぅ* さん) に返信
>>タイマーを使っていても、処理は1つなので、必ず指定時間で割り込みが発生するわけではありません。
>>非同期読み込みを使えば、ある程度改善するかもしれません。
>
> すみません。良く理解ができなかったです。。

UIスレッドを分離していない限り、Timer1もTimer2もTimer3も同じスレッド上で動作しています。Timerも含めて他のイベントの処理がおこなわれている場合は、Timerイベントはそれらの処理が終わるまで待たされます。したがってTimer3の処理が100ms以内で完了しない場合には、Timer1もTimer2も、Timer3の処理が終わるまで待たされる事になります。

解決策としては、Timer3の一部の処理を別スレッドにするか、あるいはTimer3の処理が100ms以内に終わるようにするかです。恐らくはFromStreamメソッドで時間がかかっているのでしょうから、Threading.Timerで2000ms毎に画像データを読み込むとかが現実的かと。
引用返信 編集キー/
■51633 / inTopicNo.5)  Re[4]: Timerの処理の重さ
□投稿者/ たぐぅ* (16回)-(2010/07/13(Tue) 02:54:31)
No51632 (甕星 さん) に返信
> UIスレッドを分離していない限り、Timer1もTimer2もTimer3も同じスレッド上で動作しています。Timerも含めて他のイベントの処理がおこなわれている場合は、Timerイベントはそれらの処理が終わるまで待たされます。したがってTimer3の処理が100ms以内で完了しない場合には、Timer1もTimer2も、Timer3の処理が終わるまで待たされる事になります。
>
> 解決策としては、Timer3の一部の処理を別スレッドにするか、あるいはTimer3の処理が100ms以内に終わるようにするかです。恐らくはFromStreamメソッドで時間がかかっているのでしょうから、Threading.Timerで2000ms毎に画像データを読み込むとかが現実的かと。


返信ありがとうございます。
Threading.Timerを使用してみましたが、処理を1度しか行ってくれません。

TimerCallback timerCallback = new TimerCallback(Image_Change);
System.Threading.Timer timer = new System.Threading.Timer(timerCallback, null, 0, 2000);

初歩的なミスをしてますでしょうか?
また、Threading.Timerが何らかの処理を行うことにより強制的に止まる事例がありましたらご教授願います。

引用返信 編集キー/
■51639 / inTopicNo.6)  Re[5]: Timerの処理の重さ
□投稿者/ todo (22回)-(2010/07/13(Tue) 10:34:08)
> また、Threading.Timerが何らかの処理を行うことにより強制的に止まる事例がありましたらご教授願います。

TimerCallback 内でコントロールを触るときはメインスレッドとの同期が必要です。
http://www.atmarkit.co.jp/fdotnet/dotnettips/373threadtimer/threadtimer.html
引用返信 編集キー/
■51656 / inTopicNo.7)  Re[6]: Timerの処理の重さ
□投稿者/ たぐぅ* (17回)-(2010/07/13(Tue) 18:33:25)
No51639 (todo さん) に返信
>>また、Threading.Timerが何らかの処理を行うことにより強制的に止まる事例がありましたらご教授願います。
>
> TimerCallback 内でコントロールを触るときはメインスレッドとの同期が必要です。
> http://www.atmarkit.co.jp/fdotnet/dotnettips/373threadtimer/threadtimer.html


ありがとうございます。

delegate void SetFocusDelegate();

TimerCallback timerCallback = new TimerCallback(worker);
System.Threading.Timer timer = new System.Threading.Timer(timerCallback, null, 10, 1000);

private void worker(object o)
{
Invoke(new SetFocusDelegate(Image_Change));
}

private void Image_Change()
{
(処理)
}

としてみましたが、Image_Changeは1度しか実行されませんでした。(文字出力で確認)
原因は、他のところにあるのでしょうか?><

引用返信 編集キー/
■51658 / inTopicNo.8)  Re[7]: Timerの処理の重さ
□投稿者/ todo (23回)-(2010/07/13(Tue) 18:43:13)
> System.Threading.Timer timer

スコープを考慮して宣言する
http://bbs.wankuma.com/index.cgi?mode=al2&namber=3529&KLOG=12
引用返信 編集キー/
■51662 / inTopicNo.9)  Re[8]: Timerの処理の重さ
□投稿者/ todo (24回)-(2010/07/13(Tue) 19:14:27)
あと、TimerCallback内の処理を丸ごとメインスレッドで行うなら、Threading.Timerを使う意味がないです。
引用返信 編集キー/
■51793 / inTopicNo.10)  Re[9]: Timerの処理の重さ
□投稿者/ たぐぅ* (18回)-(2010/07/19(Mon) 16:53:44)
No51662 (todo さん) に返信
> あと、TimerCallback内の処理を丸ごとメインスレッドで行うなら、Threading.Timerを使う意味がないです。

思考錯誤の結果、改善いたしました。
ありがとうございました。

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -