-1

これは私のアプリです。開始ボタンが有効、一時停止が無効、停止が無効の 3 つのボタンが表示されます。

ここに画像の説明を入力

問題は、「プロセス」を作成する (そして黒いリッチテキスト ボックスに情報を出力する) フォームに別のスレッドがあり、一時停止または停止できるようにすることですが、スレッドを起動すると一時停止します。ボタンと停止ボタンは、すぐに有効から無効に変わります。

_WaitHandle_FirstThreadDone.WaitOne()を使用してスレッドを起動した後にフォームに待機するように指示すると、一時停止ボタンと停止ボタンが有効になっていることがわかりますが、問題は「プロセス」が完了するまでアプリがハングすることです..だから私はどのボタンも押せません。

これを作るには助けが必要です...

私のフォームの重要な部分:

Public Class Form1

#Region "Append text function"

    ' Append Text
    Public Sub AppendText(box As RichTextBox, color As Color, text As String)

        Control.CheckForIllegalCrossThreadCalls = False

        Dim start As Integer = box.TextLength
        box.AppendText(text)
        Dim [end] As Integer = box.TextLength

        ' Textbox may transform chars, so (end-start) != text.Length
        box.[Select](start, [end] - start)
        If True Then
            box.SelectionColor = color
            ' could set box.SelectionBackColor, box.SelectionFont too.
        End If
        box.SelectionLength = 0
        ' clear
    End Sub

#End Region


#Region "Thread"

    Public _WaitHandle_FirstThreadDone As New System.Threading.AutoResetEvent(False)

    Public Sub ThreadProc(ByVal aDir As DirectoryInfo)

        Dim aFile As FileInfo

        For Each aFile In aDir.GetFiles()

            If accepted_extensions.ToLower.Contains(aFile.Extension.ToLower) Then

                ' print output
                AppendText(consolebox, Color.Yellow, "Processing: ")
                AppendText(consolebox, Color.White, aFile.ToString() + vbNewLine)
                consolebox.ScrollToCaret()
                processedfiles += 1
                totalfiles_label.Text = "Processed " + processedfiles.ToString() + " of " + totalfiles.ToString() + " total video files"

                ' MEDIAINFO:  (ac3, dts, wav and multitrack)
                If ac3 = True Or dts = True Or wav = True Or multitrack = True Then

                    MI.Open(aFile.FullName)

                    Dim Pos As Integer = 0
                    To_Display = Nothing

                    While Pos < MI.Count_Get(StreamKind.Audio)

                        ' AC-3
                        If ac3 = True Then
                            If MI.Get_(StreamKind.Audio, Pos, "Format").ToString() = "AC-3" Then
                                results_box.AppendText("AC3 Track: " + aFile.FullName.ToString() + vbNewLine)
                                results_box.SelectionStart = results_box.Text.Length
                                results_box.ScrollToCaret()
                                problems += 1
                                problems_label.Text = problems.ToString() + " problems found"
                            End If
                        End If

                        System.Math.Max(System.Threading.Interlocked.Increment(Pos), Pos - 1)
                    End While
                End If
            End If
        Next

        _WaitHandle_FirstThreadDone.Set()
    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
        Dim t As New Threading.Thread(AddressOf ThreadProc)
        t.Start(aDir)
        '
        For Each nextDir In aDir.GetDirectories
            If playlist = True Then
                Using writer As StreamWriter = New StreamWriter(aDir.FullName & "\" & nextDir.Name & "\" & nextDir.Name & ".m3u", False, System.Text.Encoding.UTF8)
                    'overwrite existing playlist
                End Using
            End If
            MediaInfoWorkWithDirectory(nextDir)
        Next
    End Sub

#End Region




#Region "Action buttons"

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


                consolebox.Clear()

                ' pause / cancel button ON
                start_button.Enabled = False
                pause_button.Enabled = True
                cancel_button.Enabled = True

                ' Organization process
                NameOfDirectory = userSelectedFolderPath
                MediaInfo(NameOfDirectory)
                '  _WaitHandle_FirstThreadDone.WaitOne()
                consolebox.AppendText(vbNewLine + "[+] Organization finalized!" + vbNewLine)
                consolebox.Refresh()
                consolebox.SelectionStart = consolebox.Text.Length
                consolebox.ScrollToCaret()

                ' pause / cancel button OFF
                start_button.Enabled = True
                pause_button.Enabled = False
                cancel_button.Enabled = False

    End Sub

#End Region


    Private Sub pause_button_Click(sender As Object, e As EventArgs) Handles pause_button.Click
        paused = True
    End Sub
End Class
4

1 に答える 1

2

アプリがハングする理由は、プログラムがデータを順番にブラストしているためです。ループしているパーツ内にifステートメントを追加して、処理間の一時停止条件を確認する必要があります。すべてが完了した後にのみボタンを有効にできるため、サブルーチン内にオン/オフコントロールを配置することはお勧めできません。

プロセスを停止するIE

私から10まで
checkbox1.checked = Trueの場合、ExitSub'停止条件をチェックします
'ビデオを処理する
ループ

一時停止するには、停止を実装できますが、再開したときにどこから開始するかを覚えておいてください。

また、なぜあなたは死の顔を持っているのですか?そのようなものは脳細胞を殺します。

于 2012-11-30T05:49:03.567 に答える