المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : كيف تجعل برنامجك يستمر في الاستجابة للمستخدم اثناء قيامه في مهمة حسابية معينة!!


الناشر
08-28-2008, 02:08 PM
ربما عزيزي المبرمج تساءلت وتساءلت وتساءلت عن كيفية جعل برنامجك يستمر في الاستجابة للمستخدم اثناء قيامه في مهمة حسابية معينة معقدة مثل العاملي، فهل تساءلت عن هذا يوما إن كان جوابك نعم فأعتقد أن المقالة التالية سوف تشرح لك كيفيةعل ذلك بكل سهولة، وإن كان جوابك لا فلا بأس أن تتعلم كيف تستطيع تحقيق ذلك فهذا الأمر من اللأشياء المهمة والمهمة جدا، دعنا نحقق ذلك من خلال المثال السابق.



http://kanaan85.files.wordpress.com/2008/02/18.jpg?w=267&h=148


*

ولكن قبل البدء عزيزي المبرمج أنه في هذه المقالة سوف نستخدم ميزات المفوضات delegates لذلك لا بد من معرفتك إياها قبل الشروع في هذه المقالة إن كنت لا تعلم فيجب عليك مراجعة موضوع للتعرف على delegate.

طبعا بعد ان تقوم باختيار مشروع من نوع Windows Application ضع الأدوات التالية الموضحة من خلال الشكل التالي:



http://kanaan85.files.wordpress.com/2008/02/18.jpg

ولقد قمت بتسمية بعض الادوات بالأسماء التالية:
txtFactNum *يمثل الحقل الذي من خلاله سنقوم بإدخال القيمة التي نرغب بحساب العاملي لها.
txtResult تمثل الحقل الذي سوف نقوم من خلاله بعرض الناتج
btnCalc يمثل الزر الذي سوف يقوم بإجراء عملية حساب العاملي للرقم المدخل.والان ماذا يلزمنا بداية؟؟؟

بالتأكيد ما يلزمنا هو كتابة التابع الذي سيقوم بحساب قيمة العاملي، والموضح في الشكل التالي:

private ulong Fact(int num)
{
*** ulong res = 1;
*
*** for (uint i = 2; i < num; i++)
*** {
******* res = res * i;
*
******* for (int j = 0; j < 20000000; j++) ;
*** }
*
*** return res;
}

*ربما تساءلت ما هذه التعليمة الموجودة في الكود السابق:

for (int j = 0; j < 20000000; j++)*;

فقط قمت بإضافة الحلقة السابقة ليزداد زمن تنفيذ العاملي.والان ينبغي علينا كتابة كود الزر btnCalc، ولكن لا تنسى ما نريده هو عدم توقف البرنامج عن الاستجابة أثناء عملية التنفيذ، وبالتالي علينا القيام يالخطوات التاليه:اولا قم بإنشاء مفوض يطابق توقيع التابع السابق Fact والذي سيكون على النحو التالي:

public partial class Form1 : Form
{
*** delegate ulong FactHandler(int num);
*** FactHandler fact;
*** IAsyncResult result;
*** Timer timer;
*
****public Form1()
*** {
******* InitializeComponent();*

******* timer = new Timer();
******* timer.Interval = 500;
******* timer.Tick += new EventHandler(timer_Tick);
*** }
}

طبعا قمت في الكود السابق بانشاء كائن من المفوض بشكل مباشر وعرفت كائن آخر من نوع IAsyncResult وأيضا عرفت timer لأنها سوف تفيدني لاحقا
والان لنعد إلى كود الزر btnCalc:

private void btnCalc_Click(object sender, EventArgs e)
{
*** fact = new FactHandler(Fact);
*** int number = Convert.ToInt32(txtFactNum.Text);
*
*** btnCalc.Enabled = false;
*** timer.Start();
*** result = fact.BeginInvoke(number, null, null);
}

طبعا قمت باستخدام timer من أجل فحص في حال أنه قد تمت عملية الحساب، وهذا كود الحدث Tick الخاص باـ timer:

void timer_Tick(object sender, EventArgs e)
{
*** if (result.IsCompleted)
*** {
******* txtResult.Text = fact.EndInvoke(result).ToString();
*
******* timer.Stop();
******* btnCalc.Enabled = true;
*** }
}

لتحميل مثال الدرس إليك الرابط التالي: http://www.eclasshome.com/attach/upload3/wh_62001953.zip



http://feeds.wordpress.com/1.0/categories/kanaan85.wordpress.com/32/ http://feeds.wordpress.com/1.0/tags/kanaan85.wordpress.com/32/ http://feeds.wordpress.com/1.0/comments/kanaan85.wordpress.com/32/ (http://feeds.wordpress.com/1.0/gocomments/kanaan85.wordpress.com/32/) http://feeds.wordpress.com/1.0/delicious/kanaan85.wordpress.com/32/ (http://feeds.wordpress.com/1.0/godelicious/kanaan85.wordpress.com/32/) http://feeds.wordpress.com/1.0/stumble/kanaan85.wordpress.com/32/ (http://feeds.wordpress.com/1.0/gostumble/kanaan85.wordpress.com/32/) http://feeds.wordpress.com/1.0/digg/kanaan85.wordpress.com/32/ (http://feeds.wordpress.com/1.0/godigg/kanaan85.wordpress.com/32/) http://feeds.wordpress.com/1.0/reddit/kanaan85.wordpress.com/32/ (http://feeds.wordpress.com/1.0/goreddit/kanaan85.wordpress.com/32/) http://stats.wordpress.com/b.gif?host=kanaan85.wordpress.com&blog=2943185&post=32&subd=kanaan85&ref=&feed=1


منقول... (http://kanaan85.wordpress.com/2008/02/29/%d9%83%d9%8a%d9%81-%d8%aa%d8%ac%d8%b9%d9%84-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d8%ac%d9%83-%d9%8a%d8%b3%d8%aa%d9%85%d8%b1-%d9%81%d9%8a-%d8%a7%d9%84%d8%a7%d8%b3%d8%aa%d8%ac%d8%a7%d8%a8%d 8%a9-%d9%84%d9%84/)