PDA

View Full Version : سوال: نحوه استفاده از بک گراند ورکر در لود کردن لیست



maxvel
چهارشنبه 14 فروردین 1392, 18:22 عصر
سلام

چطور میشه از بک گراند ورکر در لود لیست استفاده کرد؟؟

میخوام برنامه ام در لود یک لیست سنگین هنگ نکنه

خیلی گشتم اما چیزه قابل توجهی ندیدم

اگه میشه کمک برسونید دوستان

tstsst
چهارشنبه 14 فروردین 1392, 21:20 عصر
سلام
هر ایتم اگه مال یک ترید بشه دیگه ترید دیگه ای نمی تونه از اون استفاده کنه

Dim list As New ListBox
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
For index = 1 To 10
list.Items.Add(index)
Next
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
ListBox1.Items.AddRange(list.Items)
End Sub

و اگه بخوای تک تک وارد کنی (فقط تو تنظیمات بکگراند ت پروگرس رو ترو کن (BackgroundWorker ~> WorkerReportsProgress ~> True))

Dim list As New ListBox
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
For index = 1 To 10
list.Items.Add(index)
BackgroundWorker1.ReportProgress(0)
Next
End Sub

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
ListBox1.Items.Add(list.Items.Item(list.Items.Coun t - 1))
End Sub

maxvel
چهارشنبه 14 فروردین 1392, 22:21 عصر
سلام ممنون از کدتون ولی من منظورم لود از فایل بود، دارم از یک لیست از توی درایو c عمل لود رو انجام میدم و حجم فایل بالا هستش حدود 7mg که این فایل برای لود در C# زمانی نمیبره اما در vb حدود 12min زمان میبره

اصلا مشکلم با چی حل میشه؟

maxvel
پنج شنبه 15 فروردین 1392, 02:52 صبح
کسی نیست جواب بده؟ :گریه: :گریه: :گریه: :گریه:

tstsst
پنج شنبه 15 فروردین 1392, 12:21 عصر
فرقی نمی کنه همون کدی که دادم !


'(BackgroundWorker ~> WorkerReportsProgress ~> True)
Dim stm As StreamReader
Dim ls1 As String
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
stm = New StreamReader("D:\test.txt", FileMode.Append)
BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Do Until (stm.EndOfStream)
ls1 = stm.ReadLine
BackgroundWorker1.ReportProgress(1)
Threading.Thread.Sleep(10)
Loop
End Sub

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
ListBox1.Items.Add(ls1)
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
Me.Text = "End"
End Sub

منظور همینه ؟

maxvel
پنج شنبه 15 فروردین 1392, 22:18 عصر
ممنون کاملا مشکلم حل شد

حالا اگه بخوام 0 تا 100 پروگرس بار رو روش تنظیم کنم باید چیکار کنم؟

tstsst
جمعه 16 فروردین 1392, 12:53 عصر
از پروگرس ریپورت خود بکگراند استفاده کن.
BackgroundWorker1.ReportProgress()
به این صورت:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim n As Integer
BackgroundWorker1.ReportProgress(n)
End Sub

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
ProgressBar1.Value = e.ProgressPercentage
End Sub

یا
Dim n As Integer
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
n += 1
BackgroundWorker1.ReportProgress(1)
End Sub

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
ProgressBar1.Value = n
End Sub

maxvel
شنبه 17 فروردین 1392, 18:10 عصر
پروگرسم به وسط میرسه خطا میده

من دارم یه لیست لود میکنم، پروگرس بار میتونه اینجور عمل کنه که اول کل آیتم هارو بشماره و با توجه به آیتم ورودی و تعداد کل پروگرس رو تنظیم کنه؟؟؟

اگه نمیشه مشکل خطا رو چیکار کنم؟

tstsst
شنبه 17 فروردین 1392, 21:46 عصر
سلام

یک پروگرس دیگه برای اینکار استفاده کن که با یک دیلیی کم (بسته به سایز فایل) طول هم زمان با خوندن خط ها با این کد بگیره و بعد از اون ماکس پروگرس رو به نسبت ولویی که رفته تغییر بده
یا قبل از اینکه خطا رو شروع به خوندن کنی تو یک پروگرس این کدو بنویس و بعد تو ورک کامپلیت بکگران ورکر دوم رو اجرا کن و پروگرس رو درست کن
Dim lc As Integer
Dim sreader As New StreamReader("...")
lc = Text.RegularExpressions.Regex.Split(sreader.ReadTo End(), Environment.NewLine).Length
sreader.Close()
یا راه دیگه ...!

maxvel
یک شنبه 18 فروردین 1392, 02:08 صبح
نفهمیدم چی شد :لبخند:

tstsst
یک شنبه 18 فروردین 1392, 12:10 عصر
در کدی که دادم lc تعداد خط های فایل تو می ده تو یک بکگراند اونو اجرا کن بعد ماکس پروگرس بارتو تعداد خط بزار بعد تو بکگراند اصلی برای هر خطی که می خونی یکی به پروگرس بار ازافه کن !
از کد های که میدم کم تر استفاده کنی کمتر گیج میشی !
Dim stm As IO.StreamReader
Dim ls1 As String
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
stm = New IO.StreamReader("D:\test.txt", IO.FileMode.Append)
BackgroundWorker2.RunWorkerAsync()
End Sub
Private Sub BackgroundWorker2_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker2.DoWork
stm = New IO.StreamReader("D:\test.txt", IO.FileMode.Append)
BackgroundWorker2.ReportProgress(System.Text.Regul arExpressions.Regex.Split(sreader.ReadToEnd(), Environment.NewLine).Length)
stm.Close()
End Sub
Private Sub BackgroundWorker2_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker2.ProgressChanged
ProgressBar1.Maximum = e.ProgressPercentage
End Sub
Private Sub BackgroundWorker2_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker2.RunWorkerCompleted
BackgroundWorker1.RunWorkerAsync()
ProgressBar1.Value = 0
End Sub
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Do Until (stm.EndOfStream)
ls1 = stm.ReadLine
BackgroundWorker1.ReportProgress(1)
Threading.Thread.Sleep(10)
Loop
stm.Close()
End Sub
Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
ProgressBar1.Value += 1
ListBox1.Items.Add(ls1)
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
Me.Text = "End"
End Sub

mdshmdsh
جمعه 21 آذر 1393, 20:19 عصر
پست بسیار عالی ای بود... استفاده کردم