2

フォームについて少し(または大きな)ヘルプが必要です。「Organizefunction」領域内のすべてを別のスレッドで使用する必要があります。

フォームの「スタートボタン」領域にあるボタンを押して、「Organizefunction」サブの最初のサブを呼び出します。最初のサブは2番目のサブを呼び出し、2番目のサブは3番目のサブを呼び出します。

3番目のサブを自分で別のスレッドに追加し、2番目のサブを使用して引数をスレッドに渡そうとしましたが、すべてが間違っています。

誰かが私がこれをするのを手伝ってくれますか?

PS:このフォームの重要でない部分を削除して、確認しやすくしました。

読んでくれてありがとう。

Public Class Form1


#Region "Declarations"

        ' MediaInfo
        Dim MI As MediaInfo

        ' Thread
        Dim paused As Boolean = False

        ' Others
        Dim NameOfDirectory As String = Nothing
        Dim aFile As FileInfo

#End Region



    'thread
    Dim t As New Thread(AddressOf ThreadProc)

    Public Sub ThreadProc()
        ' Aqui debería ir  todo el sub de "organize function", bueno... son 3 subs!
        If paused = True Then MsgBox("THREAD PAUSADO")
    End Sub



#Region "Properties"
...
#End Region

#Region "Load / Close"
...
#End Region

#Region "Get Total files Function"
...
#End Region

#Region "Option checkboxes"
...
#End Region

#Region "Folder buttons"
...
#End Region

#Region "Append text function"
...
#End Region





#Region "Action buttons"

   ' pause button
    Private Sub pause_button_Click(sender As Object, e As EventArgs) Handles pause_button.Click
        paused = True
    End Sub

    ' start button
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles start_button.Click

              t.Start()

                    ' Organization process
                    NameOfDirectory = userSelectedFolderPath
                    MediaInfo(NameOfDirectory)

        End Sub

#End region





#Region "Organize function"

        Public Sub MediaInfo(Directory)
            Dim MyDirectory As DirectoryInfo
            MyDirectory = New DirectoryInfo(NameOfDirectory)
            MediaInfoWorkWithDirectory(MyDirectory)
        End Sub

        Public Sub MediaInfoWorkWithDirectory(ByVal aDir As DirectoryInfo)
            Dim nextDir As DirectoryInfo
            MediaInfoWorkWithFilesInDir(aDir)
            For Each nextDir In aDir.GetDirectories
                Using writer As StreamWriter = New StreamWriter(aDir.FullName & "\" & nextDir.Name & "\" & nextDir.Name & ".m3u", False, System.Text.Encoding.UTF8)
                    'overwrite existing playlist
                End Using
                MediaInfoWorkWithDirectory(nextDir)
            Next
        End Sub

        Public Sub MediaInfoWorkWithFilesInDir(ByVal aDir As DirectoryInfo)

            Dim aFile As FileInfo





            For Each aFile In aDir.GetFiles()

               ' hacer cosas con aFile ...

            Next

        End Sub

#End Region



End Class
4

2 に答える 2

6

長時間実行されるタスクをUIスレッドからバックグラウンドスレッドにオフロードするように特別に設計されたBackgroundWorkerと呼ばれるWindowsフォームコンポーネントがあり、フォームの応答性を向上させます。

BackgroundWorkerコンポーネントには、別のスレッドでコードを実行するために使用されるDoWorkというイベントがあります。BackgroundWorkerコンポーネントをフォームにドラッグしてから、次のようにします。

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles start_button.Click
    NameOfDirectory = userSelectedFolderPath
    backgroundWorker1.RunWorkerAsync(NameOfDirectory)
End Sub

Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Dim directoryName as string = e.Argument

    MediaInfo(directoryName)
End Sub

役に立つかもしれないいくつかのリンクは、MSDNBackgroundWorkerページとCodeProjectの例です

HTH

于 2012-11-28T11:43:04.160 に答える
3

この問題を解決するには、約5ダースの方法があります。そのうちの3つだけを表示します。

Public Class Form1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    ' fire and forget:
    Task.Run(Sub() FooA()).ContinueWith(Sub() FooB()).ContinueWith(Sub() FooC())
    Console.WriteLine("Button1 done")

End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    ' fire and forget:
    Task.Run(Sub()
                 FooA()
                 FooB()
                 FooC()
             End Sub)
    Console.WriteLine("Button2 done")

End Sub

Private Async Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

    ' wait but dont block:
    Await Task.Run(Sub()
                       FooA()
                       FooB()
                       FooC()
                   End Sub)
    Console.WriteLine("Button3 done")

End Sub

Private Sub FooA()
    Threading.Thread.Sleep(1000)
    Console.WriteLine("A")
End Sub

Private Sub FooB()
    Threading.Thread.Sleep(1000)
    Console.WriteLine("B")
End Sub

Private Sub FooC()
    Threading.Thread.Sleep(1000)
    Console.WriteLine("C")
End Sub

End Class

Await(IF FW 4.xおよびVS2012は問題ではありません)のあるものをお勧めします。

于 2012-11-28T11:53:21.167 に答える