DoEventsについて質問させてください。
RS232C通信を使用して大量のデータ(10msecに1行)をTextBoxに表示、及びファイルへの書き込みを行なっています。
プログラムを実行すると、CPU使用率が100%となり、プログラム終了のボタンが効かなくなってしまうため、ループの頭にDoEventsを挿入したところ、実行時エラー'7'(メモリが不足しています。)が発生するようになってしまいました。
DoEventsを挿入しなければ、データの表示もファイル出力もうまくいくのですが、終了ボタンが使えないのはとても不便です。
VBに割り当てるメモリを変更することは可能なのでしょうか。
CommEventが起こる度に書き込んだり、表示してたら忙しすぎるのでは。
それと、
>Private Static Sub ShowData(Term As Control, data As String)
それと、これは何をしたいんですか?
表示するデータが大量なので、ShowDataを使ってTextBoxに表示させるデータ量を制限しています。ある一定の量に達すると上書きをするようにしてあるのですが、、、他に良い方法が見つからずこんな感じになっています。
やはりデータ量が多すぎるのでしょうか。
知識が未熟なもので、イベント毎に処理かたちにしているのですが、、、。
コメントありがとうございました。
というか10msに一回の大量のデータを元にテキストボックスに再描写をかけて、
果たしてテキストボックスが反応できるの?とか、そんな描写をダレが見るんだ?
…とか考えてしまう俺は誤爆の予感…
テキストボックス表示はデータが取れているということの確認だけに使用していますので、表示をoffにしても問題ないのですが。。
ただ、テキストボックスへの表示をoffにしても、エラーは回避できないようですので、やはりねろさんのおっしゃるように、CommEventが起こる度にファイル書き込みをする限界なのでしょうか。
DoEventsを挿入しなければ、表示も書き込みもデータの漏れなくできるということは、DoEventsを使って、割り込み待ちをしていること自体の負荷がけっこうあるということなのでしょうか。。
何か良い案があれば、ご教授いただけると幸いです。
38400bpsの通信速度だと1つのメッセージを受信する時間は概算ですが
1つのメッセージに要する時間[sec]=(1/4800)[sec/byte]×受信バイト数[byte]
+1回のOnCommイベントの処理時間[sec]×OnCommイベント発生回数
だけかかります。1つのメッセージを受信してしまってから次のOnCommイベントが発生するまでの間隔は
間隔[sec]=0.01[sec]-1つのメッセージに要する時間[sec]
です。
これを目安に負荷はが100%となるのは正常かどうか判断してみては?
ちなみに1メッセージが48バイト以上あるのであれば、受信するだけで10msec以上かかってしまいます。
処理を削れないならCPU能力の大きいPCで実行するとか。
処理が削れるのであればTextBoxへの表示をやめるとか。
#DoEventsを入れるとエラーになるのはおそらくOnCommイベントプロシージャを処理しているときに
DoEventsを入れたことにより更にOnCommイベントが発生してしまいOnCommイベントプロシージャの
ネストが深くなりすぎたところでエラーとなっているんだと思います。
なるほど!
なぜDoEventsを入れることでメモリ不足になるのか不思議だったんですよね。
abuさんのおっしゃるとおり、一旦情報を整理して検討しなおしてみます。
的確なご意見、ありがとうございました。
ツイート | ![]() |