November 21, 2011

Threading

สำหรับภาษา C# และภาษาโปรแกรมอื่นๆอีกหลายภาษา โดยทั่วไปแล้ว program จะทำการ execute code จากบนลงล่างเสมอ เช่น

int number = 500;
char alph = 'a';

จากตัวอย่าง ตัวแปร number จะถูกประกาศก่อน alph
หรือ

int sum1 = 0, sum2 = 0;
for(int i = 0; i < 5; i++)
    sum1 += 1;
for(int k = 0; k < 10; k++)
    sum2 += 10;

จากตัวอย่าง program จะวน for loop บวกค่า sum1 ให้เสร็จก่อนแล้วจึงวน for loop บวกค่า sum2 ตามลำดับจากบนลงล่าง ซึ่งจะเห็นว่าเราไม่สามารถทำงานทั้ง 2 for พร้อมๆ กันได้ จึงต้องใช้ Thread เข้ามาช่วยในกรณีนี้

Thread คือการแบ่งงานออกเป็นส่วนๆ ขณะที่โปรแกรมทำงานอย่างหนึ่ง ก็สามารถทำงานอีกอย่างหนึ่งไปพร้อมๆกันได้ ทำให้โปรแกรมทำงานได้รวดเร็วยิ่งขึ้น ตัวอย่างเช่น ถ้าเราเขียนโปรแกรมดาวน์โหลดรูปภาพมาจากเซิร์ฟเวอร์ ขณะนี้เองอาจจะทำให้โปรแกรมค้างหรือทำงานได้ช้าลง และไม่สามารถทำงานอย่างอื่นได้ แต่หากใช้ Thread เข้ามาช่วยแบ่งงานแล้ว ก็สามารถทำงานอื่นๆ ไปได้พร้อมๆกับการ
ดาวน์โหลด เป็นต้น

ตัวอย่างการเขียนโค้ด :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; // <---required header

namespace ThreadTesting
{
    class Program
    {
        static void food()
        {
            for (int i = 0; i < 21; i++)
            {
                Console.Write("P" + i.ToString() + " ");
            }
        }

        static void movie()
        {
            for (int i = 0; i < 21; i++)
            {
                Console.Write("M" + i.ToString() + " ");
            }
        }

        static void game()
        {
            for (int i = 0; i < 21; i++)
            {
                Console.Write("G" + i.ToString() + " ");
            }
        }

        static void Main()
        {
            Thread eat = new Thread(food);
            Thread watch = new Thread(movie);      
            Thread play = new Thread(game);
            eat.Start();
            watch.Start();
            play.Start();
            //Console.ReadLine();
        }
    }
}

OUTPUT :
M0 M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 G0 G1 G2 G3 G4 G5 G6 G7 G8 G9 G10 G11 G12 G13 G14 G15 G16 G17 G18 G19 G20 P13 P14 P15 P16 P17 P18 P19 P20 M11 M12 M13 M14 M15 M16 M17 M18 M19 M20

จะพบว่า ถึงแม้ Thread food จะถูกสั่งให้ทำงานก่อน แต่ก็ไม่ได้ถูกปริ้นท์ออกมาเป็นตัวแรกหรือเสร็จเป็นตัวแรกเสมอไป และทั้ง 3 Thread จะทำงานได้พร้อมๆกัน

หากต้องการให้โปรแกรมหยุดพักการทำงานก็สามารถใช้คำสั่งต่อไปนี้ได้

Thread.Sleep(int delay in millisecond);

เช่น Thread.Sleep(1000);

เมื่อโค้ดรันมาถึงบรรทัดนี้ โปรแกรมก็จะหยุดทำงานเป็นเวลา 1 วินาที

No comments:

Post a Comment