- ベストアンサー
シリアル通信:オフライン時にうまく終了してくれません
- VB6でシリアルプリンタの制御を行っていますが、終了してくれません。
- VB6でシリアル通信を行っている際に、オフライン時に正しく終了しない問題が発生しています。
- シリアル通信中にオフラインになると、終了処理が正常に行われず、プリンタの状態が更新されません。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
ぱっと見の回答ですので間違っているかもしれませんが・・・ 試しに、 Private Sub Timer1_Timer() Debug.Print "Timer Start" Timer1.Enabled = False Call CheckPrint Timer1.Enabled = True Debug.Print "Timer End" End Sub として実行してみてください。 [Timer End]がでて、[Timer Start]がでるまでの間に、 終了ボタンを押せば、うまく終了するのではないかと思いますが、どうでしょうか? [Timer Start]がでて、[Timer End]がでるまでの間は、 CheckPrintの中にDoEventsがあるので終了する事はできますが、 プログラムは、Do ... Loopを回っています。 TimeOutでDo ... Loopを抜けると、 Timer1.Enabled = Trueになるので またTimerイベントが発生して終了できないのではないでしょうか? それを回避する方法は、いくつかあると思うのですが、 (例えば、 Private Sub Form_Unload(Cancel As Integer) Timer1.Interval = 0 MSComm1.PortOpen = False End Sub にするとか(これは即終了とはいきませんが)) そもそもTimerイベントを用いる必要があるのでしょうか? Private Sub MSComm1_OnComm()の中の ・・・・ BUF = MSComm1.Input この部分で、CheckPrintの中を(内容はよくわかりませんが) 実行したらいいのでは?と思いました。 細かい事がわからないので、全く違っていたらすみません。
お礼
回答に心から感謝します。 細かい所まで気づいてくださってありがとうございます。本当に感謝です。様々なサイト様を巡っていても全然わかりませんでした。ウチの部署はプログラマもどき(気取り)の自分1人しかVBをいじってないので質問させていただきました。 CheckPrint()に続きがありまして、この後、Formに表示する部分(プリンタの状態(リボンエラー、ヘッドオープン等)を表示する)があります。つまりForm上にあるオブジェクトなり、コントロールが参照されます。 貴殿のおっしゃる通りで、Timer StartとEndの間で終了させればOKです。また、FormがUnloadされていてもプログラムは走っているようです。多分Doeventsで制御が戻ってくるのでしょう。それで、このDoeventsはよくわかりませんが、Formの情報も持っているのか、Form上にあるオブジェクトなり、コントロールが参照されると、Form_Loadに飛んでってしまうのです。それで再ロードされて、でもLoad中はVisibleはいじってないのでFalseのまま、裏で残ってしまうようです。で、プロセスが残りっぱなしになってしまうのです、というのが推測ですが結論が出ました。貴殿のおっしゃることで間違いないと思います。(ここまで結論付けるには貴殿の回答あってこそですが) また、Timerコントロールを使うのは単なる思い付きでして、昔GPIBなるものをいじってまして、その時にTimerコントロールで計測器を制御していたもんですから… お客にリアルタイムでプリンタの状態を見ることはできないかということを受けてでした。」 Timerコントロールはあまり使うものではないということを調べて知りましたので気をつけたいと思います。 一応、リファレンス通り、静的なLoadフラグを設けてDoeventsのすぐ下にLoadフラグがFalseだったらExit Subなる逃げ業(?)を使い、Timer1_TimerでもLoadフラグがFalseだったらTimer1を無効にしました。一切Formの「フォ」の字も使っておりません。あまり美しくはありませんが、完成にもっていっています。 この度は本当に感謝ですし、明日から定時に帰れるという喜びが大きいですよ。