2012-03-23 10 views
1

私はC#を初めて使用していますが、問題が発生しています。シリアルポートから入力を受け取るスレッドを実行するフォームがあります。しかし、ウィンドウが閉じられると、スレッドは実行を継続します。私はvirtual void OnClosing(object sender, CancelEventArgs e)をオーバーライドしようとしましたが、MessageBoxはポップアップを維持しています。つまり、スレッドはまだ実行中です。私は間違って何をしていますか?ウィンドウが閉じられる前にクリーンアップを行うためにオーバーライドするのに最適なライフサイクルメソッドはどれですか?あなたが既に持っている、その後WindowsフォームOnClosingスレッドを停止する

あなたのコードの最初の呼び出しのport.closeでDisplayForm.cs

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.IO.Ports; 
using System.Threading; 
using System.Windows.Forms; 

namespace project 
{ 
    public partial class DisplayForm : Form 
    { 
     private Thread readThread; 
     private SerialPort port; 
     private bool running; 

     public DisplayForm(String portName) 
     { 
      InitializeComponent(); 


      port = new SerialPort(portName); 
      port.Open(); 

      readThread = new Thread(Read); 
      running = true; 
      readThread.Start(); 
     } 

     public void Read() 
     { 
      while (running) 
      { 
       try 
       { 
        string message = port.ReadLine(); 
        Console.Write(message); 
        MessageBox.Show(message); 
       } 
       catch (TimeoutException) 
       { 

       } 
      } 
     } 

     protected virtual void OnClosing(object sender, CancelEventArgs e) 
     { 
      running = false; 
      readThread.Join(); 
      port.Close(); 
     } 
    } 
} 
+0

「動作していないように見える」...どうしてですか?何が起こるのですか?デバッガでは何が表示されますか? – SLaks

+0

デバッガには何もありません。 MessageBoxesはポップアップを維持します。つまり、スレッドがまだ実行中であることを意味します。 –

+0

メッセージのバックログですか?代わりにMessageBoxを削除してコンソールを見るとどうなりますか? –

答えて

3

Abort()ではなくJoin()を使用する必要があります。

protected virtual void OnClosing(object sender, CancelEventArgs e) 
{ 
    running = false; 
    readThread.Abort(); 
    port.Close(); 
} 
0

OnClosingまたはOnClosedイベントコールいずれかの子スレッドの実行を参照し、それらのすべてを中止しよう...とrunThread Onclでアクセスする

関連する問題