Vb.net PowerPoint幻灯片放映期间SerialPort.DataReceived事件停止

Vb.net PowerPoint幻灯片放映期间SerialPort.DataReceived事件停止,vb.net,serial-port,powerpoint,add-in,Vb.net,Serial Port,Powerpoint,Add In,使用VS2012.NET,我正在为PowerPoint 2010开发一个功能区条样式的加载项,我希望传入的串行端口值通过一个算法传递,并根据输出执行一个操作,如下一张幻灯片或上一张幻灯片。我正在使用SerialPort.DataReceived事件处理程序 使用迭代变量j可以更简单地解释我的问题,该变量的值在每次调用SerialPort.DataReceived事件处理程序时增加1。我将在代码之后进一步详细说明这个问题,但简言之,一旦我的代码被称为j,在幻灯片演示开始之前以及幻灯片演示的前30秒

使用VS2012.NET,我正在为PowerPoint 2010开发一个功能区条样式的加载项,我希望传入的串行端口值通过一个算法传递,并根据输出执行一个操作,如下一张幻灯片或上一张幻灯片。我正在使用SerialPort.DataReceived事件处理程序

使用迭代变量j可以更简单地解释我的问题,该变量的值在每次调用SerialPort.DataReceived事件处理程序时增加1。我将在代码之后进一步详细说明这个问题,但简言之,一旦我的代码被称为j,在幻灯片演示开始之前以及幻灯片演示的前30秒左右,它的值就会如预期的那样增加。在演示模式下大约30秒后,j停止迭代。我正在观察j的值,在命中时使用断点和调试输出窗口

在一个类class2中,与通过单击功能区按钮启动的表单关联,所述表单中的按钮单击设置SerialPort.DataReceived处理程序并打开串行端口缩写相关代码:

Public Class class2 'called by clicking ribbon button
    Public sp As New SerialPort
    Public Baud As Integer = 9600
    Public Port As String
    Public c1 As class1

    Public Sub New(oParent As class1) 'get reference to parent class
        c1= oParent
        InitializeComponent()
    End Sub
    ....

    Public Sub btn1_Click(sender As Object, e As EventArgs) _
        Handles btn1.Click
        Port = lbCom.SelectedItem 'Port selected from form listbox
        Try
            With sp
                .BaudRate = Baud
                .PortName = Port
                .ReadTimeout = 5000   'Give serial port 5sto open
                .RtsEnable = True
            End With

            c1.mySP = sp
            AddHandler sp.DataReceived, AddressOf c1.spDataReceivedHandler
            sp.Open()
            Me.Hide()
        Catch ex As Exception
            MsgBox("Error", vbOKOnly, "Connection Error")
        End Try
    End Sub
End Class
Public Class class1
    ...
    Public Sub spDataReceivedHandler(ByVal sender As Object, _ 
        e As SerialDataReceivedEventArgs)
        j = j + 1 ' value monitored using Breakpoint When Hit
    End Sub
End Class
在主类class1中,我有DataReceived处理程序,并再次迭代变量j,简称为相关代码:

Public Class class2 'called by clicking ribbon button
    Public sp As New SerialPort
    Public Baud As Integer = 9600
    Public Port As String
    Public c1 As class1

    Public Sub New(oParent As class1) 'get reference to parent class
        c1= oParent
        InitializeComponent()
    End Sub
    ....

    Public Sub btn1_Click(sender As Object, e As EventArgs) _
        Handles btn1.Click
        Port = lbCom.SelectedItem 'Port selected from form listbox
        Try
            With sp
                .BaudRate = Baud
                .PortName = Port
                .ReadTimeout = 5000   'Give serial port 5sto open
                .RtsEnable = True
            End With

            c1.mySP = sp
            AddHandler sp.DataReceived, AddressOf c1.spDataReceivedHandler
            sp.Open()
            Me.Hide()
        Catch ex As Exception
            MsgBox("Error", vbOKOnly, "Connection Error")
        End Try
    End Sub
End Class
Public Class class1
    ...
    Public Sub spDataReceivedHandler(ByVal sender As Object, _ 
        e As SerialDataReceivedEventArgs)
        j = j + 1 ' value monitored using Breakpoint When Hit
    End Sub
End Class
关于这个问题的更多细节。一旦我开始我的代码,如果我不开始一个幻灯片演示j将迭代没有任何问题5分钟以上。如果我开始一个幻灯片演示,但立即点击alt+tab将焦点转移到另一个应用程序,例如VS,j将在PowerPoint仍处于演示模式的情况下进行迭代,而不会出现任何问题。如果我开始一个幻灯片演示并让它有焦点,j将在大约30秒后停止迭代,无论我在开始幻灯片演示之前让j迭代多长时间

我还尝试使用后台工作程序而不是串行端口事件处理程序,在那里我使用do循环从串行端口获取数据,但我遇到了相同的问题;在幻灯片演示文稿运行约30秒之前,它将按预期工作

我已经使用相同的串行端口参数和相同的设备编写了两个独立的Windows窗体样式的应用程序,它们工作正常。据我所知,问题在于幻灯片演示有重点,我猜是资源可用性


我打算试试我的运气使用任务并行库,但是如果有人对为什么存在上述令人抓狂的问题有任何见解,请告诉我注意:相对新手程序员,所以如果我的方法中有明显的错误,也请让我知道。谢谢。

好的,我不知道程序为什么会这样运行,但解决方法确实是将打开和监视串行端口代码放入ThisAddIn类的子类中,并在适当的时候单击按钮将其作为新任务调用

单击自定义功能区上的按钮:

Public Class myribbon    
    Private Sub btn_Click(sender As Object, e As RibbonControlEventArgs) _
        Handles btn.Click
        ' Define new task spTask (sub located in ThisAddIn)
        Dim spTask = New Task(Sub() Globals.ThisAddIn.readToSP())   
    End Sub
End Class

Public Class ThisAddIn
    ...' other stuff
    Dim mySP As New SerialPort
    Public Sub readToSP()
        ...' serial port params
        Try
            mySP.Open()
            While (mySP.IsOpen)
                Dim analogV As String = mySP.ReadTo(delimStr)
                ...' do something with analogV
            End While
        Catch ex as Exception 'appropriate catches...
        End Try
    End Sub
End Class