ทำหน้าต่าง Now Loading (กำลังโหลด) ใน C# แบบง่ายๆ

เวลาเขียน Windows Forms Application ใน C# แล้วโปรแกรมต้องทำงานนานๆ หน้าต่างโปรแกรมก็จะค้างไปเลย (บางทีก็ขึ้น Not responding) เรามาลองสร้างหน้าต่าง Now Loading ให้โผล่ขึ้นมาบอกว่า “โปรแกรมกำลังทำงานอยู่นะ” โปรแกรมของเราจะได้เป็นมิตรกับผู้ใช้มากขึ้น (user-friendly) ดีกว่า…

ต่อไปนี้เป็นวิธีสร้างหน้าต่าง Now loading แบบง่ายๆ โดยใช้ Threading เข้ามาช่วยนิดหน่อย ลองทำตามดูเลยก็ได้นะครับ

1. อันดับแรก ก็สร้างโปรเจคใหม่ขึ้น เป็นแบบ Windows Forms Application

2. ผมก็ออกแบบหน้าต่างหลัก ดังนี้ (เป็นโปรแกรมคำนวณลำดับเลข fibonacci ครับ)

มี button1 กับ listBox1 ครับ

3. สร้างหน้าต่างใหม่ ผมตั้งชื่อว่า ProgressForm (เป็นหน้าต่าง Now loading นั่นเองครับ)

ในหน้าต่างนี้ประกอบด้วย label 1 อันแสดงข้อความ Now Loading… และ progressBar โดยกำหนด คุณสมบัติของ progressBar ให้ Style เป็น Marquee และ MarqueeAnimationSpeed เป็น 50 (เพื่อให้ progressBar มันวิ่งไปเรื่อยๆ แบบตอนเราเปิดเครื่องคอมพิวเตอร์น่ะครับ)

4. กลับไปเขียนคำสั่งที่ฟอร์มแรกครับ

ผมเพิ่ม 1 function เอาไว้ใช้คำนวณค่าลำดับ Fibonacci ดังนี้ครับ

long fib(int n)
{
    if (n <= 2) return 1;
    return fib(n - 1) + fib(n - 2);
}

และเพิ่มคำสั่งในปุ่ม button1 ตามนี้ครับ

// เพิ่มโค้ดส่วนนี้ (อย่าลืม using System.Threading; ด้วยนะครับ)
Thread progressThread = new Thread(delegate()
{
    ProgressForm progress = new ProgressForm();
    progress.ShowDialog();
});
progressThread.Start();
 
// โค้ดที่ทำงานนานๆ
listBox1.Items.Clear();
for (int i = 1; i < 40; i++)
{
    listBox1.Items.Add(String.Format("fib({0}) = {1}", i, fib(i)));
    listBox1.SelectedIndex = listBox1.Items.Count - 1;
}
 
// เมื่อทำงานเสร็จแล้ว อย่าลืมเรียกคำสั่งนี้ (ปิดหน้าต่าง loading)
progressThread.Abort();

อ้ออย่าลืม ใส่ using System.Threading; ด้านบนของโปรแกรมด้วยนะครับ

หลักการทำงานก็คือ เมื่อเรากดปุ่ม button1 แล้ว เราจะสร้าง Thread ใหม่ขึ้นมา (progressThread) โดย Thread นี้ทำหน้าที่ แสดงหน้าต่าง ProgressForm ขึ้นมา หลังจากนั้น เราก็เขียนโค้ดตรงส่วนที่ต้องทำงานนานๆ (ในที่นี้คือโค้ดคำนวณลำดับ Fibonacci ซึ่งเขียนแบบ recursive จะได้ใช้เวลามากๆ) หลังจากที่ทำงานเสร็จแล้วเรา Abort Thread เพื่อปิดหน้าต่าง Now Loading ไป ครับ

เท่านี้เราก็สามารถสร้างหน้าต่าง Now loading แบบง่ายๆ ได้แล้วครับ จริงๆ แล้วถ้าเราจะทำหน้าต่าง Now loading ให้สมบูรณ์แบบ (เช่นแสดงสถานะเป็น percent หรือ มีปุ่ม cancel ในหน้าต่าง now loading) เราจำเป็นต้องเขียนโปรแกรมที่ซับซ้อนขึ้นกว่านี้อีกนิดหน่อยครับ (เอาเป็นว่าถ้าสนใจ ก็ทิ้ง comment ไว้นะครับ จะได้มาเขียนเพิ่มเติมครับ :D

อ้อ เกือบลืมไปครับ สำหรับใครที่…งงๆ ลองโหลดโค้ดโปรแกรมที่ใช้งานได้ไปดูก็ได้ครับ เขียนใน Microsoft Visual C# 2008 Express Edition ครับ

โค้ดโปรแกรม Now Loading (42kb)

Comments (5)

foolboySeptember 6th, 2008 at 12:01 am

ดีมากๆเลยครับ แต่ผมสงสัยว่าทำไมต้องสร้างเป็น Thread เหรอครับ ถ้าผมจะสั่งให้มันทำงานใน Process เดียวกับโปรแกรมแล้วให้ CPU จัดการ Interrupt เองจะได้หรือเปล่าครับ ขอบคุณครับ

[Reply]

nattsterSeptember 8th, 2008 at 12:02 pm

@foolboy ผมลองทำแบบไม่ใช้ thread แล้ว cpu จัดการ interrupt ได้ไม่ค่อยดีเท่าไหร่น่ะครับ (เท่าที่ลองนะครับ)

[Reply]

beginner.netSeptember 9th, 2008 at 2:22 pm

แล้วถ้าเวลาติดต่อกับฐานข้อมูลหรือว่าเขียนไฟล์หรืออ่านไฟล์ขึ้นมาจะทำเป็น
Loading อย่างนี้ต้องทำไงครับ

[Reply]

gimkimOctober 10th, 2008 at 4:33 pm

ว้าวๆขอบคุณครับใช้ดีมากมาย>.<

[Reply]

b4lmungJanuary 23rd, 2009 at 6:59 pm

ถ้าจะรันด้วยอะไรนานๆ มีอีกวิธีก็คือ แยกส่วนโค้ดที่ทำนานมากๆ ไปอีก Thread นึงเลย

เพราะจะทำให้ตัว Thread ที่รัน ตัว GUI อยู่ไม่ล่มไปด้วย

( จากความรู้ ชวา นะ… )

[Reply]

Leave a comment

Your comment