来自App的WPF C#调用窗口函数

时间:2016-06-02 09:40:07

标签: c# wpf multithreading gps

我正在开发一个使用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);
    }

1 个答案:

答案 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);
 }