2016-06-02 5 views
2

Я разрабатываю приложение, которое использует GPS, подключенный к порту com моего компьютера.WPF C# вызов окна функции из приложения

Мое приложение получило 2 окна, первое окно дисплея, я покажу все свои GPS-данные, а второй - это карта.

Я поставил все мой код для открытия COM-порта и читать его в App.cs

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Data; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Threading; 
using tmagpsapi; 

namespace TDF 
{ 
public partial class App : Application 
{ 


    private tmagpsapi.NMEA gps; 
    private tmaSerialport sp; 


    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     gps = new NMEA(); 
     sp = new tmaSerialport(); 

     sp.ComPortOpen += new tmaSerialport.ComPortOpenEventHandler(comportOpen); 
     sp.ComPortError += new tmaSerialport.ComPortErrorEventHandler(comportError); 
     sp.ComPortClosed += new tmaSerialport.ComPortClosedEventHandler(comportClosed); 
     gps.SuccessfulFix += new NMEA.SuccessfulFixEventHandler(gpsSuccessFix); 

     sp.Openport(30, System.IO.Ports.Parity.None, tmagpsapi.tmaSerialport.enumDatabits.Bit8, System.IO.Ports.StopBits.One, tmagpsapi.tmaSerialport.enumBaudRates.BaudRate9600); 
     sp.LineRecieved += sp_LineRecieved; 


    } 

    void sp_LineRecieved(string Data) 
    { 
     try 
     { 
      if (this.MainWindow != null) 
      { 
       var currentWindow = this.MainWindow as GPSWindow; 
       currentWindow.GPSHandle(Data); 

      } 
      else 
      { 
       System.Windows.Forms.MessageBox.Show("NULL"); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
      System.Windows.Forms.MessageBox.Show(e.Message); 
     } 

    } 

     private void comportClosed() 
    { 
     Console.WriteLine("COM PORT CLOSED"); 
     System.Windows.Forms.MessageBox.Show("COM PORT CLOSED"); 
    } 

    private void comportError(System.Exception es, String message) 
    { 
     Console.WriteLine("Error : " + message); 
     System.Windows.Forms.MessageBox.Show("Error : " + message); 
    } 

    private void comportOpen() { 
     Console.WriteLine("COM PORT OPENED"); 
     System.Windows.Forms.MessageBox.Show("COM PORT OPENED"); 
    } 
    private void gpsSuccessFix(tmagpsapi.NMEA_Position position) 
    { 

     Console.WriteLine("GPS OK"); 
     System.Windows.Forms.MessageBox.Show("GPS OK"); 

    } 

    private void Application_Exit(object sender, ExitEventArgs e) 
    { 
     sp.Close(); 
    } 
}} 

Как вы можете видеть в этом коде, когда я запустить приложение, я открываю мой COM-порт и когда я закрываю приложение, я закрыл его.

Когда у меня есть новые данные на моем COM-порте, вызывается функция sp_LineRecieved. В этой функции я хочу отправить эти данные в открывшемся текущем окне. Для этого я создал интерфейс с именем «GPSWindow» (с одним методом void GPSHandle (строковые данные))

Но когда я пытаюсь вызвать currentWindow.GPSHandle (Data), я получил сообщение об ошибке: вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток ».

Я попытался использовать Application.Current.Dispatcher, но все, что я пробовал, присылаю мне этот результат.

Возможно, я могу передать эти данные обработчику событий, но я не знаю, как это сделать.

Мой вопрос:

Как я могу получить доступ к нить, которая уже используется в другом потоке?

void GPSWindow.GPSHandle(string data) 
    { 
     System.Windows.Forms.MessageBox.Show("GPS : " + data); 
    } 
+0

[Полезно ли это?] (Https://github.com/jathalls/SR420-2/blob/master/SR6/GPS. cs) – Bolu

+0

В чем именно происходит шаг за шагом? Как вы управляете элементами пользовательского интерфейса внутри 'GPSHandle'? Можете ли вы предоставить исключение stacktrace? – Sam

+0

Исключение добавляется в currentWindow.GPSHandle (Data), я помещаю вам код функции в сообщение –

ответ

2

Попробуйте

1) Добавить на следующие handller событий в App класс

public static event EventHandler<String> RaiseWhenANewLineRecieved = delegate {}; 

2) Когда новая линия получила добавить следующий

RaiseWhenANewLineRecieved(this, Data); 

3) Добавить прослушиватель событий в конструкторе MainWindow

App.RaiseWhenANewLineRecieved += App_RaiseWhenANewLineRecieved; 

4) Показать данные в MainWindow

void App_RaiseWhenANewLineRecieved(object sender, string e) 
{ 
     System.Windows.Forms.MessageBox.Show("GPS : " + e); 
} 
+0

Ха-ха, вы гениальный <3 –

Смежные вопросы