من می خوام تو برنامه در قسمت های زمانبر ، کاربر رو متوجه کنم مثلا ساعت شنی یا "لطفاً چند لحضه صبر کنید" یا یه چنین چیزی بزارم که زیبا هم باشه . لطفاً اگه می تونید کمک کنه ؟
ممنون
من می خوام تو برنامه در قسمت های زمانبر ، کاربر رو متوجه کنم مثلا ساعت شنی یا "لطفاً چند لحضه صبر کنید" یا یه چنین چیزی بزارم که زیبا هم باشه . لطفاً اگه می تونید کمک کنه ؟
ممنون
به نظر من بهتر از تصاویر متحرک برای انتظار استفاده کنید.
مزیت این تصاویر متحرک نسبت به خود Process Bar اینه که برنامه نویسی نمیخواد و لازم نیست مدت زمان نامعلومی رو مدام محاسبه کنید.چون بعضی پروسسها زمانش مشخص نیست و شما نمی دونید چند تا حرکت جلو برید ولی با این تصاویر متحرک گردشی هیچ مشکلی ندارید
چند تا نمونه
آخرین ویرایش به وسیله DoDoklak : یک شنبه 01 آذر 1388 در 12:30 عصر
منون از راهنماییتون
چه طور از اینها استفاده کنم ؟
____________________________________
آخرین ویرایش به وسیله ehsan21 : دوشنبه 02 آذر 1388 در 09:22 صبح
اینها فقط تصاویر هستند نه کامپوننتکامپوننت جالبی بود
اینها فقط چند تا نمونه بودن شما میتونید نمونه های بیشتری پیدا کنید که با شکل و ظاهر برنامه تون هماهنگ باشهاما به style برنامه من نمی خوره . فکر کنم از همون روش دوستان باید استفاده کنم
کدوم روش اینجا به غیر از تصاویر متحرک روش دیگه ای ذکر نشدهفکر کنم از همون روش دوستان باید استفاده کنم
البته نمی خواستم از این روش استفاده کنم ظاهراً به جز این راهی نیست
مگر کار شما چیه که توش موندید؟
ببخشید تاپیک قبلی اشتباهی ارسال شده بود
چه طور از این تصاویر استفاده کنم؟
روی تصویر موجود کلیک راست کنید کنید و گزینه Save Picture As رو بزنید و اون تصویر رو برای خودتون با فرمت Gif ذخیره کنید.
بعد تو برنامه تون اون جایی که کاربر باید منتظر بشه یک PicturBox میذارید و تصویر متحرک رو به اون اعمال میکنید و خاصیت Visible اونو برابر false قرار بدید و وقتی عملیات شروع شد کافی Visible اونو برابر True قرار بدید تا کاربر اونو ببینه و وقتی عملیات تموم شد دوباره Visible اونو False میکنید.
به همین سادگی
یه نمونه
وقتی کاربر عملیات رو شروع میکنه فقط تصویر مخفی شده ظاهر میشه
متاسفانه با این روش نمیشه
من در ابتدای رویداد کلیل کامند اونو true می کنم و هنگامی که محاسبات تموم میشه اونو false اما نمیشه .
چرا میشه به احتمال زیاد چون فرایند پروسس شما خیلی سنگین بوده تصویر نتوسته خودشو نمایش بدهمتاسفانه با این روش نمیشه
من در ابتدای رویداد کلیل کامند اونو true می کنم و هنگامی که محاسبات تموم میشه اونو false اما نمیشه .
شما تو اجرای دستوراتتون از کد زیر استفاده کنید
Application.DoEvent
به کمک دستورات فوق می توانید زمان اجرای دستورات را بدست آورید .
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)
آره فرایند پروسس من خیلی سنگینه
از Application.DoEvent چه طور استفاده کنم ؟
تمام خطوط یک پروسه با هم اجرا می شوند و سپس صفحه refresh می شود یعنی اینکه اگر شما در ابتدای event تصوير را visible کردید و در انتها invisible بنابراین شما فقط invisible را می بینید که می توانید با post back کردن در کد انفصال ايجاى كني.
فرض کنید پروسه شما تو یک حلقه انجام میشه
For i=1 to 1000
دستور خیلی سنگین
Application.DoEvent
دستور بازم خیلی سنگین
Application.DoEvent
Next i
بعد از اجرای دستور به خاصر اینکه پردازش خیلی سنگینه با دستور Application.DoEvent باعث Refresh شدن صفحه میشه و شما میتونی تصویرو ببینی
نکته: بعضی ها میگن استفاده زیاد از این دستور باعث کاهش سرعت میشه ولی من به شخصه تو پردازشهای خیلی سنگین اینو امتحان کردم .یکبار بدون Application.DoEvent و یکبار هم با چندین بار استفاده از اون لابلای دستورات ولی زمان اتمام کار در هر دو حالت یکی بود
با تشکربه کمک دستورات فوق می توانید زمان اجرای دستورات را بدست آورید .
کد:
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
البته این محاسبته زمان زیاد کارایی نداره چون زمان محایبات وابسته به محیط تغییر میکنه مثلا اگر هدف کار با بانک اطلاعاتی باشه بسته به نوع بانک تو رکوردهای کم و زیاد زمان فرق میکنه و توشبکه بستگی به سرعت تجهیزات و ترافیک شبکه داره.
اصلا محاسبه زمان اتمام عملیات همیشه در حد ضعیفیه. خود ویندوز تو کپی کردن همیشه زمان کپی رو پس و پیش میبره و گاهی هم زمان انجام عملیات یا زودتر تموم میشه یا دیرتر
بله موثر هست چون همون دستور پردازش مربوط به بانکتون هم میتونه فرم رو قفل کنه و با این دستور refresh میشهفكر ميكنيد اين روش براي من هم موثر هست؟؟؟
شما چجوری بدون اینکه یک thread دیگه را فعال کنید این کار را می کنید؟( در web application ها از application.doevent نمی شه استفاده کرد ( یعنی حداقل من بلد نبودم استفاده کنم ولی با thread ها مشکلم حل شد.)
یک سری به این لینک بزنید ...
http://www.simple-talk.com/dotnet/as...es-in-asp.net/
Application.Doevent برای WinApplication کاربر داره نه برای WEBدر web application ها از application.doevent نمی شه استفاده کرد ( یعنی حداقل من بلد نبودم استفاده کنم ولی با thread ها مشکلم حل شد.)
ولی در کل تو پردازشهای سنگین استفاده از 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 است ولی همونطور که گفتم باید تو مدیریتش وسواس به خرج بدی تا دچار تداخل نشن(که البته میشه با تکنیک بافر چرخشی اونو مدیریت کرد)
البته با رعایت تمام نکات مربوطه هم ، انتظار و یا حتی کمی قفل شدن بازم طبیعیه و به احتمال زیاد تو حجمهای بالا بازم به وجود میاد ولی قابل تحمله