PDA

View Full Version : سوال: نمایش ProgressBar در حین انجام محاسبات



touraj
سه شنبه 21 خرداد 1387, 18:13 عصر
یه سوال ساده دارم:
مین یه فرم دارم که در زمان لود محاسبات زیادی انجام میده. حالا میخوام وقتی Button1 رو برای لود فرم زدیم، یه ProgressBar نمایش داده بشه که کاربر فکر نکنه سیستمش هنگ کرده.
باید چیکار کنم؟

samispeed
سه شنبه 21 خرداد 1387, 19:06 عصر
برای استفاده از progressbar کافیه آن را مقدار دهی کنیم اگر حلقه for داریم ProgressBar1.Value = i که i به اندازه حلقه for می باشد و یا می توانیم از timer استفاده کنیم

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If ProgressBar1.Value <= ProgressBar1.Maximum - 1 Then
ProgressBar1.Value += 1
Else
Timer1.Enabled = False
End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Timer1.Enabled = True
End Sub

touraj
سه شنبه 21 خرداد 1387, 19:48 عصر
نه عزیز. شاید منظورم رو بد بیان کردم. اما مشکل این نیست. ببین، وقتی Button1 رو کلیک می کنیم، اول دستور Visible کردن ProgressBar رو میده، بعد فرم لود میشه. اما لود شدن فرم طول می کشه. وقتی هم که فرم لود شد، توی رویداد Form_Load میگم که ProgressBar رو Invisble کنه.
اما مشکل اینه که تا وقتی فرم لود نشه، ProgressBar ظاهر نمیشه. وقتی هم که فرم لود شد، دستور پنهان شدنش رو میده. انگار نه انگار که وجود داشته.
در واقع میخوام کاری کنم که ProgressBar یه جورایی کار Please Wait رو انجام بده.

saghi63
سه شنبه 21 خرداد 1387, 20:03 عصر
یادت باشه هرچیزی که تو Form_Load بنویسی زمانی نشون داده می شه که تمام فرم Load بشه بعد .... اما اگه تو Form_Shown بنویسی نشون داده می شه و به لود کاری نداره ... از اسمش مشخص دیگه ... پس بهتره همه کد هایی که رفتی تو لود نوشتی و ببری تو shown بنویسی .. اینطوری کاربر یه چیزی می بینه ....:لبخند:

ali_kolahdoozan
سه شنبه 21 خرداد 1387, 20:07 عصر
backgroundworker

touraj
سه شنبه 21 خرداد 1387, 20:26 عصر
یادت باشه هرچیزی که تو Form_Load بنویسی زمانی نشون داده می شه که تمام فرم Load بشه بعد .... اما اگه تو Form_Shown بنویسی نشون داده می شه و به لود کاری نداره ... از اسمش مشخص دیگه ... پس بهتره همه کد هایی که رفتی تو لود نوشتی و ببری تو shown بنویسی .. اینطوری کاربر یه چیزی می بینه ....:لبخند:

نه، این ربطی نداره. ببین تو Button1_Click نوشته:

ProgressBar1.Visble=True
Form2.show()

اما توی Form2_Load نوشته:

ProgressBar.Visible=False


backgroundworker

این رو خودم حدس زدم. اما نفهمیدم چه جوری باید ازش استفاده کنم. اینجا چیزی پیدا نکردم. تو MSDN هم search کردم. چیزی نفهمیدم.

Dariuosh
سه شنبه 21 خرداد 1387, 22:36 عصر
بعد از هر مقدار دهي به ProgressBar


Application.DoEvents()

Dariuosh
سه شنبه 21 خرداد 1387, 22:41 عصر
backgroundworker

این رو خودم حدس زدم. اما نفهمیدم چه جوری باید ازش استفاده کنم. اینجا چیزی پیدا نکردم. تو MSDN هم search کردم. چیزی نفهمیدم.

اونجايي که ميخواي فعال شه


Me.BackgroundWorker1.RunWorkerAsync()

تو اين رويداد هم


