2014-11-22 56 views
0

使用VS2012(.NET)我正在開發一個適用於PowerPoint(2010)的功能區欄樣式外接程序,我希望傳入的串行端口值可以通過算法傳遞,輸出,執行諸如下一張幻燈片或上一張幻燈片之類的動作。我正在使用SerialPort.DataReceived事件處理程序。SerialPort.DataReceived事件在PowerPoint幻燈片放映中停止

我的問題更簡單地使用迭代變量j來解釋,每次調用SerialPort.DataReceived事件處理函數時,它的值增加1。我將在代碼後更詳細地說明問題,但總而言之,一旦我的代碼被稱爲j在幻燈片展示的前30秒左右幻燈片展示開始前的預期值增加。在演示模式下約30秒後,停止迭代。我正在使用「點擊時斷點」和「調試輸出」窗口觀察值j

在一個類(等級2),通過單擊功能區按鈕推出了表單關聯,點擊一個按鈕在上述的形式設置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 

在主類(1類)我有DataReceived處理器和迭代變量Ĵ(再次,縮寫相關的代碼):

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 +選項卡將焦點放到另一個應用程序上,比如說VS,j將無任何問題地迭代(PowerPoint仍處於演示模式)。如果我開始幻燈片演示並讓其具有焦點j將在約30秒後停止迭代,無論我在開始幻燈片演示之前多長時間迭代一次。

我也嘗試過使用後臺工作器而不是串口事件處理程序,我使用do循環從串口獲取數據,但遇到同樣的問題;按預期工作,直到幻燈片演示文稿已運行約30秒。

我已經寫了兩個獨立的Windows窗體樣式的應用程序使用相同的串行端口參數和相同的設備工作正常。據我所知,這個問題是關於幻燈片演示的焦點(我猜資源可用性?)。

我要使用任務並行庫來嘗試我的運氣,但如果任何人有任何洞察力,爲什麼存在上述瘋狂的問題請開導我(注意:相對新手程序員,所以如果有一個明顯的錯誤在我的方法中,請讓我知道)。謝謝。

回答

0

好的,所以不知道爲什麼程序會這樣做,但是解決方法的確是將「打開並監控」串行端口代碼放入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