VB5.0 SP3を使用しています。
RS-232CのデータをMSCOMMを使いファイルに落とし、グラフを表示するソフトを作りました。
それが、しばらくするとCPU使用率が100%超えて、グラフの処理が遅くなります。
プログラムの内容としては、
1.COMポートを開く
2.外部データをグラフを書きながら1000データもらう。
3.データを取得し終えたところでファイルに保存
4.データが来るまで待機し、データが来たら2から繰り返し
5.終了のスイッチが押されたらCOMポートを閉じて終了
です。
タスクマネージャを見て分かったことは、
グラフの表示に取られるCPU使用率は40〜50%(結構頻繁に書き直しているためだと思います。)で、グラフを消すと0%になります。(グラフを消すとファイルにも保存しない)
データを取得している時にはCPU使用率とメモリ使用量が上がります。
2〜4の作業を30回ほど繰り返すとCPU使用率が100%を超えてしまい、表示が遅くなってきます。このときメモリ使用量は急激に上昇します。(まだ空きは十分ですが。)
グラフを表示しないときにも、作業の回数は増えますが、同様に100%を超えてしまいます。
データ取得中のみ100%になるので、データ取得後、グラフを表示しない場合(4の時)は0%に戻っています。
メモリの使用量は増減を繰り返しながらだんだん増えて行ってるような感じです。
プログラムを一度終了し、再度立ち上げると最初の状態に戻っていますので、Windowsのせいじゃないと思います。
作業の内容は1回目も100回目も同じはずなのに段々使うCPUの割合が増えていくのが不思議です。
メモリリークでしょうか?
ちなみに、ハードディスクはカリカリしてないです。でも空きメモリを見たら最初に比べて増えていました。(最初の空きが60MBぐらい、今は130MBぐらいです。仮想メモリを使ってる?)
今プログラムが使っているメモリ使用量は11MBぐらいです。多い時でも30MBぐらいです。
なぜCPU使用率は上がっていくのでしょうか?
>3.データを取得し終えたところでファイルに保存
>4.データが来るまで待機し、データが来たら2から繰り返し
3と4の間にデーターの送信要求はするのですか? それとも
データーは次から次へと送られてくるのですか?
>メモリリークでしょうか?
メモリーリークとは無関係。
回答ありがとうございます。
3と4の間についてですが、
3が、データ取得後、外部機器から送信終了の信号が来ます。
それに対して一つデータを返し、データを保存し待機します。
4が、外部機器からしばらくデータは来ません。
しばらくしたあと、外部機器からデータ要求の信号が来ます。そこに3つほどデータを返した後に”2”のデータを待つことになります。
2のデータは次々送られてきます。こちらからは送信終了の信号が車で何も送り返しません。ちなみに1つのデータが10文字(cr入れて)で、×1000データです。
メモリリークではないですか。
今はfor文等が何かの手違いでループ回数が無駄に多くなっているかも?と思い調べています。
他に何か気づいたことが合ったら報告します。
送られて来たデーターを長い文字列に足し込むようなことはしていませんか。
又保存が終わったデーターはどのようにしていますか?
>送られて来たデーターを長い文字列に足し込むようなことはしていませんか。
してますが、データをCR毎に分けた後にright()、left()で短くしてます。
3と4の間で見てみたのですが、空っぽでした。
>又保存が終わったデーターはどのようにしていますか?
特に何もしていませんが、次のデータが来ると上書きしています。
1000個のデータは1000個の配列にしまっています。
グラフはどのように書かせていますか?
それと、
>グラフを表示しないときにも、作業の回数は増えますが、同様に100%を超えてしまいます。
これはどのような意味でしょう、グラフを書かせない時は、スピードが落ちないということですか?
グラフの描画はたぶん関係ないと思います。と言う意味だったのですが。
グラフのformを消すとグラフを書かないように作りました。
実際、グラフを消した状態でグラフを書く部分にブレークポイントを入れても止まりません。
で、文の意味ですが具体的に書くと、グラフを表示しないで動作させると30回位でかくかくして来た(CPUが100%を超えた)のが50回位でかくかくするようになります。
そして、今までやってみた結果です。
MSCOMMに割り込む回数が最初は300/1000位割り込んでいたのですが、50回目位になると100/1000程度まで減ってしまいます。(ボーレート19200でぎちぎちに詰めて送っています。)
これがCPUの使用率が上がったせいで割り込みの回数が減ったと見てもいいのかどうかなんですが。もしかしてMSCOMMの割込みに時間がかかるようになった上がったと見るべきでしょうか?
データ自体はMSCOMMのバッファに残っているので割り込みの回数が100回だろうが300回だろうがどっちでもいいのですが。
とりあえずまだ回数が増えるに従い無駄に増えるループは見つかっていないので、今一番怪しいのが上のMSCOMMなんですが。
MSCOMMにそんな不具合なんてないですよね。
引き続き調べてみます。
データーはポーリングで取ってるのですか、それともCommEventですか?
その辺のコードを見てみないとなんともいえませんね。
すいません。
解決しました。
>送られて来たデーターを長い文字列に足し込むようなことはしていませんか。
でした。
多分デバックの時に作った変数なのですが、消し忘れていたようです。
今80回目ですが、快適に動いています。
MSCOMMさん 疑ってすいませんでした。
我龍院忠太さん、長時間お付き合いいただきありがとうございました。
ツイート | ![]() |