Showing posts with label advance-csharp. Show all posts
Showing posts with label advance-csharp. Show all posts

Thursday, April 24, 2014

برمجة متقدمة سي شارب المعالجة المتوازية المتعددة ثريد C# Multithreading

المعالجة المتوازية المتعددة C# - Multithreading

برمجة متقدمة سي شارب المعالجة المتوازية المتعددة C#  Multithreading
المعالجة المتوازية المتعددة ثريد C#  Multithreading

المعالجة المتوازية المتعددة C#  Multithreading

ماهو  thread   او التمرير او المسار المعاجة المجزئة ؟

يعرف بأنه مسار تنفيذ البرنامج. يحدد كل مسار فريد تدفق  من التحكم. إذا كان التطبيق الخاص بك معقدة ويستهلك وقتا في المعالجة فأن الحل هو استخدام المعاجة المتعددة بحيث إعطاء كل وظيفة متكاملة في برنامجك مسار أي ثريد فيتم معالجة البرنامج الى عدة مسارات ومعالجات متوازية وفي حال حدوث اي خلال  في معالجة وحدة وظيفية فانه لا يؤثر على عمل البرنامج ككل.
في الصورة التالية توضح لك  ماهو المعالجة المتعددة وففي المثال لدينا برنامج واحد فقط شغال من متصفح جوجل كروم ولس ان البرنامج مشغل أكثر من مرة حيث يظهر  تكرار الاسم فان التكرار هو عبارة عن ثريد thread فكل واحد ثمثل مسار معالجة فمثلا لو حدث خللل في واحدة فلن يؤثر على الباقي وهنا كل مسار عبارة عن صفحة لموقع او إضافة plugin هذا هو الثريد.
برمجة متقدمة سي شارب المعالجة المتوازية المتعددة ثريد C#  Multithreading
المعالجة المتوازية المتعددة ثريد C#  Multithreading

مميزات المعالجة المتوازية للمسارات او الثريد

  • تقلل من الاستهلاك للمعالج
  • تزيد من كفاءة التطبيق

دورة حياة المعالجة المتعددة المتوازية المسارات Thread Life Cycle

عند استخدام المعالجة المتعددة يتم انشاء كائن من الفئة thread وينتهي الكائن بانتهاء المعالجة.
التالي هو جميع الحالات في دورة المعالجة المتوازية

  • Unstarted State   في هذه الحالة ثم انشاء كائن المعالجة ولكن لم يتم استدعاء الدالة التي تبداء بالثريد او معالجة  المسار.
  •   Ready State  وفي هذه الحالة يتم تجهيز المعالجة للبرنامج ويتم ارساله الى دورة المعالجة للبدء.
  •  Not Runnable State  وفي هذه الحالة تكون الثريد غير قابلة للتشغيل في الحالات التالية
    • ثم استدعاء دالة sleep
    • ثم استدعاء دالة الانتظار wait
    • ثم اغلاق المعالجة بواسطة مشغل المدخل والخارج i/o
  • Dead State   حالة الانهاء يتم استدعاءها عند الانتهاء من تنفيذ البرنامج بالكامل او عند الغاء العملية.

المسار الرئيسي Main Thread

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

مثال على المسار الرئيسي 


using System;
using System.Threading;

namespace MultithreadingApplication
{
    class MainThreadProgram
    {
        static void Main(string[] args)
        {
            Thread th = Thread.CurrentThread;
            th.Name = "MainThread";
            Console.WriteLine("This is {0}", th.Name);
            Console.ReadKey();
        }
    }
}

ناتج المثال.

This is MainThread

إنشاء معالجة متوازية Creating Threads

باستخدام الدالة start نبداء المعالجة المتوازية

using System;
using System.Threading;

namespace MultithreadingApplication
{
    class ThreadCreationProgram
    {
        public static void CallToChildThread()
        {
            Console.WriteLine("Child thread starts");
        }
        
        static void Main(string[] args)
        {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Console.ReadKey();
        }
    }
}

ناتج كود انشاء المعالجة  المتوازية اوالمسارات

In Main: Creating the Child thread
Child thread starts

Managing Threadsإدارة المعالجة المتوازية

 sleep() الدالة تستخدم في ايقاف المعالجة لفترة من الزمن.
using System;
using System.Threading;

namespace MultithreadingApplication
{
    class ThreadCreationProgram
    {
        public static void CallToChildThread()
        {
            Console.WriteLine("Child thread starts");
            // the thread is paused for 5000 milliseconds
            int sleepfor = 5000; 
            Console.WriteLine("Child Thread Paused for {0} seconds", 
                              sleepfor / 1000);
            Thread.Sleep(sleepfor);
            Console.WriteLine("Child thread resumes");
        }
        
        static void Main(string[] args)
        {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Console.ReadKey();
        }
    }
}
ناتج كود معالجة  المسارات اوالثريد
In Main: Creating the Child thread
Child thread starts
Child Thread Paused for 5 seconds
Child thread resumes

انهاء المعالجة المساراتDestroying Threads

Abort() تستخدم الدالة لانهاء المعالجة المتعددة
ThreadAbortException. من خلال القاء اسثتناء

using System;
using System.Threading;

namespace MultithreadingApplication
{
    class ThreadCreationProgram
    {
        public static void CallToChildThread()
        {
            try
            {

                Console.WriteLine("Child thread starts");
                // do some work, like counting to 10
                for (int counter = 0; counter <= 10; counter++)
                {
                    Thread.Sleep(500);
                    Console.WriteLine(counter);
                }
                Console.WriteLine("Child Thread Completed");

            }
            catch (ThreadAbortException e)
            {
                Console.WriteLine("Thread Abort Exception");
            }
            finally
            {
                Console.WriteLine("Couldn't catch the Thread Exception");
            }

        }
        
