Я разрабатываю приложение, которое использует 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);
}
[Полезно ли это?] (Https://github.com/jathalls/SR420-2/blob/master/SR6/GPS. cs) – Bolu
В чем именно происходит шаг за шагом? Как вы управляете элементами пользовательского интерфейса внутри 'GPSHandle'? Можете ли вы предоставить исключение stacktrace? – Sam
Исключение добавляется в currentWindow.GPSHandle (Data), я помещаю вам код функции в сообщение –