PDA

View Full Version : back ground worker



peymannaji
یک شنبه 18 اسفند 1387, 22:33 عصر
با سلام .
من یک فرم دارم که در اون یک دکمه وجود داره + progress bar و یک backgroundworker هم اضافه کردم به صفحه . کد های درون فرم به شکل زیر :



Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
BackgroundWorker1.RunWorkerAsync()
End Sub

Sub Doit()
Dim a As Integer = 0
Dim prog As Double = 100 / 5
Dim current As Integer = 0
For i As Integer = 0 To 5
System.Threading.Thread.Sleep(1000)
a += 1
BackgroundWorker1.ReportProgress(current)
current += prog
Next
End Sub

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Doit()
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
MsgBox("completed")
End Sub
End Class
خوب این کدها مشکلی نداره با کلیک بروی دکمه progress bar شروع میکنه به پر شدن تا زمانی که تابع کارشو کامل انجام بده . اما مشکل از اونجایی شروع میشه که من یک کلاس ایجاد میکنم و تو اون تابع DoIT رو paste میکنم . و کمی تغییر . کد زیر :



Public Class Progress

Shared Sub Doit()
Dim a As Integer = 0
Dim prog As Double = 100 / 5
Dim current As Integer = 0
For i As Integer = 0 To 5
System.Threading.Thread.Sleep(1000)
a += 1
Form1.BackgroundWorker1.ReportProgress(current)
current += prog
Next
End Sub
End Class
همه کارها خوب انجام میشه اما تنها مشکلی که هست progressbar مقدار میگیره اما پر نیمشه ...

دوستان عزیز راهنمایی بفرمائید لطفا . با تشکر...

peymannaji
دوشنبه 19 اسفند 1387, 14:18 عصر
دوستان عزیز کسی اطلاعی نداره ؟

arsalansalar
سه شنبه 20 اسفند 1387, 11:21 صبح
http://www.barnamenevis.org/forum/showthread.php?t=69690

peymannaji
پنج شنبه 22 اسفند 1387, 15:02 عصر
با سلام دوست عزیز .
والا مشکل من یک چیز دیگه هست . متاسفانه حل نشد ... دوستان راهنمایی بفرمایند ...

با تشکر

peymannaji
چهارشنبه 28 اسفند 1387, 00:50 صبح
دوستان عزیز هیچکس این مورد رو نمیتونه راهنمایی کنه ؟

Dariuosh
پنج شنبه 29 اسفند 1387, 11:03 صبح
اين به خاطر اينه که Progressbarات تو يه Thread ديگه داره تغيير ميکنه نه تو Main Theard

Microsoft.net
پنج شنبه 29 اسفند 1387, 11:54 صبح
مشکلت دقیقا


Form1.BackgroundWorker1.ReportProgress(current)


هست ! اگه در این حالت رویداد ProgressChanged رو Trace کنی می بینی که احتمالا فایر نمی شه ، برای حله مشکت Doit رو از حالت share باید در بیاری و BackGroundworker ات رو به عنوان یک پارامتر بهش پاس بدی که بتونی ProgressChanged اش رو فایر کنی . مثالش دقیقا تو MSDN هست

Dariuosh
پنج شنبه 29 اسفند 1387, 16:51 عصر
اون قسمت دوم رو اينجوريش کن


Public Class Progress
Private Delegate Sub DoItDelegate()
Shared Sub Doit()
If Form1.ProgressBar1.InvokeRequired = True Then
Dim del As New DoItDelegate(AddressOf Doit)
Form1.ProgressBar1.Invoke(del)
Else

Dim a As Integer = 0
Dim prog As Double = 100 / 5
Dim current As Integer = 0
For i As Integer = 0 To 5
System.Threading.Thread.Sleep(1000)
a += 1
Form1.BackgroundWorker1.ReportProgress(current)
current += prog
Next
End If
End Sub

peymannaji
یک شنبه 02 فروردین 1388, 16:34 عصر
داریوش عزیز ممنون از راهنماییتون مشکل حل شد ...

peymannaji
یک شنبه 02 فروردین 1388, 16:35 عصر
مشکلت دقیقا


Form1.BackgroundWorker1.ReportProgress(current)

هست ! اگه در این حالت رویداد ProgressChanged رو Trace کنی می بینی که احتمالا فایر نمی شه ، برای حله مشکت Doit رو از حالت share باید در بیاری و BackGroundworker ات رو به عنوان یک پارامتر بهش پاس بدی که بتونی ProgressChanged اش رو فایر کنی . مثالش دقیقا تو MSDN هست



لینک دقیق مثال رو میتونید به بنده بدید .
با تشکر

peymannaji
دوشنبه 17 فروردین 1388, 01:50 صبح
حل شد !
Microsoft.net عزیز اون رویداد اتفاقا فایر میشه ... حتی مقادیر هم پاس میشه اما ظاهر عوض نمیشد اما با موردی که شما گفتید کار عملی شد ممنون .- کد رو اینجا میزارم که همه استفاده کنن ... فرم اول مربوط به اینه که چگونه وسط کار ترد به یک کنترل دست پیدا کنیم . فرم دوم هم جواب سوال این تاپیک ...


موفق باشید.