积极答复者
backgroundWork组件,卡了两天了,麻烦版主帮我看看

问题
-
Public Class FrmBackgroundWorker
#Region " Shared data "Private mMin As Integer
Private mMax As Integer
Private mResults As New List(Of Integer)#End Region
#Region " Primary thread methods "
Private Sub btnStart_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles BtnStart.ClickProgressBar1.Value = 0
ListBox1.Items.Clear()
mMin = 1
mMax = 10000
BackgroundWorker1.RunWorkerAsync()End Sub
Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCancel.ClickBackgroundWorker1.CancelAsync()
End Sub
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChangedProgressBar1.Value = e.ProgressPercentage
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted( ByVal sender As Object, ByVal e As _
System.ComponentModel.RunWorkerCompletedEventArgs) _
Handles BackgroundWorker1.RunWorkerCompletedFor Each item As String In mResults
ListBox1.Items.Add(item)
NextEnd Sub
#End Region
#Region " Background thread methods "
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, _
ByVal e As System.ComponentModel.DoWorkEventArgs) _
Handles BackgroundWorker1.DoWorkmResults.Clear()
'For count As Integer = mMin To mMax Step 2
' Dim isPrime As Boolean = True' For x As Integer = 1 To CInt(count / 2)
' For y As Integer = 1 To x
' If x * y = count Then
' ' the number is not prime
' isPrime = False
' Exit For
' End If
' Next
' ' short-circuit the check
' If Not isPrime Then Exit For
' Next' If isPrime Then
' mResults.Add(count)
' End If' Me.BackgroundWorker1.ReportProgress( _
' CInt((count - mMin) / (mMax - mMin) * 100))' If Me.BackgroundWorker1.CancellationPending Then
' Exit Sub
' End If'Next
For i As Long = 1 To 100000
mResults.Add(i)BackgroundWorker1.ReportProgress(CInt((i / 100000) * 100)) '异常有可能是这句话
If BackgroundWorker1.CancellationPending Then
Exit For
End IfNext
End Sub
#End Region
End Class我不知道异常出在哪里,但是在程序运行的时候发生界面锁死,恢复被注释的代码又不会锁死,麻烦高手帮我看看
- 已编辑 Jarry_liu 2011年1月24日 14:46
答案
-
引用: 3.既要同时响应事件又要控件不变化,怎么办? 例如在一个长的循环中向listview控件中添加记录,无doevents时程序无响应,但有它时控件又闪的厉害 解决办法:a.不一定每次循环都doevents,可以在适当时间时才用,至少没那么闪 b.应用api函数 ValidateRect 功能是使指定的矩型区域生效,通知Windows不对指定的区域进行重画另:InvalidateRect 功能相反,同时需要用到函数 GetClientRect 取得指定对象的矩形区域应用*rect函数指定listview的矩形区不重画,即可避免闪烁(但还是要注意恢复重画,否则看不见了真实效果)
grass...- 已标记为答案 Jarry_liu 2011年2月15日 1:17
全部回复
-
你好
或者你可以嘗試使用
THREADING 應該可以解決這個問題
以解決這個問題
可以參考以下URL
http://blog.sharechiwai.com/2010/09/vb-net-threading-vb-net-%E7%B7%9A%E7%A8%8B/
E.G.
Private MyThreading As New System.Threading.Thread(AddressOf Me.LongProcess)
Private Sub btnStart_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnStart.Click
CancelStatus = False
ProgressBar1.Value = 0
ListBox1.Items.Clear()
mMin = 1
mMax = 10000
'BackgroundWorker1.RunWorkerAsync()
Control.CheckForIllegalCrossThreadCalls = False
'用.Start來 啟動這個線程Thread
MyThreading.Start()
End Sub
Public Sub LongProcess()
For i As Long = 1 To 100000
mResults.Add(i)
ProgressBar1.Value = (CInt((i / 100000) * 100)) '异常有可能是这句话
Next
ListBox1.DataSource = mResults
End Sub
Private Sub btnCancel_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
MyThreading.Abort() ' cancel threading
End Sub
Please correct me if my concept is wrong
Chi -
你好
或者你可以 改變一下以下的CODE
Private Sub BackgroundWorker1_RunWorkerCompleted( ByVal sender As Object, ByVal e As _
System.ComponentModel.RunWorkerCompletedEventArgs) _
Handles BackgroundWorker1.RunWorkerCompleted' For Each item As String In mResults
' ListBox1.Items.Add(item)
' Next'把他變成
ListBox1.DataSource = mResults
End Sub
可能會好一點
和1
ProgressBar1.Value = (CInt((i / 100000) * 100)) '异常有可能是这句话
可不可以貼上這個ERROR MESSAGE
給我們參考一下
Chi -
慢是循环加list引起的 改成AddRange
'Private mResults As New List(Of Integer) Private mResults As New List(Of String) 'For Each item As String In mResults ' ListBox1.Items.Add(item) 'Next ListBox1.Items.AddRange(mResults.ToArray()) 'mResults.Add(i) mResults.Add(i.ToString())
-
这是我的代码,界面没锁死,而且很快就出来了数据
Public Class Form1 #Region " Shared data " Private mMin As Integer Private mMax As Integer Private mResults As New List(Of String) #End Region #Region " Primary thread methods " Private Sub btnStart_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnStart.Click ProgressBar1.Value = 0 ListBox1.Items.Clear() mMin = 1 mMax = 10000 BackgroundWorker1.RunWorkerAsync() End Sub Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCancel.Click BackgroundWorker1.CancelAsync() End Sub Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged ProgressBar1.Value = e.ProgressPercentage End Sub Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As _ System.ComponentModel.RunWorkerCompletedEventArgs) _ Handles BackgroundWorker1.RunWorkerCompleted 'For Each item As String In mResults ' ListBox1.Items.Add(item) 'Next ListBox1.Items.AddRange(mResults.ToArray()) End Sub #End Region #Region " Background thread methods " Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, _ ByVal e As System.ComponentModel.DoWorkEventArgs) _ Handles BackgroundWorker1.DoWork mResults.Clear() 'For count As Integer = mMin To mMax Step 2 ' Dim isPrime As Boolean = True ' For x As Integer = 1 To CInt(count / 2) ' For y As Integer = 1 To x ' If x * y = count Then ' ' the number is not prime ' isPrime = False ' Exit For ' End If ' Next ' ' short-circuit the check ' If Not isPrime Then Exit For ' Next ' If isPrime Then ' mResults.Add(count) ' End If ' Me.BackgroundWorker1.ReportProgress( _ ' CInt((count - mMin) / (mMax - mMin) * 100)) ' If Me.BackgroundWorker1.CancellationPending Then ' Exit Sub ' End If 'Next For i As Long = 1 To 100000 mResults.Add(i.ToString()) BackgroundWorker1.ReportProgress(CInt((i / 100000) * 100)) '异常有可能是这句话 If BackgroundWorker1.CancellationPending Then Exit For End If Next End Sub #End Region End Class
http://feiyun0112.cnblogs.com/ -
那就没办法,我是一样的环境
试试不要循环,直接ListBox1.Items.AddRange(mResults.ToArray())
看还锁不锁
http://feiyun0112.cnblogs.com/ -
引用: 3.既要同时响应事件又要控件不变化,怎么办? 例如在一个长的循环中向listview控件中添加记录,无doevents时程序无响应,但有它时控件又闪的厉害 解决办法:a.不一定每次循环都doevents,可以在适当时间时才用,至少没那么闪 b.应用api函数 ValidateRect 功能是使指定的矩型区域生效,通知Windows不对指定的区域进行重画另:InvalidateRect 功能相反,同时需要用到函数 GetClientRect 取得指定对象的矩形区域应用*rect函数指定listview的矩形区不重画,即可避免闪烁(但还是要注意恢复重画,否则看不见了真实效果)
grass...- 已标记为答案 Jarry_liu 2011年2月15日 1:17