        static void Main(string[] args)
        {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            //stop the main thread for some time
            Thread.Sleep(2000);
            //now abort the child
            Console.WriteLine("In Main: Aborting the Child thread");
            childThread.Abort();
            Console.ReadKey();
        }
    }
}
ناتج كود تدمير المعالجة المتوازية
In Main: Creating the Child thread
Child thread starts
0
1
2
In Main: Aborting the Child thread
Thread Abort Exception
Couldn't catch the Thread Exception 

  


لمتابعتي
تويتر: @aalmahallawi
IT Help Desk,
SEO Arabic Expert ,PHP,C#,ASPX
Al alami st
gaza -jabaliaGaza Strip
Palestine
Email :ahmed.almahallawi@gmail.com
DOB: 05/10/1984
1 comment

Saturday, February 22, 2014

برمجة متقدمة سي شارب الاكواد الغير معالجة او الغير أمنة C# - Unsafe Codes

 الاكواد الغير معالجة او الغير أمنة

  Unsafe Codes

 الاكواد الغير معالجة او الغير أمنة  Unsafe Codes

تسمح لغة السي شارب باستخدام متغيرات المؤشرات في أكواد السي شارب . الكود الغير معالج هو كود يستخدم المؤشرات كمتغيرات,

المؤشر:

المؤشر هو متغير قيمته هي لعنوان لمتغير أخر.لاستخدام المؤشرات فيجب تعريفها قبل استخدامها مثلها مثل أي متغير.

الصيغة العامة لتعريف المؤشرات في سي شارب

type *var-name;

التالي تعريفات صحيحة للمؤشرات

int    *ip;    /* pointer to an integer */
double *dp;    /* pointer to a double */
float  *fp;    /* pointer to a float */
char   *ch     /* pointer to a character */

المثال التالي يستخدم المؤشرات باستخدام محدد الوصولunsafe

using System;
namespace UnsafeCodeApplication
{
    class Program
    {
        static unsafe void Main(string[] args)
        {
            int var = 20;
            int* p = &var;
            Console.WriteLine("Data is: {0} ",  var);
            Console.WriteLine("Address is: {0}",  (int)p);
            Console.ReadKey();
        }
    }
}

ناتج الكود السابق المؤشرات

Data is: 20
Address is: 99215364


استعادة البيانات ذات القيمة باستخدام المؤشرات

لاستعادة البيانات ذات القيمة نستخدم الدالة tostring
using System;
namespace UnsafeCodeApplication
{
   class Program
   {
      public static void Main()
      {
         unsafe
         {
            int var = 20;
            int* p = &var;
            Console.WriteLine("Data is: {0} " , var);
            Console.WriteLine("Data is: {0} " , p->ToString());
            Console.WriteLine("Address is: {0} " , (int)p);
         }
         Console.ReadKey();
      }
   }
}

ناتج مثال المؤشرات السابق

Data is: 20
Data is: 20
Address is: 77128984

تمرير المؤشرات كمتغيرات للدالة


using System;
namespace UnsafeCodeApplication
{
   class TestPointer
   {
      public unsafe void swap(int* p, int *q)
      {
         int temp = *p;
         *p = *q;
         *q = temp;
      }

      public unsafe static void Main()
      {
         TestPointer p = new TestPointer();
         int var1 = 10;
         int var2 = 20;
         int* x = &var1;
         int* y = &var2;
         
         Console.WriteLine("Before Swap: var1:{0}, var2: {1}", var1, var2);
         p.swap(x, y);

         Console.WriteLine("After Swap: var1:{0}, var2: {1}", var1, var2);
         Console.ReadKey();
      }
   }
}

ناتج مثال المؤشرات السابق


Before Swap: var1: 10, var2: 20
After Swap: var1: 20, var2: 10

الوصول لعناصر المصفوفة باستخدام المؤشرات

للوصول لعناصر المصفوفة باستخدام المؤشرات  كما في الس يلس بلس فانك بحاجةلاستخدام fixed keyword.


using System;
namespace UnsafeCodeApplication
{
   class TestPointer
   {
      public unsafe static void Main()
      {
         int[]  list = {10, 100, 200};
         fixed(int *ptr = list)

         /* let us have array address in pointer */
         for ( int i = 0; i < 3; i++)
         {
            Console.WriteLine("Address of list[{0}]={1}",i,(int)(ptr + i));
            Console.WriteLine("Value of list[{0}]={1}", i, *(ptr + i));
         }
         Console.ReadKey();
      }
   }
}

ناتج مثال المؤشرات السابق


Address of list[0] = 31627168
Value of list[0] = 10
Address of list[1] = 31627172
Value of list[1] = 100
Address of list[2] = 31627176
Value of list[2] = 200

لاستخدام الكود الغير امنة عليك تفعيله كالتالي في بيئة فيجوال استديو


  1.  افتح قائمة Project properties 
  2.  ثم اضغط على التبويب Build .
  3.  اختر التالي  "Allow unsafe code".



<<السابق الدالة الغير معروفة


التالي  المعالجة المتعددة >>
---------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------

Ahmed Ata Almahallawi
Freelancer
IT Help Desk,
SEO experience,PHP,C#,ASPX,Business Analysis
Al alami st
gaza -jabaliaGaza Strip
Palestine
ahmed.almahallawi@gmail.com
DOB: 05/10/1984
by +Ahmed Almahallawi 
29/3/2014

No comments