PDA

View Full Version : سوال: مطلع کردن کاربر از زمانبر بودن عملیات



ehsan21
یک شنبه 01 آذر 1388, 08:44 صبح
من می خوام تو برنامه در قسمت های زمانبر ، کاربر رو متوجه کنم مثلا ساعت شنی یا "لطفاً چند لحضه صبر کنید" یا یه چنین چیزی بزارم که زیبا هم باشه . لطفاً اگه می تونید کمک کنه ؟
ممنون

DoDoklak
یک شنبه 01 آذر 1388, 10:46 صبح
به نظر من بهتر از تصاویر متحرک برای انتظار استفاده کنید.
مزیت این تصاویر متحرک نسبت به خود Process Bar اینه که برنامه نویسی نمیخواد و لازم نیست مدت زمان نامعلومی رو مدام محاسبه کنید.چون بعضی پروسسها زمانش مشخص نیست و شما نمی دونید چند تا حرکت جلو برید ولی با این تصاویر متحرک گردشی هیچ مشکلی ندارید

چند تا نمونه

http://i.imagehost.org/0210/progress.gif


http://i.imagehost.org/0311/progress_icon_large.gif

http://i.imagehost.org/0232/wait.gif



http://i.imagehost.org/0639/wait2.gif

http://i.imagehost.org/0246/Prosses.gif

ehsan21
دوشنبه 02 آذر 1388, 08:47 صبح
منون از راهنماییتون
چه طور از اینها استفاده کنم ؟

ehsan21
دوشنبه 02 آذر 1388, 08:53 صبح
____________________________________

DoDoklak
دوشنبه 02 آذر 1388, 09:07 صبح
کامپوننت جالبی بود
اینها فقط تصاویر هستند نه کامپوننت



اما به style برنامه من نمی خوره . فکر کنم از همون روش دوستان باید استفاده کنم


اینها فقط چند تا نمونه بودن شما میتونید نمونه های بیشتری پیدا کنید که با شکل و ظاهر برنامه تون هماهنگ باشه



فکر کنم از همون روش دوستان باید استفاده کنم
البته نمی خواستم از این روش استفاده کنم ظاهراً به جز این راهی نیست


کدوم روش اینجا به غیر از تصاویر متحرک روش دیگه ای ذکر نشده
مگر کار شما چیه که توش موندید؟

ehsan21
دوشنبه 02 آذر 1388, 09:19 صبح
ببخشید تاپیک قبلی اشتباهی ارسال شده بود
چه طور از این تصاویر استفاده کنم؟

DoDoklak
دوشنبه 02 آذر 1388, 09:34 صبح
روی تصویر موجود کلیک راست کنید کنید و گزینه Save Picture As رو بزنید و اون تصویر رو برای خودتون با فرمت Gif ذخیره کنید.

بعد تو برنامه تون اون جایی که کاربر باید منتظر بشه یک PicturBox میذارید و تصویر متحرک رو به اون اعمال میکنید و خاصیت Visible اونو برابر false قرار بدید و وقتی عملیات شروع شد کافی Visible اونو برابر True قرار بدید تا کاربر اونو ببینه و وقتی عملیات تموم شد دوباره Visible اونو False میکنید.
به همین سادگی

یه نمونه

وقتی کاربر عملیات رو شروع میکنه فقط تصویر مخفی شده ظاهر میشه

http://i.imagehost.org/0527/Wait.jpg

ehsan21
دوشنبه 02 آذر 1388, 11:50 صبح
متاسفانه با این روش نمیشه
من در ابتدای رویداد کلیل کامند اونو true می کنم و هنگامی که محاسبات تموم میشه اونو false اما نمیشه .

DoDoklak
دوشنبه 02 آذر 1388, 12:35 عصر
متاسفانه با این روش نمیشه
من در ابتدای رویداد کلیل کامند اونو true می کنم و هنگامی که محاسبات تموم میشه اونو false اما نمیشه .


چرا میشه به احتمال زیاد چون فرایند پروسس شما خیلی سنگین بوده تصویر نتوسته خودشو نمایش بده
شما تو اجرای دستوراتتون از کد زیر استفاده کنید
Application.DoEvent

Reza Safa
دوشنبه 02 آذر 1388, 14:01 عصر
به کمک دستورات فوق می توانید زمان اجرای دستورات را بدست آورید .


Dim a As New Diagnostics.Stopwatch
a.Start()
Me.Text = Strings.StrDup(1000, "a")
a.Stop()
MsgBox(a.ElapsedMilliseconds)
a.Start()
Dim s As String
For i As Integer = 1 To 1000
s += "a"
Next
Me.Text = s
a.Stop()
MsgBox(a.ElapsedMilliseconds)

ehsan21
دوشنبه 02 آذر 1388, 14:34 عصر
آره فرایند پروسس من خیلی سنگینه
از Application.DoEvent چه طور استفاده کنم ؟

afrooz_rahmati63@yahoo.com
دوشنبه 02 آذر 1388, 14:54 عصر
تمام خطوط یک پروسه با هم اجرا می شوند و سپس صفحه refresh می شود یعنی اینکه اگر شما در ابتدای event تصوير را visible کردید و در انتها invisible بنابراین شما فقط invisible را می بینید که می توانید با post back کردن در کد انفصال ايجاى كني.

DoDoklak
دوشنبه 02 آذر 1388, 15:45 عصر
فرض کنید پروسه شما تو یک حلقه انجام میشه
For i=1 to 1000
دستور خیلی سنگین
Application.DoEvent
دستور بازم خیلی سنگین
Application.DoEvent
Next i

بعد از اجرای دستور به خاصر اینکه پردازش خیلی سنگینه با دستور Application.DoEvent باعث Refresh شدن صفحه میشه و شما میتونی تصویرو ببینی

