プロが教える店舗&オフィスのセキュリティ対策術

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

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

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

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

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

A 回答 (1件)

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


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

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

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

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

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

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

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

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