อ่าน 2 นาที
ข้อความวนซ้ำใน Microsoft Windows
ลู ปข้อความ เป็นส่วนของ โค้ด ที่จำเป็น ในทุก โปรแกรม ที่ใช้ ส่วนติดต่อผู้ใช้แบบกราฟิก ภายใต้ Microsoft Windows [ 1 ] โปรแกรม Windows ที่มี GUI เป็น แบบขับเคลื่อนด้วยเหตุการณ์...
ข้อความวนซ้ำใน Microsoft Windows
ลูปข้อความเป็นส่วนของโค้ด ที่จำเป็น ในทุกโปรแกรมที่ใช้ส่วนติดต่อผู้ใช้แบบกราฟิกภายใต้Microsoft Windows [ 1 ] โปรแกรม Windows ที่มีGUIเป็นแบบขับเคลื่อนด้วยเหตุการณ์ Windows จะรักษา คิวข้อความเฉพาะสำหรับแต่ละเธรดที่สร้างหน้าต่าง โดยปกติจะมีเพียงเธรดแรกเท่านั้นที่สร้างหน้าต่าง Windows จะวางข้อความลงในคิวนั้นเมื่อใดก็ตามที่มีกิจกรรมของเมาส์เกิดขึ้นบนหน้าต่างของเธรดนั้น เมื่อใดก็ตามที่มีกิจกรรมของแป้นพิมพ์เกิดขึ้นในขณะที่หน้าต่างนั้นมีโฟกัส และในเวลาอื่นๆ กระบวนการยังสามารถเพิ่มข้อความลงในคิวของตนเองได้ เพื่อรับอินพุตจากผู้ใช้ และด้วยเหตุผลอื่นๆ แต่ละเธรดที่มีหน้าต่างจะต้องดึงข้อความจากคิวอย่างต่อเนื่องและดำเนินการกับข้อความเหล่านั้น โปรแกรมเมอร์ทำให้กระบวนการทำเช่นนั้นโดยการเขียนลูปที่เรียก GetMessage (ซึ่งบล็อกข้อความและดึงข้อความนั้น) จากนั้นเรียก DispatchMessage (ซึ่งส่งข้อความ) และทำซ้ำไปเรื่อยๆ นี่คือลูปข้อความ โดยปกติจะมีลูปข้อความในโปรแกรมหลักซึ่งทำงานบนเธรด หลัก และลูปข้อความเพิ่มเติมในกล่องโต้ตอบแบบโมดอล ที่สร้างขึ้นแต่ละ รายการ ข้อความสำหรับทุกหน้าต่างของกระบวนการจะผ่านคิวข้อความและได้รับการจัดการโดยลูปข้อความ ลูปข้อความเป็น ลู ป เหตุการณ์ ชนิดหนึ่ง
ลูปการส่งข้อความพื้นฐานมีลักษณะดังนี้:
int WINAPI WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { MSG msg ; int bRet ;ในขณะที่( 1 ) { bRet = GetMessage ( & msg , NULL , 0 , 0 );ถ้า( bRet == -1 ) // ถ้า bRet เป็น -1 แสดงว่า GetMessage ล้มเหลว{ // จัดการหรือบันทึกข้อผิดพลาด อาจจะออกจากโปรแกรม// ... } else if ( bRet != 0 ) // ถ้า bRet ไม่ใช่ 0 หรือ -1 ข้อความจะต้องได้รับการประมวลผล{ TranslateMessage ( & msg ); DispatchMessage ( & msg ); } else // ถ้าbRet เป็น 0 ลูปข้อความควรออกจากโปรแกรม{ break ; } } return msg.wParam ; }ตามธรรมเนียมแล้ว event loop จะเรียกTranslateMessageเมธอด `translate` ทุกครั้งที่มีข้อความส่งมา ซึ่งสามารถแปลงการกดแป้นพิมพ์เสมือนเป็นสตริง ได้ การเรียกเมธอดนี้TranslateMessageไม่ใช่ข้อกำหนดทางเทคนิค แต่หากไม่เรียกอาจเกิดปัญหาได้ message loop ต้องเรียกเมธอด `translate` DispatchMessageด้วย
ลูปข้อความไม่ได้ดำเนินการกับข้อความที่จัดการโดยตรง แต่จะส่งต่อข้อความโดยการเรียกเมธอด ` DispatchMessagemessage-password` ซึ่งจะโอนข้อความไปยัง "ขั้นตอนการทำงานของหน้าต่าง" สำหรับหน้าต่างที่ข้อความนั้นถูกส่งไป ("ขั้นตอนการทำงานของหน้าต่าง" เป็น ขั้นตอนการทำงาน แบบเรียกกลับ (callback procedure) ซึ่งเชื่อมโยงกับคลาสหน้าต่างเมื่อทำการลงทะเบียน) (หน้าต่างมากกว่าหนึ่งหน้าต่างสามารถใช้ขั้นตอนการทำงานของหน้าต่างเดียวกันได้)
โค้ดสามารถส่งข้อความไปยังขั้นตอนการทำงานของหน้าต่างได้โดยตรง ข้อความเหล่านี้เรียกว่าข้อความที่ไม่ต้องรอคิว
การวนลูปข้อความอย่างเคร่งครัดไม่ใช่ทางเลือกเดียว โค้ดส่วนอื่นในโปรแกรมก็สามารถรับและส่งข้อความได้เช่นกันPeekMessageเป็นการเรียกแบบไม่บล็อกที่ส่งคืนทันที พร้อมข้อความหากมีข้อความรออยู่ หรือไม่ส่งข้อความหากไม่มีข้อความรออยู่WaitMessageอนุญาตให้เธรดพักการทำงานจนกว่าจะมีข้อความอยู่ในคิว
เฟรมเวิร์กส่วนติดต่อผู้ใช้แบบกราฟิกสมัยใหม่เช่นWindows Forms , Windows Presentation Foundation , MFC , Delphi , Qtและอื่นๆ ไม่จำเป็นต้องให้แอปพลิเคชันเขียนโค้ดสำหรับลูปข้อความของ Windows เพราะเฟรมเวิร์กเหล่านี้จะส่งต่อเหตุการณ์ต่างๆ เช่น การกดแป้นพิมพ์และการคลิกเมาส์ไปยังตัวจัดการที่เหมาะสมโดยอัตโนมัติ ตามที่กำหนดไว้ในเฟรมเวิร์ก อย่างไรก็ตาม แต่ละเฟรมเวิร์กจะมีการใช้งานลูปข้อความไว้ที่ใดที่หนึ่ง และโดยทั่วไปแล้วสามารถเข้าถึงหรือแทนที่ลูปข้อความได้เมื่อต้องการควบคุมโดยตรงมากขึ้น
ดูเพิ่มเติม
- Xlibสำหรับลูปเหตุการณ์ในระบบ X Window
ลิงก์ภายนอก
- การเดินทางฝ่าฟันเขาวงกตแห่งการกำหนดเส้นทางข้อความและคำสั่งของ MFC (MSJ, กรกฎาคม 1995)
- การเดินทางของปุ่มกด: เส้นทางของข้อความการกดแป้นพิมพ์ผ่าน VCL
- ชุดพัฒนาซอฟต์แวร์ (SDK) ของแพลตฟอร์ม: ข้อความและคิวข้อความ
- การใช้งานข้อความและคิวข้อความ (MSDN)
- ฟังก์ชัน GetMessage
- ฟังก์ชัน PeekMessage
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ข้อความวนซ้ำใน Microsoft Windows
ลู ปข้อความ เป็นส่วนของ โค้ด ที่จำเป็น ในทุก โปรแกรม ที่ใช้ ส่วนติดต่อผู้ใช้แบบกราฟิก ภายใต้ Microsoft Windows [ 1 ] โปรแกรม Windows ที่มี GUI เป็น แบบขับเคลื่อนด้วยเหตุการณ์...
ลิงก์ภายนอก
การเดินทางฝ่าฟันเขาวงกตแห่งการกำหนดเส้นทางข้อความและคำสั่งของ MFC (MSJ, กรกฎาคม 1995) การเดินทางของปุ่มกด: เส้นทางของข้อความการกดแป้นพิมพ์ผ่าน VCL ชุดพัฒนาซอฟต์แวร์ (SDK) ของแพลตฟอร์ม: ข้อความและคิวข้อความ การใช้งานข้อความและคิวข้อความ (MSDN) ฟังก์ชัน...