ฟังก์ชั่นการโทรกลับและการใช้งาน
1 ภาพรวมของฟังก์ชันการโทรกลับ
ฟังก์ชันการโทรกลับเป็นกลไกที่ผู้เรียกส่งผ่านพารามิเตอร์บางตัวไปยังวัตถุเมื่อเริ่มต้นวัตถุ (วัตถุในที่นี้หมายถึงวัตถุใน OOP ฟังก์ชันส่วนกลาง ฯลฯ ) และในขณะเดียวกันก็ส่งผ่านฟังก์ชันที่ผู้เรียกสามารถเข้าถึงได้ ที่อยู่ถูกส่งผ่านไปยังวัตถุ ฟังก์ชันนี้เป็นข้อตกลงการแจ้งเตือนระหว่างผู้โทรและผู้โทร เมื่อมีเหตุการณ์ที่ตกลงกันไว้ ผู้โทร (โดยปกติจะรวมถึงเธรดที่ทำงานด้วย) จะเรียกใช้ฟังก์ชันตามที่อยู่ของฟังก์ชันโทรกลับ
ด้วยวิธีนี้ ผู้เรียกจะอยู่ในเธรดหนึ่ง และผู้เรียกจะอยู่ในอีกเธรดหนึ่ง ข้อความ: ข้อความยังถือเป็นรูปแบบหนึ่งของการโทรกลับ เนื่องจากผู้โทรส่งข้อความไปยังผู้โทรในระหว่างการเริ่มต้นด้วย หมายเลขอ้างอิงและหมายเลขข้อความ ผู้โทรจะส่งข้อความไปยังผู้โทรเมื่อเกิดเหตุการณ์ที่ตกลงกันไว้
ด้วยวิธีนี้ ผู้เรียกจะอยู่ในเธรดหลัก และผู้เรียกจะอยู่ในเธรดหลักหรือเธรดของผู้ปฏิบัติงาน โมเดลเหตุการณ์ Delphi:
มีองค์ประกอบภาพมากมายใน VCL ของ Delphi ที่ใช้โมเดลเหตุการณ์ เช่น เหตุการณ์ OnCreate ของ TForm หลักการคือ: ระบุฟังก์ชันเหตุการณ์ ณ เวลาออกแบบ และเมื่อเหตุการณ์ถูกทริกเกอร์ ณ รันไทม์ ฟังก์ชันเหตุการณ์ที่ระบุ ณ เวลาออกแบบจะถูกเรียก . โดยกลไกแล้ว โมเดลเหตุการณ์ Delphi จะเหมือนกับการโทรกลับ อย่างไรก็ตาม มีความแตกต่างบางประการในรูปแบบเฉพาะ ฟังก์ชัน callback แท้จะอยู่ในรูปแบบของฟังก์ชันส่วนกลาง ในขณะที่เหตุการณ์ Delphi อยู่ในรูปแบบของวิธีอ็อบเจ็กต์ กล่าวคือ สามารถกำหนดประเภทฟังก์ชันการโทรกลับต่อไปนี้ได้: TCallBackFunc = PROcedure (pData: ตัวชี้) ของวัตถุ;
2 คำแนะนำในการใช้ฟังก์ชันโทรกลับ
ฟังก์ชันการโทรกลับส่วนใหญ่จะใช้ในสองสถานการณ์ ประการแรกคือ Windows API บางตัวต้องการฟังก์ชันการโทรกลับเป็นที่อยู่พารามิเตอร์ และฟังก์ชันที่สองคือฟังก์ชันที่ผู้ใช้กำหนดในบางโอกาสต้องใช้ฟังก์ชันการโทรกลับเป็นที่อยู่พารามิเตอร์ สำหรับฟังก์ชันที่ผู้ใช้กำหนด โดยทั่วไปจะใช้เมื่อเรียกใช้ฟังก์ชันในไลบรารีลิงก์แบบไดนามิก มีหลายขั้นตอนหลักสำหรับการใช้ฟังก์ชัน callback: 1. การกำหนดประเภทฟังก์ชัน callback ไม่แตกต่างจากคำจำกัดความของกระบวนการฟังก์ชันทั่วไป แต่คำจำกัดความต้องเป็นไปตามข้อกำหนดฟังก์ชันของฟังก์ชัน callback ตามต้องการ ข้อแตกต่างเพียงอย่างเดียวคือ ใน คำจำกัดความของฟังก์ชันหรือขั้นตอนต้องตามด้วยการประกาศว่าเป็นการเรียกมาตรฐานของ Windows ตัวอย่างเช่น: typeTHDFunction= function(I:integer;s:string):integer; THDProcedure=ขั้นตอน (s:สตริง); stdcall;2. จากนั้นกำหนดฟังก์ชันหรือกระบวนการที่เกี่ยวข้องตามต้นแบบนี้ ไม่มีข้อกำหนดสำหรับชื่อของฟังก์ชันหรือกระบวนการนี้ ประเภทของพารามิเตอร์ของฟังก์ชันและประเภทของค่าที่ส่งคืนจะต้องสอดคล้องกับการเรียกกลับที่กำหนดไว้อย่างสมบูรณ์ ประเภทฟังก์ชัน สำหรับขั้นตอน จะต้องเป็นประเภทพารามิเตอร์เดียวกันเท่านั้น ตัวอย่าง: กำหนดฟังก์ชันที่สอดคล้องกันและกระบวนการที่สอดคล้องกันโดยยึดตามต้นแบบของฟังก์ชันและกระบวนการข้างต้น คำจำกัดความของฟังก์ชันต้นแบบ: ฟังก์ชัน HdFunExample(k:integer,sExam:string):integer; stdcall; คำจำกัดความของกระบวนการ: ขั้นตอน HdProExample(sExam:string);stdcall; จำนวนเต็ม sExam: string): จำนวนเต็ม; stdcall; BeginEnd; ขั้นตอน HdProExample(sExam:string);stdcall;beginend; 4. กระบวนการเรียกกลับโดยทั่วไปจะใช้เป็นที่อยู่รายการของฟังก์ชันบางอย่างในระบบ ตามต้นแบบของฟังก์ชันการเรียก: ฟังก์ชัน: ฟังก์ชัน DyHdFunExample(HdFun:THDFunction;I: จำนวนเต็ม):boolean; ในฟังก์ชันการโทร สามารถเรียกใช้ฟังก์ชันการโทรกลับได้โดยตรงโดยการประมวลผลตัวชี้ฟังก์ชัน (นั่นคือ พารามิเตอร์ในฟังก์ชันการโทรคือพารามิเตอร์ประเภทฟังก์ชันการโทรกลับ และดำเนินการโดยตรง) เพื่อให้ฟังก์ชันการโทรกลับดำเนินการบางอย่าง นั่นคือฟังก์ชันของฟังก์ชันการโทรกลับถูกนำมาใช้ในฟังก์ชันการโทร โทร: varI:integer;beginI:=DyHdFunExample(@HdFunExample,i);//…….End;
3 ตัวอย่าง
โปรแกรมตัวอย่างอยู่ภายใต้ไดเร็กทอรี H:/callback function example/ การใช้ฟังก์ชันการโทรกลับส่วนใหญ่อยู่ในฟังก์ชัน API ดั้งเดิมของ Windows แต่โดยทั่วไปฟังก์ชันการโทรที่ผู้ใช้กำหนดจะอยู่ในไลบรารีลิงก์แบบไดนามิก โดยทั่วไปไม่จำเป็นต้องใช้ฟังก์ชันโทรกลับในโปรเจ็กต์เดียวกัน (ส่วนตัวคิดว่า)...