LOGO

sponsor.jpg

   ホーム      
 | 
  
   イベント      
 | 
  
   コラム      
 | 
  
   連載      
 | 
  
   フォーラム      
 | 
  
   VSUG      
 | 
  
   スタッフ日記      
 | 
  
   VSUG キャスト   
会員サービス
メンバー ログイン
新規会員登録はこちら
MENU
ホーム
イベント
VSUG アカデミー
VSUG Day
VSUG設立記念セミナー
PASSJ Conference 2006
Developers Conference 2006
Tech・Ed 2007 Yokohama
コードコンテスト2007
Developers Summit 2008
Leaders Summit 2008 :PPT
Tech・Ed 2008 Yokohama
コラム
連載
.NET Frameworkとはなんぞや
LINQ活用の基礎(前編)
LINQ活用の基礎(後編)
マイクロソフトのリッチクライアント技術
WPF アプリ開発チュートリアル(1)
WPF アプリ開発チュートリアル(2)
LINQ to XML の基礎(前編)
LINQ to XML の基礎(後編)
ASP.NETにおけるイベントドリブンモデルとページライフサイクル(前編)
ASP.NETにおけるイベントドリブンモデルとページライフサイクル(後編)
ASP.NET の状態管理(前編)
ASP.NET の状態管理(後編)
WPFとWindowsフォームの相互運用(前編)
WPFとWindowsフォームの相互運用(後編)
データソースコントロールとの連携(その1)
データソースコントロールとの連携(その2)
フォーラム
初心者フォーラム
Visual Studio
.NET 開発
プラットフォーム運用
フリートーク・お知らせ
フォーラムの利用案内
VSUG
VSUGとは
フォーラムリーダー紹介
ガジェット
スタッフ日記
VSUG キャスト
マイクロソフト株式会社 近藤 和彦 氏
フォーラムグループ
初心者フォーラム
初心者なんでも相談室
Visual Studio
Visual Studio 2005
Visual Studio 旧環境
.NET 開発
Visual Basic
Visual C#
Visual C++/CLI その他
Web アプリケーション
リッチクライアント・UI コントロール
データベース・データアクセス
モバイル・スマートクライアント
.NET Framework
開発プロセス
マイグレーション・COM 相互運用
Office 開発・VSTO
Web ホスティングアプリケーション
ライティング・セキュアコード
プラットフォーム運用
運用管理
フリートーク・お知らせ
談話室
VSUGからのお知らせ
フォーラムの利用案内
インフォメーション
会員規約
会員登録
プライバシーポリシー
リンクポリシー
著作権について
スポンサーについて
お問い合わせ
オンライン状態
オンライン状況 オンライン状態:
未登録ユーザー 未登録ユーザー: 249
登録ユーザー 登録ユーザー: 0
計 計: 249

オンライン中のユーザー オンライン中のユーザー:

 
  VSUG フォーラム  .NET 開発  Visual C++/CLI ...  SerialPortをCloseするとアプリケーションがフリーズする
前へ 前へ
 
次へ 次へ
新しい投稿 2007/06/14 0:48
ユーザーはオフラインです。 Interest
6件の投稿
ランキングデータがありません


SerialPortをCloseするとアプリケーションがフリーズする 
言語:VC++ / Ver:2005 / プラットフォーム:Windows XP

お世話になっております、Interest です。

先日の
http://vsug.jp/tabid/63/forumid/46/postid/9978/view/topic/Default.aspx
の質問後、順調に見えたシリアル通信プログラムが、また壁にぶつかってしまいました。壁と言うのは、タイトルのとおり、「SerialPortをCloseするとアプリケーションがフリーズする」ということです。

