PDA

نسخه کامل مشاهده نسخه کامل : نمایش یک پیغام خاص یا ... در هنگامی که برنامه در حال پردازش اطلاعات است



M-B-M
25-10-2008, 16:44
سلام
چطور می شود وقتی که کاربر روی یک دکمه کلیک می کند و پردازش اطلاعات طولانی انجام می شود به کاربر پیغام مرتبط نمایش داده شود و یا یک شی مانند progressBar در StatusBar در هنگام شروع پردازش اطلاعات شروع به کار کند و در هنگام پایان پردازش کامل شود (در ضمن فرم را چگونه می توان قفل کرد که کاربر روی فرم نتواند کلیک کند)

hamidreza_buddy
25-10-2008, 23:00
اینجا یه نمونه هست.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

حتماً حواست باشه اگه پردازشت خیلی طول می کشه اون رو از توی یک thread اجرا کنی و سپس مقادیر progressbar رو از تو اون اجرا کنی.
به این دلیل که اگه پردازشت طول یکشه برنامت not responding میشه و هیچ رویداد event رو نمی گیری. حتی نمی تونه خودشو paint کنه.
برای thread هم می تونی از کنترل BackgroundWorker استفاده کنی.


یه راه دیگه برا نمایش درصد پیشرفت برنامه اینه که یه Form ایجاد کنی که توش یه progressbar داشته باشه و سپس اون رو show کنی و از توی یه thread اونو جلو ببری. همچنین اگه پردازش طولانیه یه دکمه Stop هم حتماً بذار.

M-B-M
26-10-2008, 20:20
سلام
لطفا جواب سئوال رو ابتدایی و شمرده شمرده بفرمایید چون من مثل شما حرفه ای نیستم

hamidreza_buddy
28-10-2008, 17:28
progressbar:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

شما مرحله مرحله جلو برید تا مشکلات کار دستتون بیاد.
مثلاً مرحله اول یه progressbar بذارید توی form و از اون استفاده کنید.
اگه موفق شدید، مرحله بعد سعی کنید اونو توی statusbat بگذارید.
مرحله بعد هم باید سعی کنید همزمانی ها رو درست کنید.

پس شما اول یه progressbar ساده توی فرمتون بذارید و ار اون استفاده کنید. موفق شدید برید مرحله بعد و اگه در این حین سئوالی واستون پیش اومد بپرسین.

M-B-M
20-02-2009, 18:05
سلام
لطفا این مورد بیشتر توضیح بفرمایید...



حتماً حواست باشه اگه پردازشت خیلی طول می کشه اون رو از توی یک thread اجرا کنی و سپس مقادیر progressbar رو از تو اون اجرا کنی.
به این دلیل که اگه پردازشت طول یکشه برنامت not responding میشه و هیچ رویداد event رو نمی گیری. حتی نمی تونه خودشو paint کنه.
برای thread هم می تونی از کنترل BackgroundWorker استفاده کنی.



طریقه ساخت BackgroundWorker و thread کردن رویدادها?

M-B-M
23-02-2009, 00:16
Please Help Me!

M-B-M
26-02-2009, 14:44
لطفا کمک!!!

Payman_62
26-02-2009, 19:33
سلام.
برای کار با تردها میتونی از کلاس System.Threading.Thread کمک بگیری. برنامت حرفه ای تر میشه.
هنگامی که شما از ترد ها استفاده کنید چند کار با هم انجام میشه. مثلا تو یه ترد پردازش انجام میشه و در این صورت برنامه قفل نمیشه و میتونه به کارای دیگه برسه.

M-B-M
26-02-2009, 23:10
اگه میشه لطف کنید بیشتر توضیح بدین چون من بار اوله که این اسم رو میشنوم!!!

M-B-M
26-02-2009, 23:11
لطفا طریقه کار را توضیح بدین؟؟؟

Payman_62
27-02-2009, 18:30
سلام.
لطفا پست تکراری و بی محتوا نفرستید.
این روش کار بار تردها.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

