เมื่อเขียนแอปพลิเคชันแบบมัลติเธรด สิ่งที่สำคัญที่สุดคือการควบคุมการเข้าถึงทรัพยากรที่ซิงโครไนซ์ระหว่างเธรดเพื่อให้แน่ใจว่าเธรดทำงานอย่างปลอดภัย Win 32 API จัดเตรียมชุดของออบเจ็กต์การซิงโครไนซ์ เช่น Semaphore, Mutex, Critical Section, Event ฯลฯ เพื่อแก้ไขปัญหานี้
Delphi สรุปวัตถุเหตุการณ์และวัตถุส่วนวิกฤตไว้ในวัตถุ Tevent และวัตถุ TcriticalSection ตามลำดับ ทำให้การใช้วัตถุทั้งสองนี้ง่ายและสะดวก อย่างไรก็ตามหากคุณต้องการใช้วัตถุเช่นเซมาฟอร์หรือ mutexes ในโปรแกรม Delphi คุณต้องหันไปใช้ฟังก์ชัน Win32 API ที่ซับซ้อนซึ่งไม่สะดวกมากสำหรับโปรแกรมเมอร์ที่ไม่คุ้นเคยกับฟังก์ชัน Win32 API ดังนั้น ผู้เขียนจึงใช้ Delphi เพื่อสร้างคลาสสองคลาสเพื่อห่อหุ้มออบเจ็กต์เซมาฟอร์และมิวเท็กซ์ (TSemaphore และ TMutex ตามลำดับ) โดยหวังว่าจะเป็นประโยชน์กับโปรแกรมเมอร์ Delphi ส่วนใหญ่
1. โครงสร้างชั้นเรียน
ขั้นแรกเราจะสรุปออบเจ็กต์เซมาฟอร์และออบเจ็กต์ mutex ของ Win32 API สร้างคลาสพาเรนต์ THandleObjectEx จากนั้นรับคลาสย่อยสองคลาส Tsephore และ Tmutex จากคลาสพาเรนต์นี้
ซอร์สโค้ดของคลาสมีดังนี้:
หน่วย SyncobjsEx;
อินเตอร์เฟซ
ใช้ Windows, ข้อความ, SysUtils, คลาส, Syncobjs;
พิมพ์
THandleObjectEx = คลาส (THandleObject)
// THandleObjectEx เป็นคลาสพาเรนต์ของคลาสการยกเว้นร่วมกันและคลาสเซมาฟอร์
ป้องกันแล้ว
FHandle: THandle;
FLastError: จำนวนเต็ม;
สาธารณะ
destructor ทำลายล้าง;
ขั้นตอนการปล่อย; แทนที่;
ฟังก์ชั่น WaitFor (หมดเวลา: DWord): TWaitResult;
คุณสมบัติ LastError:Integer อ่าน FLastError;
คุณสมบัติจัดการ: THandle อ่าน FHandle;
จบ;
TMutex = class(THandleObjectEx)//คลาสที่ไม่เกิดร่วมกัน
สาธารณะ
ตัวสร้างสร้าง (MutexAttributes: PSecurityAttributes; InitialOwner: Boolean; const Name: string);
แทนที่ขั้นตอน;
จบ;
TSemaphore = คลาส (THandleObjectEx)
//คลาสไฟสัญญาณ
สาธารณะ
ตัวสร้างสร้าง (SemaphoreAttributes: PSecurityAttributes;InitialCount:Integer;MaximumCount: integer; const Name: string);
ขั้นตอนการปล่อย (ReleaseCount: Integer=1;PreviousCount:Pointer=nil);