Vb.net 表格don';t等待线程完成并挂起我的应用程序
这是我的应用程序,你可以看到3个按钮,启动按钮启用,暂停禁用和停止禁用 问题是我的表单中有一个单独的线程来进行“处理”(并在黑色richtextbox中打印信息),我的意图是可以暂停或停止它,但当我启动线程时,暂停按钮和停止按钮在一秒钟内变为禁用 我可以使用\u WaitHandle\u FirstThreadDone.WaitOne()命令表单在启动线程后等待,然后我可以看到已启用的暂停和停止按钮,但问题是我的应用程序会挂起,直到“进程”完成。。所以我不能按任何按钮 求你了,我需要帮助来做这个 我的表格的重要部分:Vb.net 表格don';t等待线程完成并挂起我的应用程序,vb.net,multithreading,backgroundworker,background-process,Vb.net,Multithreading,Backgroundworker,Background Process,这是我的应用程序,你可以看到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,则退出子项“检查停止条件”
'处理视频
环
要暂停它,您可以执行一个停止,但要让它记住恢复时从何处开始
还有,为什么你会有一副呆头呆脑的面孔