M-B-M
01-03-2009, 00:49
لطفا پست تکراری و بی محتوا نفرستید.


شرمنده دوتا پست تولید شد، نشد یکیشو پاک کنم!

در مورد کدهاتون هم اگه بیشتر میشد بیشتر توضیح میدادین ممنون میشدم!
مثلا میفرمودید که چگونه دو عدد Thread ایجاد شده (مثلا دستورات Login برنامه را با دستورات جلو بردن ProcessBar) هماهنگ کنم (بطوری که وقتی اعتبار سنجی نام کاربری و رمز عبور تمام می شود، شی ProcessBar نیز به انتها برسد)

am_merman01
01-03-2009, 01:10
سلام خدمت دوستان عزیز
دوست من شما ظاهرا در کل در این مورد چیزی نمیدونی پس بهتره که یه کمی در مورد thread یا همون چندریسمانی توی اینترنت تحقیق کنی و نتایج زیادی به دست میاری .
ولی در کل بهتون بگم که در حالت عادی برنامه شما تقریبا به صورت خطی پیش میره و تا زمانی که یک دستور به پایان نرسه دستور بعدی اجرا نمیشه.
ولی در حالت استفاده از چند ریسمان در برنامه شما میتونید به طور همزمان چند دستور رو به موازات هم اجرا کنید و با دستوراتی که مینویسید میتونید در هر لحظه که دوست دارید هرکدوم از ریسمان هارو که میخواید متوقف کنید و یا به شکل کامل از کار بیاندازید و حتی تقدم و تاخر ریسمان ها رو تعیین کنید و .....
و چون بحث یه کم طولانیه (ولی خیلی سادس) بهتره که خودت در موردش یه کم تحقیق کنی بعد راحت تر میشه بهتون کمک کرد تا مشکلاتتون رو رفع کنید.

Arshia001
01-03-2009, 17:18
خوب بابا لابد بنده خدا نمیدونه ترد چیه!زور که نیست!

اگه حالشو داری ترد یاد بگیری که هیچ،ولی اگه حسش نیست خیلی راحت میتونی به برنامت بگی خودشو باز-تازه سازی! کنه.این دستورو آخر حلقه یا بین خط های کد بنویس:


Windows.Forms.Application.DoEvents()

اینجوری هر چند وقت یه بار خود فرم خودشو باز-تازه سازی(چیه مگه؟خوب کلمه اختراع کردم!همون Refresh خودمونه!) میکنه.هم Event ها رو میگیری هم ProgressBar هات کار میافتن.اگه مشکلی داشتی پ.خ. بده کامل توضیح بدم واست.

am_merman01
01-03-2009, 23:49
سلام خدمت دوستان عزیز
ارشیا جان نظر شما هم جالب و سریع و تقریبا کارآمده.
البته من تا حالا از این روش استفاده نکرده بودم.
میخواستم بدونم این دستور همون کار دستور
Me.Refresh()
رو انجام میده یا چیز متفاوتی هستش؟

Payman_62
02-03-2009, 02:57
سلام.
نه me.refresh نیست. کلی تره. کلا یه فرصت به انجام کارهای عقب افتاده میده. مثلا اگه داخل یه حلقه طولانی باشیم یه فرصت کوتاه میده تایمر ها هم اجرا بشن.

M-B-M
02-03-2009, 10:41
لطفا یکی هم ما رو تحویل بگیره!!!!!!!!!!!!!!!
من یک فرم درست کردم و یک ProcessBar توش گذاشتم زمانی که کاربر روی دکمه login کلیک می کند، بطور دستی تعداد کل دستوراتی که برای دکمه Login نوشته ام را شمرده ام (در هنگام Design) و MaxValue شی ProcessBar را در اولین خط رویداد کلیک برابر با آن قرار دادم و پس از اجرای هر خط دستور یک واحد مقدار Value شی ProcessBar را زیاد کرده ام، و با این کار نتیجه ای که من میخواهم حاصل میشود اما راه اصولی و قابل قبولی نیست!!!
میخواستم ببینم چگونه می توان این کار را بطور اصولی پیش برد؟؟؟؟

