日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VB.net WinForm如何写一个分线程进度条

發布時間:2023/12/14 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VB.net WinForm如何写一个分线程进度条 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先, 我們先來看一個長耗時過程

Private Sub ValueTest() For i As Integer = 0 To 100ProgressBar1.Value = i Threading.Thread.Sleep(1000)Next End Sub

我們會發現,在100時間內,窗體無法被移動,進度條也不會移動(win10的UI可以移動,但任然看起來很卡),等循環完畢后進度條突然就滿了。
懂UI窗體運行原理的都知道,程序的主線程不僅僅要處理我們寫的代碼,還要刷新UI的界面。當在處理長耗時過程時,UI界面也會被“鎖死”,直到過程被執行完畢。
有些懂線程委托的小朋友就要說了,用分線程委托嘛,例如這樣:

Private Sub ValueTest_Thread()For i As Integer = 0 To 100ChangePBValue(i, ProgressBar1)Threading.Thread.Sleep(1000)NextEnd SubPrivate Sub ChangePBValue(_Value As Integer, ByRef _PB As ProgressBar)If _PB.InvokeRequired = True Then_PB.BeginInvoke(New D_ChangePBValue(AddressOf ChangePBValue), _Value, _PB)Else_PB.Value = _ValueEnd IfEnd SubPrivate Delegate Sub D_ChangePBValue(_Value As Integer, ByRef _PB As ProgressBar)Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.ClickDim NT As New Threading.Thread(AddressOf ValueTest_Thread)NT.Start()End Sub

萌新們表示看起來很困難,我這里不過多解釋怎么創建分線程了,自己百度一下跨線程更新控件方法與原理。
我給大家說一下分線程窗體的調用方法

Private Sub ValueTest_ThreadForm()ThreadPBManger.Start("我想表達點什么呢???")For i As Integer = 0 To 100ThreadPBManger.SetValue(i)Threading.Thread.Sleep(100)NextThreadPBManger.Stop() End Sub

好像很簡單啊,這樣就可以在主線程完全卡死的情況下也能在進度條中顯示進度了,還能報告在做什么內容,好神奇,但是ThreadPBManger是什么鬼?

Public Module ThreadPBMangerDim NF_PB As F_PBPublic Sub Start(ShowStr As String)Dim NT As New Threading.Thread(AddressOf Start_thread)NT.Start(ShowStr)End SubPrivate Sub Start_thread(ShowStr As String)NF_PB = New F_PBNF_PB.Text = ShowStrApplication.Run(NF_PB)End SubPublic Sub SetValue(Value As Integer)If IsNothing(NF_PB) Then ReturnIf NF_PB.IsDisposed Then ReturnChangePBValue(Value, NF_PB.ProgressBar1)End SubPrivate Delegate Sub D_Stop()Public Sub [Stop]()If IsNothing(NF_PB) Then ReturnIf NF_PB.IsDisposed Then ReturnIf NF_PB.InvokeRequired ThenNF_PB.Invoke(New D_Stop(AddressOf [Stop]))ElseNF_PB.Dispose()End IfEnd Sub#Region "委托更新PB"Public Sub ChangePBValue(_Value As Integer, ByRef _PB As ProgressBar)If _PB.InvokeRequired = True Then_PB.BeginInvoke(New D_ChangePBValue(AddressOf ChangePBValue), _Value, _PB)Else_PB.Value = _ValueEnd IfEnd SubPrivate Delegate Sub D_ChangePBValue(_Value As Integer, ByRef _PB As ProgressBar) #End Region End Module

源碼位置 https://download.csdn.net/download/meiren777/10762052

知識點
Delegate,線程委托,BeginInvoke,InvokeRequired

重點解釋

Application.Run:在當前線程上開始運行標準應用程序消息循環,并使指定窗體可見。以該模式打開窗體后,該線程窗體將持續響應消息循環,該線程只會隨著窗體的關閉而關閉。一個線程只有存在一個消息循環。當前執行位置將會停止在此,當制定窗體關閉后,繼續執行后面的代碼。
PS

實際使用過程中,需要小伙伴們美化窗體,并添加vb.net教程更多的Try Catch來處理具體的異常。
有趣的是Devexpress提供了SplashScreenManager提供了完整的線程進度窗體解決方案,我們叫它飛濺窗體。基礎版使用相對簡單,但要使用自定義窗體其難度非常高,后面我開文章教大家如何使用Devexpress的控件(想想腦殼疼,好大的項目啊!)

總結

以上是生活随笔為你收集整理的VB.net WinForm如何写一个分线程进度条的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。