Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 表格don';t等待线程完成并挂起我的应用程序_Vb.net_Multithreading_Backgroundworker_Background Process - Fatal编程技术网

Vb.net 表格don';t等待线程完成并挂起我的应用程序

Vb.net 表格don';t等待线程完成并挂起我的应用程序,vb.net,multithreading,backgroundworker,background-process,Vb.net,Multithreading,Backgroundworker,Background Process,这是我的应用程序,你可以看到3个按钮,启动按钮启用,暂停禁用和停止禁用 问题是我的表单中有一个单独的线程来进行“处理”(并在黑色richtextbox中打印信息),我的意图是可以暂停或停止它,但当我启动线程时,暂停按钮和停止按钮在一秒钟内变为禁用 我可以使用\u WaitHandle\u FirstThreadDone.WaitOne()命令表单在启动线程后等待,然后我可以看到已启用的暂停和停止按钮,但问题是我的应用程序会挂起,直到“进程”完成。。所以我不能按任何按钮 求你了,我需要帮助来做这

这是我的应用程序,你可以看到3个按钮,启动按钮启用,暂停禁用和停止禁用

问题是我的表单中有一个单独的线程来进行“处理”(并在黑色richtextbox中打印信息),我的意图是可以暂停或停止它,但当我启动线程时,暂停按钮和停止按钮在一秒钟内变为禁用

我可以使用\u WaitHandle\u 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
公共类表单1
#区域“追加文本函数”
'追加文本
公共子附录文本(框作为RichTextBox,颜色作为颜色,文本作为字符串)
Control.CheckForIllegalCrossThreadCalls=False
Dim起始值为整数=box.TextLength
box.AppendText(文本)
Dim[end]为整数=box.TextLength
'文本框可能会转换字符,因此(结束-开始)!=文本长度
框。[选择](开始,[结束]-开始)
如果是真的话
box.SelectionColor=color
'可以设置box.SelectionBackColor,也可以设置box.SelectionFont。
如果结束
box.SelectionLength=0
“清楚
端接头
#末端区域
#区域“线程”
Public_WaitHandle_FirstThreadDone作为新的System.Threading.AutoResetEvent(False)
公共子线程进程(ByVal aDir作为DirectoryInfo)
将文件设置为文件信息
对于aDir.GetFiles()中的每个文件
如果接受了_extensions.ToLower.Contains(aFile.Extension.ToLower),则
'打印输出
附录文本(控制台框,颜色.黄色,“处理:”)
AppendText(控制台框,颜色.White,文件.ToString()+vbNewLine)
consolebox.ScrollToCaret()
processedfiles+=1
totalfiles\u label.Text=“已处理”+processedfiles.ToString()+“共”+totalfiles.ToString()+“总视频文件”
'MEDIAINFO:(ac3、dts、wav和多轨)
如果ac3=True或dts=True或wav=True或multitrack=True,则
MI.Open(文件全名)
Dim Pos作为整数=0
显示=无
而位置
应用程序挂起的原因是程序正在按顺序快速浏览数据。您应该在正在循环的零件内添加if语句,以检查处理之间的暂停条件。像您这样将开/关控件放在子例程中不是一个好主意,因为它只能在完成所有操作后启用按钮

即停止这个过程

For i to 10 Do If checkbox1.checked = True then Exit Sub 'check for stop condition 'process videos Loop 对于我来说,我要做10件事 如果checkbox1.checked=True,则退出子项“检查停止条件” '处理视频 环 要暂停它,您可以执行一个停止,但要让它记住恢复时从何处开始

还有,为什么你会有一副呆头呆脑的面孔