Payman_62
02-03-2009, 14:27
سلام.
این کار اصلا منطقی نیست. شاید یه خط 10 ثانیه طول بکشه یه خط 1 میکروثانیه. پروگرس شما کند و تند و غیر یکنواخت پر میشه. ضمن این که کار برنامه نویسی شما 2 برابر شده. فرض کنید 50 خط کد بود چه دردسری داشت. حجم برنامه هم بی دلیل افزایش پیدا میکنه.
مگه لاگین کردن یوزر چه قدر زمان میبره که پروگرس گذاشتی؟ بیشتر از 10 ثانیه طول میکشه؟ یه پیغام چند لحظه صبر کنید... نمایش بده.

M-B-M
03-03-2009, 01:38
سلام.
این کار اصلا منطقی نیست. شاید یه خط 10 ثانیه طول بکشه یه خط 1 میکروثانیه. پروگرس شما کند و تند و غیر یکنواخت پر میشه. ضمن این که کار برنامه نویسی شما 2 برابر شده. فرض کنید 50 خط کد بود چه دردسری داشت. حجم برنامه هم بی دلیل افزایش پیدا میکنه.
مگه لاگین کردن یوزر چه قدر زمان میبره که پروگرس گذاشتی؟ بیشتر از 10 ثانیه طول میکشه؟ یه پیغام چند لحظه صبر کنید... نمایش بده.

دوست عزیز من لاگین را مثال زدم که دقیقا قابل لمس باشد!!!
بعد هم گفتم که این کار درستی نیست و از شما خواستم بفرمایید که راه حل اصولی آن چیست؟

Arshia001
03-03-2009, 15:33
سلام خدمت دوستان عزیز
عرشیا جان نظر شما هم جالب و سریع و تقریبا کارآمده.
البته من تا حالا از این روش استفاده نکرده بودم.
میخواستم بدونم این دستور همون کار دستور
Me.Refresh()
رو انجام میده یا چیز متفاوتی هستش؟

Refresh فقط فرم رو از نو زنده میکنه و به هیچ کدوم از Event ها اجازه ی اجرا شدن نمیده(اینو تست کردم).با یک کد طولانی هم اگه رو فرم کلیک کنی(مثلا) کلا از کار میافته(اینم تست کردم!اصلا از همینجا بود که DoEvents رو کشف کردم!)
در حالی که DoEvents به کل برنامه اجازه میده هر کار میخواد بکنه.یعنی اگه یک Module داشته باشی و توش یه فرم تعریف کنی بعد یه DO Loop بذاری و خط آخرش بنویسی Application.DoEvents اونوقت عین اینه که یه Windows Forms Application داری!

فقط به خاطر تو امضامم عوض کردم.ببین خط آخرش یاد چیزی نمیندازدت؟!:31:


دوست عزیز من لاگین را مثال زدم که دقیقا قابل لمس باشد!!!
بعد هم گفتم که این کار درستی نیست و از شما خواستم بفرمایید که راه حل اصولی آن چیست؟

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

am_merman01
04-03-2009, 01:13
سلام خدمت دوستان عزیز
دوست عزیز از اینکه اسم شما رو اشتباه تایپ کردم عذرخواهی میکنم. البته تقصیر من نیست عیب فینگیلیش نوشتن همینه دیگه .
به هر حال من پستم رو ادیت کردم .
باز هم از شما پوزش می طلبم .

MTPROG
15-03-2009, 11:33
بهترین روش برای اینکار اینه که از پروگرس بارهای انتظار (Wait ProgressBar) استفاده کنی
که تا اتمام کار مدام به عقب و جلو میره
اگه میتونی خودت یه کنترول از این نوع برای همیشه برای خودت طراحی کن در غیر اینصورت میتونی از کامپونینیت های اماده استفاده کنی

*** یه روش ساده تر
میتونی از یه تصویر GIF که به شکل یک پروگرس بار انتظاری هستش اسفاده کنی و اونو تو یه PictureBox نمایش بدی