ไลบรารี C ++ ที่ให้ฟังก์ชั่นของลูปเหตุการณ์เพื่อประมวลผลกิจกรรมทันทีและกำหนดเวลาสำหรับแอปพลิเคชันที่ขับเคลื่อนด้วยเหตุการณ์
เหตุการณ์ลูปประมวลผลเหตุการณ์เพื่อแจ้งตัวรับสัญญาณที่ลงทะเบียนโดยเลือกด้วยข้อมูล
คุณสามารถใช้ลูปเหตุการณ์เพื่อบล็อกเธรดปัจจุบันสำหรับการประมวลผลเหตุการณ์หรือเป็นเธรดอิสระที่ปล่อยให้เธรดปัจจุบันฟรีสำหรับงานอื่น ๆ
หมายเหตุ: ไลบรารีนี้มีเฟรมเวิร์กสำหรับกระบวนการเหตุการณ์หลายเธรดภายในกระบวนการเดียวกันโดยไม่มีความสามารถ IPC ใด ๆ
EventLoop::Mode::BLOCK โหมดการวนซ้ำเหตุการณ์นี้จะบล็อกเธรดปัจจุบัน (โดยปกติจะเป็นเธรดหลัก) โดยที่ EventLoop::Run() มีการโทรออก
เธรดปัจจุบันจะดำเนินการประมวลผลกิจกรรมต่อไปตราบใดที่ลูปกำลังทำงานอยู่
EventLoop::Mode::NON_BLOCK โหมดนี้จะเรียกใช้ลูปเหตุการณ์ในเธรดอื่นซึ่งจะป้องกันเธรดปัจจุบันที่ EventLoop::Run() การโทรออกจากการถูกบล็อก
สิ่งนี้สามารถพิสูจน์ได้ว่ามีประโยชน์เมื่อเธรดปัจจุบันต้องไปถึงการดำเนินการบางอย่างหลังจากเริ่มลูปเหตุการณ์ในเธรดเดียวกันหรือถ้าใช้ลูปเหตุการณ์บล็อกของตัวเองแล้ว ตัวอย่างของหลังสามารถเป็น QGuiApplication::exec() การโทรซึ่งบล็อกเธรดหลักและเริ่มการประมวลผลเหตุการณ์
นั่นทำให้เกิดคำถามที่สำคัญ: ทำไมต้องวนรอบเหตุการณ์ที่สองเมื่อมีคำถามหลักเช่น exec() อยู่แล้ว?
ฉันไม่รู้เกี่ยวกับคุณ แต่ฉันพลาดคุณสมบัติบางอย่างในลูปเหตุการณ์ของ QT เช่นความสามารถในการถ่ายทอดสัญญาณไปยังผู้รับทุกคนที่ลงทะเบียน/สมัครสมาชิก นี่คือแรงจูงใจหลักในการพัฒนาห้องสมุดลูปเหตุการณ์ตั้งแต่เริ่มต้นนอกเหนือจากคนอื่น ๆ เช่นความอยากรู้อยากเห็นที่ไม่รู้จักพอของฉันสำหรับการทำงานของสิ่งต่าง ๆ และคันสำหรับ dogfooding!
การออกอากาศเป็นสิ่งสำคัญอย่างยิ่งเมื่อคุณต้องการส่วนประกอบหลายอย่างของแอปพลิเคชันเพื่อดำเนินการกับสิ่งเร้าเดียวโดยไม่ต้องเชื่อมต่อตัวรับสัญญาณแต่ละตัวกับผู้ส่งผู้ส่ง ขอให้โชคดีส่งผ่านอินสแตนซ์ของผู้ส่งไปยังผู้ตอบกลับหลายรายและสร้างการเชื่อมต่อสล็อตสัญญาณสำหรับแต่ละรายการเพื่อเปิดใช้งานการรับออกอากาศใน QT!
อีกเหตุผลที่มั่นคงคือการสร้างระบบประมวลผลเหตุการณ์ทั่วโลกสำหรับแอปพลิเคชันทั้งหมดโดยไม่ต้องอ้างอิงใด ๆ กับผู้ให้บริการกิจกรรมหรือผู้ส่งและรับสัญญาณที่เกี่ยวข้องเพื่อลงทะเบียนและเรียกเหตุการณ์ EventLoop เป็นคลาสคงที่แบบสแตนด์อโลนที่มีวิธีการคงที่ช่วยให้นักพัฒนาสามารถออกการเรียก API จากเธรดใด ๆ อย่างแน่นอนทุกที่ในรหัสซึ่งแตกต่างจากใน QT ที่จัดการของผู้ส่งและตัวรับสัญญาณจะต้องสร้างการเชื่อมต่อและสัญญาณปล่อยสัญญาณ
ในฐานะผู้ใช้คุณสามารถเชื่อมโยงไลบรารีลูปเหตุการณ์ไปยังแอปพลิเคชันของคุณแบบไดนามิกและรวมส่วนหัวของ EventLoop.h ในรหัสแอปพลิเคชันของคุณเพื่อเข้าถึงวิธีไลบรารี เนื่องจากเรากำลังใช้ Event Event.h ประเภทที่กำหนดเองเพื่อส่งมอบและรับกิจกรรมด้วยชื่อและข้อมูล
หมายเหตุ: อย่ารวมส่วนหัวอื่น ๆ จากไดเรกทอรี รวม ของโครงการนี้นอกเหนือจากที่กล่าวถึงข้างต้นเมื่อใช้ห้องสมุดในแอปพลิเคชันของคุณ อีกวิธีหนึ่งที่ต้องจำไว้คือคุณต้องการไฟล์ส่วนหัว
.hสำหรับแอปของคุณเท่านั้นและไฟล์.hppทั้งหมดสามารถละเว้นได้
เอกสาร API โดยละเอียดสามารถพบได้ในส่วนหัว EventLoop.h ขั้นตอนต่อไปนี้แสดงให้เห็นถึงการใช้ลูปเหตุการณ์ที่เป็นไปได้ในแอปพลิเคชันของคุณ:
main() ของโปรแกรมของคุณโทร EventLoop::SetMode() หากคุณต้องการให้ลูปไม่ปิดกั้น ไม่จำเป็นต้องเรียกสิ่งนี้อย่างชัดเจนสำหรับโหมดการบล็อกเพราะนั่นคือโหมดเริ่มต้นEventLoop::Run() Method in main() ที่คุณต้องการให้ลูปเหตุการณ์เริ่มต้นและ/หรือบล็อกEvent* ในคลาสหรือไฟล์ต้นทางใด ๆ ด้วย EventLoop::RegisterEvent() ที่คุณต้องการได้รับแจ้งสำหรับกิจกรรม โดยปกติแล้วการลงทะเบียนจะทำในตัวสร้างคลาสที่มีฟังก์ชั่นแลมบ์ดาสหรือสมาชิกในชั้นเรียนเป็นตัวจัดการEventLoop::TriggerEvent() และตัวจัดการที่เกี่ยวข้องซึ่งลงทะเบียนสำหรับชื่อเหตุการณ์เฉพาะจะถูกเรียกใช้ทันทีหรือหลังหมดเวลาขึ้นอยู่กับประเภทของการโอเวอร์โหลดที่ใช้Event Event::getName() และ Event::getData() วิธีการEventLoop::Halt() วิธีนี้สามารถเรียกได้จากเธรดใด ๆ ในโหมดทั้งสอง หากเรียกว่าภายในตัวจัดการที่ลงทะเบียนจะมีผลเฉพาะเมื่อเสร็จสิ้นขอบเขตของตัวจัดการเคล็ดลับ: หากคุณวางแผนที่จะใช้
EventLoopบนexec()Exec () ตั้งค่า Non-BlockingEventLoop::Run()ก่อนการexec()การโทรและEventLoop::Halt()จะถูกเรียกใช้ในการออกQGuiApplication::aboutToQuit
QObject::connect(&app, &QGuiApplication::aboutToQuit, []{ EventLoop::Halt(); });
หมายเหตุ: รหัสใด ๆ หลังจากการปิดกั้น
EventLoop::Run()การโทรในเธรดเดียวกันจะไม่ดำเนินการจนกว่าลูปเหตุการณ์จะหยุดลงเนื่องจากEventLoop::Run()บล็อกเธรดปัจจุบันไปยังกิจกรรมกระบวนการโดยการออกแบบ
แอพตะกร้าสินค้าทำหน้าที่เป็นข้อมูลอ้างอิงการใช้งานของห้องสมุดและ API นี้ ในกรณีที่มีคำถามหรือคำชี้แจงใด ๆ คุณสามารถติดต่อฉันได้ที่ [email protected]
ตรวจสอบการเปิดตัวที่เสถียรล่าสุดของไลบรารีภายใต้ Releases แต่ถ้าคุณต้องการสร้างไลบรารีจากแหล่งที่มาด้วยเวอร์ชันซอร์สโค้ดปัจจุบันให้เรียกใช้สคริปต์ build.sh
สคริปต์สามารถทำงานได้โดยไม่มีตัวเลือกใด ๆ ค่าเริ่มต้นสำหรับแต่ละตัวเลือกจะปรากฏใน {} ในคำสั่งการใช้งาน เรียนรู้เกี่ยวกับการใช้สคริปต์โดยเรียกใช้คำสั่งต่อไปนี้
./build.sh -h
ตัวอย่างเช่นหากคุณต้องการใช้สคริปต์เพื่อสร้างโหมดการเปิดตัวด้วยตัวสร้าง Unix Makefiles CMake สคริปต์สามารถดำเนินการได้ดังนี้
./build.sh -a -r -g "Unix Makefiles"
การสร้างสิ่งประดิษฐ์จะถูกสร้างขึ้นในไดเรกทอรี build
สิ่งประดิษฐ์เอาท์พุทจะมีอยู่ในไดเรกทอรี lib เป็น libEventLoop.so ซึ่งสามารถเชื่อมโยงเพิ่มเติมหรือย้ายไปยังปลายทางเป้าหมายของคุณ
คุณยินดีที่จะมีส่วนร่วมในโครงการหากคุณคิด
ในฐานะผู้สนับสนุนที่มีศักยภาพคุณสามารถทำได้
อย่าลืมติดต่อฉันในกรณีที่มีคำถามหรือคำแนะนำใด ๆ [email protected]