PDA

View Full Version : فرم مشغول ( Busy Form (



MSRProg2005
یک شنبه 25 مرداد 1388, 15:21 عصر
سلام دوستان
سوال من در این مورده که چطور می تونیم کنترل کنیم یک فرم وقتی در حال انجام یک فعالیت هست اصطلاحا قفل نشه و یا کل فرم سفید رنگ نشه
برای مثال من در فرمم میخوام عملیات دانلود یک صفحه از اینترنت انجام بشه این کار رو با WebClient انجام میدم ولی مشکل اینه که تا زمانی که صفحه گرفته میشه کل فرم قفله و هیچ کار دیگه ای نمیشه انجام داد. نمیشه این پروسه رو به BackGround فرستاد و مثلا در فرم یک چیزی باشه که بنویسه در حال دریافت صفحه ؟ تقریبا شبیه Ajax ?
آرزوی موفقیت برای همه شما رو دارم
ممنون

debugger
یک شنبه 25 مرداد 1388, 15:44 عصر
من هم وقتي دارم اسكن مي كنم تا عكس را در picture box فرم بزارم ف موقع اسكن برنامه گير مي كنه و فرم سفيد ميشه

من اين كار را مي كنم

form1.enabled=false

كد هاي اسكن

form1.enabled=true

tdkhakpur
یک شنبه 25 مرداد 1388, 16:11 عصر
بهتره کار جدید را توسط یک thread جدید اجرا کنید.در مورد Thread توضیحات زیادی در فروم شده جستجو کنید پیدا میکنید.

Sajjad.Aghapour
یک شنبه 25 مرداد 1388, 18:06 عصر
بهتره کار جدید را توسط یک thread جدید اجرا کنید.در مورد Thread توضیحات زیادی در فروم شده جستجو کنید پیدا میکنید.
با ترکیبی از thread و delegate شما می تونید به این منظور دست پیدا کنید.همچنین می تونید از BackgroundWorker استفاده کنید..
...

Sociant
دوشنبه 26 مرداد 1388, 23:10 عصر
با ترکیبی از thread و delegate ...

خود Delegate نه ترکیبش با Thread:

مرحله اول : تعریف delegate منطبق بر امضای متدی که عمل اسکن رو انجام میده


delegate return_type SampleDelegate(parameters);

توضیح : بجای parameters پارامترهای متد و بجای return_type نوع بازگشتی را قرار دهید

مرحله دوم : تعریف متد Callback که بعد از اتمام کار متد اسکن کننده فراخوانی خواهد شد


void Callback(IAsynchResult result){
...
}



مرحله سوم : ایجاد شی از delegate و فراخوانی آن بصورت Asynchronous (غیر همگام)


...
SampleDelegate d =new SampleDelegate(SampleMethod)
d.BeginInvoke(parameters,CallBack,d);
...

توضیح :
بجای parameters ، پارامترهای متد مورد نظرتون رو بنویسید
Callback همان متدی است که در مرحله 2 تعریف کرده ایم
d همان شی ساخته شده از delegate تعریف شده در مرحله 1 است.در بدنه متد Callback به این شی نیاز خواهیم داشت
این کد را در قسمتی از برنامه که آغاز کننده عمل اسکن هست قرار دهید، مثلا در رویداد کلیک دکمه اسکن
مرحله 4 : تکمیل بدنه متد Callback تعریف شده در مرحله 2


void Callback(IAsyncResult result){
SampleDelegate d = (SampleDelegate)result.AsyncState;
d.EndInvoke(result);
...
}

توضیح : از آنجاییکه این متد پس از پایان یافتن عملیات در متد اسکن کننده اجرا میشود ، میتوانید اعمالی میخواهید در این موقعیت انجام شود ، نظیر نمایش پیام اتمام اسکن، در این متد قرار دهید.

MSRProg2005
پنج شنبه 29 مرداد 1388, 20:06 عصر
ممنون از راهنماییتون

Sajjad.Aghapour
جمعه 30 مرداد 1388, 00:24 صبح
خود Delegate نه ترکیبش با Thread:

راه ای رسیدن به خدا خیلیه.....


private void button1_Click_1(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(start));
t.Start();
}

private void start()
{
//any code here
this.Invoke(new Del(MainFunction));
}

private void MainFunction()
{
//any code here
}