PDA

View Full Version : سوال: Progress bar Remaining Time



reza6384
چهارشنبه 18 اردیبهشت 1387, 00:13 صبح
سلام. راجع به progress bar سوال داشتم.

فرض کنید توی حلقه زیر 1000 تا درج در پایگاه داده اجرا می کنیم :



For i as integer = 0 to 999
CMD = "Insert Into Table1(Field1) values('" & i & "'"
Next


حالا من می خوام اولا Remaining Time رو محاسبه کنم و توی یه Label نمایش بدم، دوما اینکه یه مشکلی که دارم اینه که وقتی مقدار textbox یا Label ام رو عوض می کنم این تغییر ایجاد نمی شه مگر تا پایان حلقه و بعد اعمال می شه، برای حل این مشکل یه کاری کردم که نمی دونم درسته یا نه ، یه تاخیر چند میلی ثانیه ای ایجاد کردم و بعد از اون از Me.Refresh استفاده کردم. و سوال دیگه هم اینکه آیا می شه درصد تکمیل عملیات رو توی خود Progress bar نشون داد؟

ببخشید که سوال هام رو یک جا پرسیدم، چون همش مربوط به یک موضوعه .

خلاصه :
1- محاسبه Remaining Time
2- مشکل عدم نمایش تغییر اعمال شده در کنترل ها
3- نمایش درصد تکمیل عملیات داخل خود Progress Bar

با تشکر

Sub Zero
چهارشنبه 18 اردیبهشت 1387, 10:45 صبح
محاسبه Remaining Time
این مقدار کاملا به سرعت رایانه شما بستگی داره (سرعت خواندن ونوشتن بر روی دیسک) وتا انوجایی که من میدونم باید حجم 1000 رکوردی رو که میخواید درج کنید محاسه نموده و بر عددی که نشان دهنده سرعت خواندن ونوشتن بر روی دیسک است تقسیم کنید . البته این روش هم همه جا و درهر زمان جوابگو نیست ممکنه در زمان درج ، Cpu مشغول انجام پروسس دیگه ای باشه که این خودش زمان درج رو بالا می بره . در کل می شه گفت پارامترهای زیادی برای محاسبه این زمان باید چک بشه . پس بهتره بی خیال این یکی بشی
شاید هم Sql قابلیت محاسبه این زمان رو داشته باشه که در این مورد هیچ اطلاعاتی ندارم .



مشکل عدم نمایش تغییر اعمال شده در کنترل ها
این مشکل با استفاده از Thread حل می شه . برای این کار یه رویه درج ایجاد کرده و آدرس اونو به thread بدین.:

Control.CheckForIllegalCrossThreadCalls = False
Dim th As New Threading.Thread(AddressOf InsertRecord)
th.Start()
بعد در رویه درج از این کد ها استفاده کنید.:

prs.Maximum = 1000
prs.Value = 0
prs.Step = 1
For i As Integer = 0 To 999
CMD = "Insert Into Table1(Field1) values('" & i & "')"
lable1.text = i
Threading.Thread.Sleep(200)
prs.PerformStep()
Next
با این کدها به سوال سوم شما هم جواب دادم .
برای تنظیم سرعت پر شدن ProgressBar به دلخواه مقدار Sleep رو کم وزیاد کنید.

پیشنهاد : برای درج رکورد با تعداد بالا از این روش استفاده نکنید این روش Performance برنامه رو پایین میاره چون باید به ازا هر رکورد تغییرات رو در خروجی نمایش بده (عمل I/O).

amirsajjadi
چهارشنبه 18 اردیبهشت 1387, 11:47 صبح
با سلام
http://barnamenevis.org/forum/showpost.php?p=410653&postcount=73

reza6384
جمعه 20 اردیبهشت 1387, 00:51 صبح
خیلی ممنون جناب SubZero.
حرف شما درسته ، اما من حس می کنم اگر ابتدا و انتهای حلقه زمان رو حساب کنیم و بعد از هم کم کنیم و یه Integer بر حسب میلی ثانیه حساب کنیم که این میشه زمان اجرای یک حلقه ، بعد ببینیم چند تا حلقه مونده و تعداد باقیمونده رو ضرب در اون کنیم و نتیجه رو بر حسب ثانیه یا دقیقه نشون بدیم ، تقریبا اینجوری :



Dim H, M, S, MS, Diff As Integer
If (ST.Hour = ED.Hour And ST.Minute = ED.Minute And ST.Second = ED.Second) _
Then
Exit Sub ' 1 Second is enugh for update calculating
End If
H = ED.Hour - ST.Hour
M = ED.Minute - ST.Minute
S = ED.Second - ST.Second
MS = ED.Millisecond - ST.Millisecond
Diff = ((3600 * H + 60 * M + S) * 1000 + MS) * RemainingOperations
Diff = Diff / 1000
Me.Label1.Text = Diff & " Seconds Remaining"
Me.Refresh()


این هم حلقه For :



Dim _Start, _End As Date
Me.ProgressBar1.Maximum = 100
For i As Integer = 0 To 99
_Start = Now
' Do Some Operation
_End = Now
Me.TimeDifference(_Start, _End, 99 - i)
Me.ProgressBar1.Value += 1
Next


من تست کردم تقریبا خوب کار کرد، به اضافه اینکه اگر CPU مشغولیت دیگه ای هم داشته باشه محاسبه می شه.

amirsajjadi
جمعه 20 اردیبهشت 1387, 18:00 عصر
با سلام
شما میتونید زمان اجرای یک نمونه (مثلا ثبت 10 رکورد اول) رو اجرا کرده سپس با استفاده از اون برنامه ای که بالا لینکشو دادم زمانش رو محاسبه کنید بعد شما براحتی میتونید زمان اجرای هزاران رکورد رو تخمین بزنید

reza6384
جمعه 20 اردیبهشت 1387, 22:56 عصر
سلام.
بله من لینک شما رو دیدم، خیلی ممنون، ولی مشکل این بود که اول پست زدم بعد لینک شما رو نگاه کردم. :چشمک::چشمک:

Dariuosh
شنبه 21 اردیبهشت 1387, 00:21 صبح
2- مشکل عدم نمایش تغییر اعمال شده در کنترل ها



Application.DoEvents()

اينو بعد از کدي بزار که توش داري مقدار رو عوض ميکني