2012-12-27 68 views
0

我正在使用VB.Net的項目調度程序,應用程序從Application.Run()的「Sub Main」開始,所有程序代碼都是類中的處理程序,創建並啓動在這裏,VB.Net從後臺線程更新用戶界面

Public Sub Main() 
    m_App = New myApp 
    m_App.Start() 
    Application.Run() 
End Sub 

的對myApp內部,有一個計時器來控制任務的執行,當任務完成後,我們會盡量顯示警報窗口將開始以爲每個任務的線程,如果檢測到錯誤。通過在主線程

在任務對象添加pulic事件,則AddHandler的給函數

1):我們已在以顯示警告窗口(frmAlert)測試了兩種不同的方式用於執行線程和主線程之間共產

2)使用代理通知主線程

但是,警報窗口無法顯示,並且沒有錯誤報告。在使用IDE進行調試後,發現警報窗口已成功顯示,但在任務線程完成時會關閉。

下面是一個簡化的任務類,

Public Class myProcess 

    Public Event NotifyEvent() 

    Public Delegate Sub NotifyDelegate() 
    Private m_NotifyDelegate As NotifyDelegate 

    Public Sub SetNotify(ByVal NotifyDelegate As NotifyDelegate) 
     m_NotifyDelegate = NotifyDelegate 
    End Sub 


    Public Sub Execute() 
     System.Threading.Thread.Sleep(2000) 
     RaiseEvent NotifyEvent() 
     If m_NotifyDelegate IsNot Nothing Then m_NotifyDelegate() 
    End Sub 

End Class 

和主應用程序類

Imports System.Threading 

Public Class myApp 
    Private WithEvents _Timer As New Windows.Forms.Timer 

    Private m_Process As New myProcess 


    Public Sub Start() 
     AddHandler m_Process.NotifyEvent, AddressOf Me.NotifyEvent 
     m_Process.SetNotify(AddressOf NotifyDelegate) 
     ProcessTasks() 
    End Sub 

    Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _Timer.Tick 
     ProcessTasks() 
    End Sub 

    Public Sub ProcessTasks() 
     _Timer.Enabled = False 
     ' 
     Dim m_Thread = New Thread(AddressOf m_Process.Execute) 
     m_Thread.Start() 
     ' 
     _Timer.Interval = 30000 
     _Timer.Enabled = True 
    End Sub 

    Public Sub NotifyEvent() 
     frmAlert.Show() 
    End Sub 

    Public Sub NotifyDelegate() 
     frmAlert.Show() 
    End Sub 

End Class 

結果發現通過使用NotifyEvent或該frmAlert示出(有兩個共產方法測試) NotifyDelegate,但執行完成後立即關閉。

我可以知道我們如何從執行線程彈出一個警告窗口,它可以保持在屏幕上,直到用戶關閉它爲止?

在此先感謝!

回答

0

您需要確保您的主線程不會終止,如果您希望它在子線程引發事件時執行任何操作。

Public Sub Start() 
    AddHandler m_Process.NotifyEvent, AddressOf Me.NotifyEvent 
    m_Process.SetNotify(AddressOf NotifyDelegate) 
    ProcessTasks() 

    Do While True 'You might want to add a boolean condition here to instruct the main program to terminate when you want it to. 
     System.Threading.Thread.Sleep(200) 
    Loop 
End Sub 

這將阻止主線程(程序)結束,因此將可用於處理子線程引發的任何事件。注意:你的班級沒有終止條件。

+0

感謝您的建議,但沒有必要保持myApp.start()運行,因爲調度程序由定時器控制,沒有定時器的事件,此時應用程序不會結束。應用程序由application.run()啓動,它將繼續在內存中運行,直到我觸發Application.Exit()(它將在實際應用程序的NotifyIcon的ContextMenu中完成,此部分未在簡化中顯示上面的樣品)。 –

+0

通過從myProcess.Execute()調用frmAlert.show()顯示警告窗口,但是當myProcess.Execute()結束時(即後臺線程完成)它關閉。即使我們讓myApp.Start()繼續運行,結果也是一樣的。 –

相關問題