
いつもお世話になっております。
表題の件につきまして、ご教示ください。
【処理内容】
メインフォームのボタンからポートをオープンし、
受信データ(1Byte)をテキストボックスに表示し続ける。
※受信データは定期受信
通信をやめたいときにメインフォームのボタンから
ポートをクローズする。
上記、クローズ時に、ほぼフリーズします。
原因はシリアル通信の受信イベントが別スレッドにて処理されているため、
Invoke()にてテキストボックスの更新をしており、
これが悪さをしているみたいです。
BeginInvoke()を使用するとフリーズは回避することができるのですが、
テキストボックスに表示される受信データの内容が激しく欠落してしまいます。
Invoke()を使いつつ、フリーズを回避する方法はないのでしょうか。
無知で大変申し訳ございませんが、よろしくお願いいたします。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
この方法が最善とは思いません 一例として
>クローズ時に、ほぼフリーズします。
フリーズとはPCが固まるフリーズではなくて
アプリがエラー出してすっ飛ぶんですよね(多分)
それとも飛びもせずプロセス残ったまま反応しなくなるのでしょうか?
以下は すっ飛んでるんだろうと仮定して書いています
メイン(ボタン)処理で
・クローズ前に スレッドに対して終了要求フラグを立てる
・スレッドが終了するまで待つ(フラグでもシグナルでも確認はいくつか考えられます)
・ポートクローズ処理を行う
・スレッドでは終了フラグを監視して動作(現状多分ポーリングループしてるんでしょう)
するように変更する
・スレッド終了フラグを立てる
といった形でいいのでは?
もしくは実質のオープン・クロース処理自体をスレッド内に記載してもいいかと
メイン側処理とスレッド側処理で同期取れればどんな形でもいいかと思います
同期が取れてないからタイミングによってクローズ後にデータ読みに行って
アプリがすっ飛ぶということではないかと思います
テキストボックスの更新自体が問題の本質ではないと思いますよ
(データ読みに行って更新されるからこそ表示してるんでは?)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
.NetのBackgroundWorkerクラス...
-
マルチスレッドのスレッド数を...
-
スレッドがサスペンドされてい...
-
スレッドの終了を知りたい(Wind...
-
自作クラスのイベントを外部ハ...
-
スレッドにて同一メモリの書き...
-
Macターミナルで実行中のプログ...
-
powershell を使いカレントディ...
-
家電製品の電力周波数を変える機械
-
if ( a & b == b )
-
アプリケーションが終了するま...
-
C言語プログラミングで、多項式...
-
C#で通信処理。応答がない場合...
-
実行時のコマンドプロンプトを...
-
PIC mainループについて
-
VBA:CSVファイルの読出し手法...
-
bmp → jpeg への変換
-
.sb3のファイルを.sb2に変換す...
-
常駐するアプリケーションを初...
-
InvalidateRectがうまくいかない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
VC++スレッドの正しい終了のさ...
-
Windows上で、シグナル(SIGTERM...
-
スレッドにて同一メモリの書き...
-
.netアプリへのSendMessageでフ...
-
メインスレッドのPostMessageと...
-
スレッドの監視方法について
-
C# スレッド終了の監視について
-
_beginthreadexで生成したスレ...
-
別スレッドのデータを受信できない
-
別スレッドからメインダイアロ...
-
スレッドの安全な終了のさせ方
-
マルチスレッドのスレッド数を...
-
VB2005 シリアル通信のClose処理
-
スレッドの終了の仕方
-
pthread_cond_wait 取りこぼし?
-
マルチスレッドプログラム
-
Linuxでスレッド優先度って変え...
-
別スレッドとイベントの終了手...
-
Win32APIでのスレッド処理
おすすめ情報