柔軟に働き方を選ぶ時代に必要なこと >>

いつもお世話になっております。
表題の件につきまして、ご教示ください。

【処理内容】
メインフォームのボタンからポートをオープンし、
受信データ(1Byte)をテキストボックスに表示し続ける。
※受信データは定期受信
通信をやめたいときにメインフォームのボタンから
ポートをクローズする。

上記、クローズ時に、ほぼフリーズします。
原因はシリアル通信の受信イベントが別スレッドにて処理されているため、
Invoke()にてテキストボックスの更新をしており、
これが悪さをしているみたいです。

BeginInvoke()を使用するとフリーズは回避することができるのですが、
テキストボックスに表示される受信データの内容が激しく欠落してしまいます。

Invoke()を使いつつ、フリーズを回避する方法はないのでしょうか。
無知で大変申し訳ございませんが、よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

この方法が最善とは思いません 一例として


>クローズ時に、ほぼフリーズします。
フリーズとはPCが固まるフリーズではなくて
アプリがエラー出してすっ飛ぶんですよね(多分)

それとも飛びもせずプロセス残ったまま反応しなくなるのでしょうか?

以下は すっ飛んでるんだろうと仮定して書いています
メイン(ボタン)処理で
・クローズ前に スレッドに対して終了要求フラグを立てる
・スレッドが終了するまで待つ(フラグでもシグナルでも確認はいくつか考えられます)
・ポートクローズ処理を行う

・スレッドでは終了フラグを監視して動作(現状多分ポーリングループしてるんでしょう)
 するように変更する
・スレッド終了フラグを立てる

といった形でいいのでは?
もしくは実質のオープン・クロース処理自体をスレッド内に記載してもいいかと

メイン側処理とスレッド側処理で同期取れればどんな形でもいいかと思います
同期が取れてないからタイミングによってクローズ後にデータ読みに行って
アプリがすっ飛ぶということではないかと思います

テキストボックスの更新自体が問題の本質ではないと思いますよ
(データ読みに行って更新されるからこそ表示してるんでは?)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QVB2010で、シリアル通信の方法を教えてください。

VB2010で、シリアル通信の方法を教えてください。

ツールボックスの「Serial Port」を使っています。
送信までは難なくできたのですが、受信が旨くいきません。
参考にしたサイトは、
http://msdn.microsoft.com/ja-jp/library/cc720852.aspx です。

これを実行すると、受信が出来ないだけでなく、フリーズしてしまいます。

どうやったら、受信できるのでしょうか?

Aベストアンサー

受信データが、
STX(&H02)とETX(&H03)には挟まれた形式のテキスト文字になっている。
エラーチェックのBCCは付加されない。
という仕様ならば
ポートをOpenした直後に
SerialPort1.NewLine = Chr(3)
とすれば良い。
受信したデータの先頭1文字がSTXの場合に正常なデータと判断できます。


人気Q&Aランキング

おすすめ情報