SerialPortのCloseは、次のコードで実行しています。

 private: System::Void ConnectButton_Click(System::Object^  sender, System::EventArgs^  e) {

     try{
      if( serialPort1->IsOpen )
      {
       serialPort1->Close();
      }
      else
      {
       serialPort1->PortName = portNoCombo->Text;
       serialPort1->Open();
      }
     }
(以下省略)

デバッガでステップ実行すると、
 serialPort1->Close();
を実行した後で黄色い矢印が行方不明になります。
このとき、呼び出し履歴を見ると

 GPSLibTest.exe!GPSLibTest::Form1::ConnectButton_Click(System::Object^ sender = 0x0012ed10, System::EventArgs^ e = 0x0012ed3c) 行 194 C++
  System.dll!System.IO.Ports.SerialPort.Close() + 0xa バイト 
  System.dll!System.IO.Ports.SerialPort.Dispose(bool disposing = true) + 0x3c バイト 
  mscorlib.dll!System.IO.Stream.Close() + 0x10 バイト 
  System.dll!System.IO.Ports.SerialStream.Dispose(bool disposing = true) + 0x14e バイト 
  [sleep、wait、または join] 

となっています。

インターネット上で同様の症状が無いか探してみたところ、
MSDN Forum(英語)
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=486590&SiteID=1
に、同じ症状の報告がありましたが、解決したという報告は上がっていません。

今回のプログラムはデータを受信しているだけですので、書き込みバッファ云々は無関係です。また、serialPort1->Close(); 自体が返ってこないので、Close後にちょっと時間を置けというアドバイスも的外れです。

試しに、Disposedイベントに対するハンドラとErrorReceivedイベントに対するハンドラをそれぞれつけてみましたが、Close時に呼び出されないので関係ないようです。

解決へのアドバイスをいただけますよう、お願いします。

 
新しい投稿 2007/06/14 2:43
ユーザーはオフラインです。 Interest
6件の投稿
ランキングデータがありません


RE: SerialPortをCloseするとアプリケーションがフリーズする 

Interestです。質問しておきながら自分で解決してしまいました。

問題の原因は前回の Invoke の仕方にあったようです。
解決できた状態のコードを記載します。

 delegate void SetTextCallback(String^ text);

 private: void SetText(String^ text){

     if( this->serialLogText->InvokeRequired )
     {
      SetTextCallback^ d = gcnew SetTextCallback(this, &GPSLibTest::Form1::SetText);
//      this->Invoke( d, text );  // これでは Close時にフリーズする
      this->BeginInvoke( d, text ); // こっちが正解
     }
     else
     {
      this->serialLogText->Text += text;
     }
    }

 private: System::Void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e){

     String^ str;

     try{
      str = serialPort1->ReadLine();
      SetText(str);
     }
     catch(InvalidOperationException^ e){
      SetText(e->Message );
     }
     catch(TimeoutException^ e){
      SetText(e->Message );
     }
     catch(Exception^ e){
      SetText(e->Message );
     }
    }

解決のヒントは
MSDNフォーラム(日本語)
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1098118&SiteID=7
で、「BeginInvokeを使う」と書いてあったのを素直に実行してみました。

BeginInvokeの書式は
http://msdn2.microsoft.com/ja-jp/library/a06c0dc2(VS.80).aspx
にあるとおり、Invokeと同じでしたので、 InvokeをBeginInvokeに差し替えただけで、serialPort1->Close(); 実行時のフリーズが発生しなくなりました。(変更前は9割以上の確率でフリーズしていました。)

以上、前回の質問
http://vsug.jp/tabid/63/forumid/46/postid/9978/view/topic/Default.aspx
は解決したようで実は解決していなかったが、BeginInvokeで解決できた、という報告でした。

お騒がせました。m(_ _)m

 
 1/1ページ
前へ 前へ
 
次へ 次へ
  VSUG フォーラム  .NET 開発  Visual C++/CLI ...  SerialPortをCloseするとアプリケーションがフリーズする
ログイン | © 2005-2008 Visual Studio User Group. All rights reserved. 著作権について | プライバシーポリシー | リンクポリシー | お問合せ