我正在开发一个使用GPS连接到我的计算机端口com的应用程序。
我的应用程序获得2个Windows,第一个是显示窗口,我将显示我的所有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函数。 在这个函数中,我想将这些数据发送到我打开的currentWindow。为此,我创建了一个名为" GPSWindow" (使用一种方法无效GPSHandle(字符串数据))
但是当我尝试调用currentWindow.GPSHandle(Data)时,我的catch上出现错误:"调用线程无法访问此对象,因为另一个线程拥有它"。
我尝试使用Application.Current.Dispatcher,但我试过的每一件事都会把这个结果发给我。
也许我可以使用事件处理程序传递这些数据,但我不知道该怎么做。
我的问题是:
如何访问已被其他线程使用的线程?
void GPSWindow.GPSHandle(string data)
{
System.Windows.Forms.MessageBox.Show("GPS : " + data);
}
答案 0 :(得分:2)
试试这个
1)在 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);
}