タイトル : Re^2: MSCommの動作実態と多重On Error文に関して教えて下さい。 投稿日 : 2008/03/14(Fri) 21:46 投稿者 : BamChan
> > 1)タイマーイベントというのは、(組み込みで言う)タスクレベルで動作し、 > > 他方、MSComm1_OnComm()イベントというのは、(同じく)ハード割り込みレベルで > > 呼び出されているなぁ、とデバッグを通じて、感じています。正しいでしょうか? > > そうとは言えないでしょう。呼び出される側からみれば、どちらもシングルスレッド時代 > からの仕様をそのまま受け継いだ実装になっているので、メッセージキューに該当する > メッセージが入れられて、それが処理する余裕のあるときに処理される、というだけ > のことでしかありません。たとえそもそもの発端がハード割り込みレベルのもので > あってもです。 > > VB6のコード記述を見ればわかりますが、受動的な処理の基本はイベントドリブンであって、 > 割り込みではありません。割り込みに該当する機能はせいぜい後述する例外処理ぐらい > しか存在していません。 一々の丁寧なご回答を有難く受けさせて頂きました。有難う御座います。 問題をややこしくさせてしまい申し訳ないですが、 現在、小生が戸惑っておりますのは、(VB6.0環境ですが) 「上記のPrint文すら、エラーハンドラの書き換えに因って(?)、 まともに動作できなくなってしまうんじゃないか?」という、 本日のランニング結果に基づいての、判断です。 因みに、このPrint文では csv形式の1レコード(CR.LF付き)を書き込んでいますが、 そのレコードの途中で、前のレコードを潰して、次のレコードの先頭が書き込まれている」というトラブルを招いています。 まだ、ランニング時間は、充分ではありませんが、 On Errorステートメントを、対象であるデバイス(これも組み込み用語)毎に 排他的に使えば(Print中の受信イベントはリトライさせる様にして)、 本不具合は、再現していません。(現在のところ。) > > > 2)上記の送信処理とPrint処理に、内容の異なるエラー処理(On Errorステートメント)を > > 定義しているのですが、VBの内部では、エラーハンドラーは、複数個同時に定義&実効で > > きるのでしょうか?何か、制限があるのでは無いでしょうか? > > 「例外処理中にその処理が原因で例外が発生すること」を除くと、「同時」に複数の例外を > 処理することはありません。例外の情報は常に1つしか保持しません。プローシージャ内で > 例外が処理されなかった場合に限り、その外(メソッドの呼び出し元)へ例外が運び出され > ます。 > > > Print文実行中に(受信ハード割り込みが生じて)MSComm1_OnComm()が実行されて、 > > Printステートメントのあるプローシージャを抜けるまで、OnCommイベントは生じません。 > 但し、DoEventsがある場合は、そこでイベントが発生する可能性があります。 > > で、シビア(というほどでもないけど、UIによる影響を受けたくない場合)なケースでは、 > VB6を使うことは勧められません。COMMに対する処理とUIに対する処理を同じスレッド > で行うからです。COMMに限らず、外部機器を使う場合やネットワーク、時間のかかる > ファイル操作などではUI周りだけVBであとは別スレッドを生成するDLLをC++などで作って > 使うのが無難なところでしょう。 この「無難」という単語に思わず斬り込みたくなるのが、「組み込み屋」のサガでして、 「なんでや?」となる訳です。 たとえ、今後のソースの継承性を犠牲にしてでも、根拠を知っておきたいのです。 週明けに、もう少し踏み込んだデータを示せれば、と思っています。 レス、参考にさせて頂きます。 有難う御座いました。 |