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

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

18.jpg

 

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

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

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

2 thoughts on “كيف تجعل برنامجك يستمر في الاستجابة للمستخدم اثناء قيامه في مهمة حسابية معينة!!

  1. كلامك صحيح, ولكني ذكرت إلى جانبها المصطلح الاجنبي. أورافقك الرأي, أحيانا لا يمكنك التعبير عن المصطلحات البرمجية بالعربية على سبيل المثال Cookies ؟؟؟ =))

    وشكرا جزيلا على ملاحظتك.

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s