2011-10-13 14 views
6

Jestem bardzo nowy w wątkach. Mam nadzieję, że ktoś da mi przykład.Gwintowanie WPF C#

Próbuję uruchomić wątku, gdy użytkownik kliknie na przycisk start i wykonać następujący proces:

private void btnStart_Click(object sender, RoutedEventArgs e) 
{ 
    if (serialPort.IsOpen) 
     serialPort.Close(); 
    try 
    { 
     //To set all the parameters for Serial Comm 
     serialPort.PortName = "COM14"; 
     serialPort.BaudRate = int.Parse("38400"); 
     serialPort.Parity = Parity.None; 
     serialPort.DataBits = 8; 
     serialPort.StopBits = StopBits.One; 
     serialPort.Encoding = System.Text.Encoding.ASCII; 

     serialPort.DataReceived += new SerialDataReceivedEventHandler(GotRawData); 

     serialPort.Open(); 

     //To show that Com Port is Opened 
     txtboxOutput.AppendText(DateTime.Now.ToString("hh:mm:ss tt") + " - COM14 is opened." + Environment.NewLine); 
     txtboxOutput.ScrollToEnd(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message.ToString()); 
    } 
} 

private void GotRawData() to metoda, gdzie coś zrobić, aby uzyskać kilka surowych danych z sprzęt komputerowy.

+0

Zobacz to pytanie, aby uzyskać więcej informacji na BackgroundWorker: http://stackoverflow.com/questions/5483565/how-to-use-wpf-background-worker –

Odpowiedz

7

Może się zdarzyć, że klasa będzie przydatna, co w moim rozumieniu jest najprostszym sposobem wykonania operacji w osobnym wątku.

+0

ja już patrzeć na to, ale nie wiem wiedzieć, jak go właściwie używać. Natknąłem się na wiele wątków, nie wiem, który z nich jest lepszy dla mojej sprawy. Przykład jak threadPool and Dispatcher i this backgroundWorker. Chciałbym mieć przykład oparty na moim projekcie. Łatwiej mi zrozumieć. Podziękowania i tak za odpowiedź =) – user981924

+0

Bez problemu - cieszę się, że pomogło. Aby rozpocząć, wystarczy zawrzeć dowolny kod, który należy uruchomić w osobnym wątku w jego zdarzeniu ['DoWork'] (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.dowork.aspx) treser. Mimo to polecam ci przejrzeć próbki kodu w MSDN, są one dobrze udokumentowane. –

0

Nie wiem, czy dobrze zrozumiałem pytanie. Po kliknięciu przycisku użytkownik chce uruchomić osobny wątek i odebrać dane z portu szeregowego. myślę, że to powinno:

private void btnStart_Click(object sender, RoutedEventArgs e) 
{ 
Thread GetData = new Thread(thFunctionToRun); 
GetData.Start(); 
} 
0

Nie robisz żadnych blokowanie połączeń w btnStart_Click, więc dobrze jest po prostu uruchomić to na głównym wątku UI.

Kilka punktów:

  • Pamiętaj, że GotRawData zostanie wywołana w wątku roboczego, więc jeśli są jakieś kontrole dostępu UI, trzeba będzie zebrać te oddzwania na wątku UI.

  • Od MSDN SerialPort.Open:

Najlepszym rozwiązaniem dla każdej aplikacji jest czekać na jakiś czas po wywołaniu metody Close przed przystąpieniem do wywołania metody Open, jako port nie może być natychmiast zamknięty.