نکته: بعضی ها میگن استفاده زیاد از این دستور باعث کاهش سرعت میشه ولی من به شخصه تو پردازشهای خیلی سنگین اینو امتحان کردم .یکبار بدون Application.DoEvent و یکبار هم با چندین بار استفاده از اون لابلای دستورات ولی زمان اتمام کار در هر دو حالت یکی بود

DoDoklak
دوشنبه 02 آذر 1388, 15:51 عصر
به کمک دستورات فوق می توانید زمان اجرای دستورات را بدست آورید .

کد:
Dim a As New Diagnostics.Stopwatch a.Start() Me.Text = Strings.StrDup(1000, "a") a.Stop() MsgBox(a.ElapsedMilliseconds) a.Start() Dim s As String For i As Integer = 1 To 1000 s += "a" Next Me.Text = s a.Stop() MsgBox(a.ElapsedMilliseconds


با تشکر
البته این محاسبته زمان زیاد کارایی نداره چون زمان محایبات وابسته به محیط تغییر میکنه مثلا اگر هدف کار با بانک اطلاعاتی باشه بسته به نوع بانک تو رکوردهای کم و زیاد زمان فرق میکنه و توشبکه بستگی به سرعت تجهیزات و ترافیک شبکه داره.
اصلا محاسبه زمان اتمام عملیات همیشه در حد ضعیفیه. خود ویندوز تو کپی کردن همیشه زمان کپی رو پس و پیش میبره و گاهی هم زمان انجام عملیات یا زودتر تموم میشه یا دیرتر

shahab2025
دوشنبه 02 آذر 1388, 17:56 عصر
سلام
من هم همين مشكل را دارم
ولي فعاليتهاي من بيشتر در سمت sql انجام ميشه؟؟؟


فرض کنید پروسه شما تو یک حلقه انجام میشه
For i=1 to 1000
دستور خیلی سنگین
Application.DoEvent
دستور بازم خیلی سنگین
Application.DoEvent
Next i

بعد از اجرای دستور به خاصر اینکه پردازش خیلی سنگینه با دستور Application.DoEvent باعث Refresh شدن صفحه میشه و شما میتونی تصویرو ببینی

نکته: بعضی ها میگن استفاده زیاد از این دستور باعث کاهش سرعت میشه ولی من به شخصه تو پردازشهای خیلی سنگین اینو امتحان کردم .یکبار بدون Application.DoEvent و یکبار هم با چندین بار استفاده از اون لابلای دستورات ولی زمان اتمام کار در هر دو حالت یکی بود

فكر ميكنيد اين روش براي من هم موثر هست؟؟؟

DoDoklak
سه شنبه 03 آذر 1388, 08:37 صبح
فكر ميكنيد اين روش براي من هم موثر هست؟؟؟

بله موثر هست چون همون دستور پردازش مربوط به بانکتون هم میتونه فرم رو قفل کنه و با این دستور refresh میشه

afrooz_rahmati63@yahoo.com
سه شنبه 03 آذر 1388, 15:24 عصر
شما چجوری بدون اینکه یک thread دیگه را فعال کنید این کار را می کنید؟( در web application ها از application.doevent نمی شه استفاده کرد ( یعنی حداقل من بلد نبودم استفاده کنم ولی با thread ها مشکلم حل شد.)

یک سری به این لینک بزنید ...

http://www.simple-talk.com/dotnet/asp.net/implementing-waiting-pages-in-asp.net/

DoDoklak
سه شنبه 03 آذر 1388, 15:49 عصر
در web application ها از application.doevent نمی شه استفاده کرد ( یعنی حداقل من بلد نبودم استفاده کنم ولی با thread ها مشکلم حل شد.)



Application.Doevent برای WinApplication کاربر داره نه برای WEB
ولی در کل تو پردازشهای سنگین استفاده از Threat بسیار موثر و سازنده است ولی به طبع خود threat ها مشکلاتی در پیش دارند مخصوصا هنگامی که Threat ها احتیاج به خواندن و نوشتن اشتراکی بر روی یک داده دارند که در صورت عدم کنترل صحیح باعث اشتباهات بزرگی خواهد شد.
در کل Application.Doevent یک راهکار راحت و ساده است.

ولی تو بعضی شرایط شاید جوابگو نباشه
فرض کنیدیک پردازش سنگین داریم

پردازش1
Application.Doevent

مسلما تا پردازش1 به اتمام نرسه Application.Doevent اجرا نمیشه و فرم تا اتمام پردازش1 قفل میمونه

جهت جلوگیری از این حالت چند راه داره:
1- اگه پردازش1 خودش کارهای متنوعی انجام میده باید داخل خود پردازش1 از Application.Doevent به نحوه مناسب استفاده بشه

2- پردازش های اینچونینی رو باید تبدیل به چند تا پردازش سبکتر کرد تا راحتر اجرا بشه و سیستم هنگ نکنه
پردازش1
Application.Doevent
پردازش2
Application.Doevent
پردازش3

3-اگه نمیشه پردازش مربوطه رو کوچیک کرد و یا داخلش از Application.Doevent استفاده کرد(مثلا حالتی که یک Query سنگین به بانک میفرستی و باید منتظر جواب باشی) تنها راه استفاده از همون Threat است ولی همونطور که گفتم باید تو مدیریتش وسواس به خرج بدی تا دچار تداخل نشن(که البته میشه با تکنیک بافر چرخشی اونو مدیریت کرد)

البته با رعایت تمام نکات مربوطه هم ، انتظار و یا حتی کمی قفل شدن بازم طبیعیه و به احتمال زیاد تو حجمهای بالا بازم به وجود میاد ولی قابل تحمله