PrivateSub BackgroundWorker1_RunWorkerCompleted(ByVal sender AsObject, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
oon kari ke mikhay anjam she
EndSub

touraj
سه شنبه 21 خرداد 1387, 22:51 عصر
اونجايي که ميخواي فعال شه


Me.BackgroundWorker1.RunWorkerAsync()

تو اين رويداد هم


PrivateSub BackgroundWorker1_RunWorkerCompleted(ByVal sender AsObject, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
oon kari ke mikhay anjam she
EndSub


من چند ساعت پیش (دقیقاً قبل از بازی اسپانیا و روسیه) همین کار رو کردم. اما error داد.
باز هم امتحان می کنم. غیر فعال کردنش هم با CancelAsync هستش دیگه؟

touraj
سه شنبه 21 خرداد 1387, 23:01 عصر
کار نکرد. یه سوال: BackgroundWorker چقدر زمان لازم داره تا فعال بشه؟ مثلاً 2 ثانیه یا بیشتر؟

touraj
سه شنبه 21 خرداد 1387, 23:03 عصر
راستی، این رو بگم که ProgressBar در حالت Marque تنظیم شده. یعنی زیاد نمیشه. فقط حرکت میکنه. مثل Please Wait

ali_kolahdoozan
چهارشنبه 22 خرداد 1387, 00:15 صبح
بازم ميگم background worker . بهترين راه توي همين سايت پيدا ميكني يكم بگرد

touraj
چهارشنبه 22 خرداد 1387, 00:46 صبح
بازم ميگم background worker . بهترين راه توي همين سايت پيدا ميكني يكم بگرد

ببین، الان کار میکنه. error هم نمیده. اما دیر لود میشه. فرض کن اگه فرم من تا لودش 4 ثانیه طول بکشه، یه لحظه میاد و میره.

Dariuosh
چهارشنبه 22 خرداد 1387, 14:29 عصر
PublicClass Form1
Inherits System.Windows.Forms.Form
#Region" Windows Form Designer generated code "
PublicSubNew()
MyBase.New()
InitializeComponent()

EndSub
ProtectedOverloadsOverridesSub Dispose(ByVal disposing AsBoolean)
If disposing Then
IfNot (components IsNothing) Then
components.Dispose()
EndIf
EndIf
MyBase.Dispose(disposing)
EndSub
Private components As System.ComponentModel.IContainer
FriendWithEvents ProgressBar1 As System.Windows.Forms.ProgressBar
FriendWithEvents GBStatus As System.Windows.Forms.GroupBox
FriendWithEvents ListBox1 As System.Windows.Forms.ListBox
FriendWithEvents BackgroundWorker1 As System.ComponentModel.BackgroundWorker
<System.Diagnostics.DebuggerStepThrough()> _
PrivateSub InitializeComponent()

Me.ProgressBar1 = New System.Windows.Forms.ProgressBar
Me.GBStatus = New System.Windows.Forms.GroupBox
Me.ListBox1 = New System.Windows.Forms.ListBox
Me.BackgroundWorker1 = New System.ComponentModel.BackgroundWorker
Me.GBStatus.SuspendLayout()
Me.SuspendLayout()
'
'ProgressBar1
'
Me.ProgressBar1.Location = New System.Drawing.Point(6, 33)
Me.ProgressBar1.Name = "ProgressBar1"
Me.ProgressBar1.Size = New System.Drawing.Size(198, 23)
Me.ProgressBar1.Style = System.Windows.Forms.ProgressBarStyle.Marquee
Me.ProgressBar1.TabIndex = 8
'
'GBStatus
'
Me.GBStatus.Controls.Add(Me.ProgressBar1)
Me.GBStatus.Location = New System.Drawing.Point(12, 118)
Me.GBStatus.Name = "GBStatus"
Me.GBStatus.RightToLeft = System.Windows.Forms.RightToLeft.Yes
Me.GBStatus.Size = New System.Drawing.Size(210, 62)
Me.GBStatus.TabIndex = 9
Me.GBStatus.TabStop = False
Me.GBStatus.Text = "يه چن لحضه صب کن"
'
'ListBox1
'
Me.ListBox1.FormattingEnabled = True
Me.ListBox1.Location = New System.Drawing.Point(12, 13)
Me.ListBox1.Name = "ListBox1"
Me.ListBox1.Size = New System.Drawing.Size(210, 355)
Me.ListBox1.TabIndex = 10
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(234, 377)
Me.Controls.Add(Me.GBStatus)
Me.Controls.Add(Me.ListBox1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.GBStatus.ResumeLayout(False)
Me.ResumeLayout(False)
EndSub

#EndRegion
PrivateSub Form1_Load(ByVal sender AsObject, ByVal e As System.EventArgs) HandlesMe.Load
Me.GBStatus.Visible = True
Me.BackgroundWorker1.RunWorkerAsync()
EndSub
PrivateSub AddItm()
For i AsInteger = 0 To 222222
Application.DoEvents()
Me.ListBox1.Items.Add("Itm : " & i)
Next
Me.GBStatus.Dispose()
EndSub
PrivateSub BackgroundWorker1_RunWorkerCompleted(ByVal sender AsObject, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
AddItm()
EndSub
EndClass

kablayi
چهارشنبه 22 خرداد 1387, 14:42 عصر
سلام ...
به برنامه زیر نگاهی بنداز شاید بدردتون بخوره ...
موفق باشید ... :چشمک: