私はマルチスレッドアプリケーションに私のプログラムを作ろうとしていますが、私は次のコードで説明した一連の問題にぶつかりました。私がこれを正しく動作させるために私が得ることができるどんな助けも非常に高く評価されるので、私はこのスタブを既存のアプリケーションのより効率的なバージョンに拡張することができます。このマルチスレッドのVB.NET(2010 Express Edition)プログラムが正しく動作しないのはなぜですか?
この点についてご指摘いただきありがとうございます。 - アーロン
Imports System.Threading
Public Class frmMain
''' <summary>Initializes the multithreaded form</summary>
Private Sub Initialize() Handles MyBase.Load
AddThread(AddressOf Update_UI)
running = True
For Each Thread In ThreadPool
Thread.IsBackground = True
Thread.Start()
Next
End Sub
''' <summary>Terminates the multithreaded form</summary>
Protected Overrides Sub Finalize() Handles MyBase.FormClosing
running = False
For Each Thread In ThreadPool
Thread.Join()
Thread = Nothing
Next
End Sub
''' <summary>Adds a worker thread to the ThreadPool</summary>
''' <param name="pointer">The AddressOf the function to run on a new thread.</param>
Private Sub AddThread(ByRef pointer As System.Threading.ParameterizedThreadStart)
Dim newthread As Integer
If ThreadPool Is Nothing Then newthread = 0 Else newthread = ThreadPool.GetUpperBound(0) + 1
ReDim Preserve ThreadPool(newthread)
ThreadPool(newthread) = New Thread(pointer)
End Sub
''' <summary>Updates the User Interface</summary>
Private Sub Update_UI()
'HELP: The commented out lines in this subroutine make the program work incorrectly when uncommented.
'HELP: It should echo 'output' to the titlebar of frmMain, but it also makes the form unresponsive.
'HELP: When I force the form to quit, the 'termination alert' does not trigger, instead the application hangs completely on Thread.Join (see above).
'HELP: If I remove DoEvents(), the form is unable to be closed...it simply goes unresponsive. Shouldn't the multithreading keep us from needing DoEvents()?
'If Me.InvokeRequired Then
' Me.Invoke(New MethodInvoker(AddressOf Update_UI))
'Else
While running
Dim output As String = System.DateTime.Now + " :: Update_UI() is active!"
Debug.Print(output)
'Application.DoEvents()
'Me.Text = output
End While
Debug.Print(System.DateTime.Now + " :: Termination signal recieved...")
'End If
End Sub
Delegate Sub dlgUpdate_UI()
Private ThreadPool() As Thread
Private running As Boolean
End Class
これはBackgroundWorkerを使ってみましたが、Threadを使用するのと同じ問題があるようですが、このコンテキストで使用する方法を正確にはわからないこともあります。 –
しかし、少なくともこれを分析して、現在のスレッドの使い方が間違っていることを理解することができます...タイマーを使用して更新割り当てを行い、kill-codeを取得するヒントをありがとうこの特定のプログラムには必ずしも影響しませんが、もっと複雑なプログラムでは計画しています。 –
Finalizeルーチンをどのように処理することをお勧めしますか?私はそれをFormClosingで実行したいが、潜在的なタイムアウトとクラッシュの対象にならないようにする(より洗練されたフォームでこのテンプレートを使用できる)。言い換えれば...フォームクローズをブロックしてFinalizeが完了するのを待つ方法はありますか? –