การเขียนโปรแกรมแบบมัลติเธรดภายใต้ DELPHI (1)
เรารู้ว่า win95 หรือ winNT เป็นทั้งระบบปฏิบัติการ "มัลติเธรด" ใน DELPHI 2.0 เราสามารถใช้ประโยชน์จากคุณสมบัตินี้อย่างเต็มที่และเขียนแอปพลิเคชัน "มัลติเธรด"
สำหรับผู้ที่เขียนโปรแกรมภายใต้ DOS หรือ Windows 16 บิตในอดีต "มัลติเธรด" ยังคงไม่คุ้นเคย แต่เมื่อเราเปลี่ยนจากงานเดียวภายใต้ DOS ไปเป็นมัลติทาสกิ้งภายใต้ Windows 3.1 ตอนนี้เราต้องทำการเปลี่ยนแปลงอีกครั้ง ในด้าน "มัลติเธรด" ยุคคอมพิวเตอร์มีการพัฒนาอยู่ตลอดเวลา อย่างไรก็ตาม โชคดีที่การเขียนโปรแกรมแบบมัลติเธรดภายใต้ DELPHI2.0 ไม่ต้องการให้เราเรียนรู้ฟังก์ชัน WIN32API ขนาดใหญ่ เราสามารถใช้ TThread คลาสแบบมัลติเธรดมาตรฐานภายใต้ DELPHI เพื่อทำงานของเราให้เสร็จสมบูรณ์
TThread เป็นคลาสนามธรรม กล่าวคือ ไม่จำเป็นต้องประกาศตัวแปรตาม TThread (และตัวแปรที่ประกาศตาม TThread นั้นไร้ประโยชน์โดยสิ้นเชิง) สิ่งที่เราต้องทำคือใช้ TThread เป็นคลาสพื้นฐานและสร้างมันขึ้นมา รูปแบบของคลาสย่อย ที่จริงแล้ว มันง่ายมากที่จะเขียนแอพพลิเคชั่นแบบมัลติเธรดโดยใช้ TThread
ต่อไปนี้เป็นคลาสแบบมัลติเธรดพื้นฐานที่สร้างขึ้นโดยการสืบทอด TThread
QuerThrd. ปาส
หน่วย QuerThrd;
อินเตอร์เฟซ
การใช้งาน
คลาส,DBTables;
พิมพ์
TQueryThreadคลาส(TThread)
ส่วนตัว
fQuery:tQuery;
ได้รับการคุ้มครอง
ProcedureExecute; แทนที่;
สาธารณะ
ConstructorCreate (ถูกระงับ: บูลีน; แบบสอบถาม: TQuery);
จบ;
การดำเนินการ
ตัวสร้าง
TQueryThread. สร้าง (ถูกระงับ: บูลีน; แบบสอบถาม: TQuery);
เริ่ม
สืบทอดสร้าง (ถูกระงับ);
fQuery: ΚQuery;
FreeOnTerminate:Κจริง;
จบ;
ขั้นตอน TQueryThread ดำเนินการ;
เริ่ม
เอฟคิวรี. เปิด;
จบ;
จบ.
ในตัวอย่างง่ายๆ ข้างต้น เราได้สร้างคลาสย่อย TQuery-Thread ของ TThread เพื่อดำเนินการสืบค้นฐานข้อมูลในเบื้องหลัง ในฟังก์ชัน Create ของคลาสนี้ พารามิเตอร์ Suspended และ Query สองตัวจะถูกส่งผ่าน โดยที่ Suspended ใช้เพื่อควบคุมการทำงานของเธรด หาก Suspend เป็นจริง เธรดของคลาส TQueryThread จะถูกระงับทันทีหลังจากถูกสร้างขึ้นจนกระทั่ง Resume วิธีการทำงาน เธรดจะดำเนินการต่อไป พารามิเตอร์ Query ใช้เพื่อยอมรับตัวควบคุม Query ที่มีอยู่ (ตัวควบคุม Query จริงในแบบฟอร์ม) เพื่อให้ทำงานในสถานการณ์แบบมัลติเธรด Execute เป็นกระบวนการที่สำคัญที่สุด เป็นส่วนการดำเนินการของคลาส TQueryThread คำสั่งทั้งหมดที่จำเป็นต้องรันในคลาสแบบมัลติเธรดนี้จะต้องเขียนในกระบวนการนี้
ในความเป็นจริง เมื่อสร้างคลาสแบบมัลติเธรดของคุณเอง คุณไม่จำเป็นต้องป้อนรหัสเหล่านี้ทั้งหมด เลือกตัวเลือกใหม่ภายใต้เมนูไฟล์ของ DELPHI จากนั้นเลือกโปรเจ็กต์ "TThreadObject" และ DELPHI จะสร้างโมดูลโปรแกรมพื้นฐานให้กับคุณ จากนั้นเราสามารถทำการแก้ไขตามความจำเป็นได้
การดำเนินการตามกระบวนการ:
สมมติว่าเราได้สร้างแบบฟอร์ม FORM1 ซึ่งมีตัวควบคุมแบบสอบถาม Query1 ที่เราจะใช้ จากนั้นเราเพิ่มหน่วย QuerThrd ที่เขียนด้านบนไปยังส่วน USES ของหน่วย
ขั้นตอนTForm1. Button1Click(ผู้ส่ง: TObject);
เริ่ม
{สร้างกระบวนการที่ทำงานอยู่}
TQueryThread. สร้าง (เท็จ Query1);
จบ;
ถ้ากระบวนการนี้ถูกดำเนินการ ตัวควบคุมแบบสอบถาม Query1 ในแบบฟอร์มจะเรียกใช้แบบสอบถามในสภาพแวดล้อมแบบมัลติเธรดโดยอัตโนมัติ โปรดทราบว่ามีเพียง Create เท่านั้นแต่ไม่ Free ในคลาส TQueryThread หลังจากสร้างคลาสแบบไดนามิกแล้วลืมลบ มันเป็นหนึ่งในข้อผิดพลาดที่เรามักทำ อย่างไรก็ตาม เนื่องจากเราได้ระบุ FreeOnTerminate (ลบหลังจากรัน) ว่าเป็นจริง ที่นี่ เมื่อดำเนินการคำสั่งใน Execute หลังจากเสร็จสิ้น การควบคุมหน่วยความจำที่ครอบครองโดยคลาส TQueryThread จะถูกปล่อยออกมาโดยอัตโนมัติ
อย่างไรก็ตาม มีอีกประเด็นหนึ่งที่ควรค่าแก่ความสนใจของเรา เนื่องจากสามารถทำงานหลายเธรดพร้อมกันได้ เราจึงต้องแก้ไขปัญหาการซิงโครไนซ์ด้วย หากไม่มีความสัมพันธ์กันระหว่างโปรแกรมแบบมัลติเธรดหลายโปรแกรม ก็จะไม่มีความสัมพันธ์กัน ความขัดแย้งใดๆ แต่ในความเป็นจริงแล้ว แอปพลิเคชันฐานข้อมูลแบบมัลติเธรดหลายตัวอาจทำงานพร้อมกัน เนื่องจากจำเป็นต้องใช้ทรัพยากรฐานข้อมูลเดียวกัน เราจึงต้องเพิ่มการควบคุม Tsession ให้กับ Query1
ในความเป็นจริง แม้ว่าเราอาจไม่ได้ใช้การควบคุมเซสชันเป็นการส่วนตัว แต่ในความเป็นจริง DELPHI จะสร้างการควบคุมเซสชันชั่วคราวโดยอัตโนมัติระหว่างการเข้าถึงฐานข้อมูลทั้งหมด และลบออกแบบไดนามิกหลังการใช้งาน ในการเขียนโปรแกรมฐานข้อมูลปกติ เราไม่จำเป็นต้องทำเอง แต่ในกรณีของการดำเนินการฐานข้อมูลแบบมัลติเธรด เพื่อไม่ให้ขัดแย้งกัน เราจะต้องปรับแต่งการควบคุมเซสชันของเราเองสำหรับการเข้าถึงฐานข้อมูลแต่ละรายการ ขั้นตอนนี้ง่ายมาก เราเพียงแต่ต้องเพิ่ม Session control ลงในแบบฟอร์ม จากนั้นจึงเขียนชื่อที่กำหนดเองลงในคุณสมบัติ "Sessionname" จากนั้นเขียนชื่อเดียวกันใน "Sessionname" ของ Query1 ด้วยวิธีนี้โปรแกรมฐานข้อมูลของเราจึงปลอดภัย
ปัญหาการซิงโครไนซ์อีกประเภทหนึ่งที่ต้องแก้ไขคือโปรแกรมที่ทำงานบนทรัพยากร VCL มีโปรแกรมดังกล่าวมากมาย แต่โชคดีที่วิธีแก้ปัญหาก็ง่ายมากเช่นกัน
เราสามารถดูโปรแกรมได้ดังนี้:
หน่วย BncThrd;
อินเตอร์เฟซ
การใช้งาน
WinProcs, คลาส, กราฟิก, ExtCtrls;
พิมพ์
TBounceThreadคลาส(TThread)
ส่วนตัว
FShape: TShape;
FXSpeed: จำนวนเต็ม;
FYความเร็ว: จำนวนเต็ม;
ขั้นตอน MoveShape;
ได้รับการคุ้มครอง
ProcedureExecute; แทนที่;
สาธารณะ
ConstructorCreate (ถูกระงับ: บูลีน รูปร่าง: TShape; XSpeed, YSpeed: จำนวนเต็ม);
คุณสมบัติรูปร่าง: TShaperreadFShape;
จบ;
การดำเนินการ
ขั้นตอนTBoad ย้ายรูปร่าง;
var
MaxHeight, MaxWidth: จำนวนเต็ม;
เริ่ม
ด้วยFShapedo
เริ่ม
ซ้าย: Κซ้าย+FXSpeed;
ด้านบน: ΚTop+FYSpeed;
ถ้า (ซ้ายΙ0) หรือ
(ซ้าย+ความกว้างΛParent.ความกว้าง)จากนั้น
FXSpeed: ΚFXSpeed*-1;
ถ้า (บนΙ0)หรือ
(บน+ความสูงΛพาร์ความสูง)จากนั้น
ปีงบประมาณ: Κปีงบประมาณ*-1;
บล็อกของผู้เขียน: http://blog.csdn.net/zou5655/