Windows จะทราบได้อย่างไรว่าโปรแกรมไม่ตอบสนอง แอปพลิเคชันที่ทำงานอยู่ทั้งหมดทำงานต่อเนื่องหรือไม่
Windows จะทราบได้อย่างไรว่าโปรแกรมไม่ตอบสนอง แอปพลิเคชันที่ทำงานอยู่ทั้งหมดทำงานต่อเนื่องหรือไม่
คำตอบ:
แอปพลิเคชันรับเหตุการณ์จากคิวที่ Windows จัดหาให้
หากแอปพลิเคชันไม่ได้สำรวจเหตุการณ์เป็นระยะเวลาหนึ่ง (5 วินาที) เช่นเมื่อทำการคำนวณแบบยาว Windows จะถือว่าแอพพลิเคชั่นหยุดทำงานและแจ้งเตือนผู้ใช้
เพื่อหลีกเลี่ยงการใช้งานที่ควรผลักดันการคำนวณที่มีราคาแพงไปยังเธรดผู้ปฏิบัติงานหรือแยกการประมวลผลและตรวจสอบให้แน่ใจว่าคิวได้รับการสำรวจเป็นประจำ
GetMessage
(หรือชอบ) DispatchMessage
และ
IsHungAppWindow
GetMessage
GetMessage
? คุณลักษณะดังกล่าวช่วยให้แอปบรรทัดคำสั่งง่าย ๆ ทำงานได้โดยไม่ต้องถูกระงับเนื่องจากไม่จำเป็นต้องสำรวจความคิดเห็นของคิว
หากไม่มีซอร์สโค้ดสำหรับ Windows เราไม่สามารถมั่นใจได้ว่ามันทำงานอยู่ภายใน
มีฟังก์ชั่น SDK Windows IsHungAppWindow
ที่สามารถใช้งานได้
แอปพลิเคชันจะถือว่าไม่ตอบสนองหากไม่รออินพุตไม่ได้อยู่ในการประมวลผลเริ่มต้นและไม่ได้เรียกว่าPeekMessageภายในระยะเวลาหมดเวลาภายใน 5 วินาที
ฟังก์ชัน Source IsHungAppWindow
หากหน้าต่างระดับบนสุดไม่ตอบสนองต่อข้อความนานกว่าหลายวินาทีระบบจะถือว่าหน้าต่างไม่ตอบสนอง ในกรณีนี้ระบบจะซ่อนหน้าต่างและแทนที่ด้วยหน้าต่างผีที่มีลำดับ Z, สถานที่, ขนาดและคุณลักษณะด้านภาพเหมือนกัน สิ่งนี้ทำให้ผู้ใช้สามารถย้ายปรับขนาดหรือแม้แต่ปิดแอปพลิเคชัน อย่างไรก็ตามสิ่งเหล่านี้เป็นเพียงการดำเนินการที่มีอยู่เนื่องจากแอปพลิเคชันไม่ตอบสนอง
แหล่งที่มาเกี่ยวกับข้อความและคิวข้อความ
ไม่แอปพลิเคชันไม่ได้รับการโพล แต่ให้เวลาตัวประมวลผล
Windows มีระบบการตั้งเวลาที่ให้เวลาตัวประมวลผลกับเธรดแอปพลิเคชัน
วิธีการตั้งเวลามีความซับซ้อนและมีคำอธิบายอย่างเต็มที่ในการใช้ Windows Internals ส่วน 1 (6th Edition) (อ้างอิงที่ผู้พัฒนา)
PeekMessage
ที่มีมากขึ้นเช่นรอจับบนหน้าต่างเป็นสัญญาณเมื่อคุณเรียก ดังนั้นเมื่อ Windows ส่งข้อความไปยังแอปพลิเคชันและไม่ได้รับสัญญาณภายในห้าวินาทีมันจะทำเครื่องหมายแอปพลิเคชันว่าไม่ตอบสนอง และในความเป็นจริงใน Windows ล่าสุดหน้าต่างจะมีเครื่องหมาย "ไม่ตอบสนอง" เท่านั้นหากไม่ตอบสนองต่อการป้อนข้อมูลของผู้ใช้ทันเวลา - จนกว่าฉันจะพยายามคลิกหรือกดปุ่มหรือบางสิ่งบางอย่าง นาทีโดยที่ "ไม่ปรากฏ" ไม่ตอบสนอง
ที่จริงแล้ว Windows ไม่รู้เสมอว่าแอปพลิเคชันไม่ตอบสนอง แอปพลิเคชันจะต้องเป็นแอปพลิเคชันแบบโต้ตอบที่มีหน้าต่างและหน้าต่างจะต้องได้รับข้อความว่าแอปพลิเคชันไม่สามารถดำเนินการได้ก่อนที่ Windows จะสรุปว่าแอปพลิเคชันไม่ตอบสนอง
ยกตัวอย่างเช่น Windows ไม่มีทางรู้ได้ว่าแอปพลิเคชันที่มีตัวเลขเป็นตัวเลขที่ไม่มีส่วนต่อประสานผู้ใช้ที่รันจากบรรทัดคำสั่งกำลังทำสิ่งนั้นอยู่หรืออาจติดอยู่ในวงวนไม่สิ้นสุด
แอปพลิเคชั่นกราฟิกเชิงโต้ตอบใน Windows รับเหตุการณ์โดยการสำรวจคิวข้อความอย่างต่อเนื่อง Windows เติมคิวข้อความนี้ด้วยแป้นพิมพ์เมาส์ตัวจับเวลา ฯลฯ กิจกรรม หากแอปพลิเคชันไม่สามารถสำรวจคิวข้อความในบางครั้ง (5 วินาทีคือการหมดเวลาที่ระบุไว้ในเอกสารประกอบฟังก์ชั่น IsHungAppWindow ()) Windows จะพิจารณาแอปพลิเคชัน "หยุด" ซึ่งอาจระบุได้โดยเปลี่ยนชื่อหน้าต่าง (เพิ่มข้อความ) (ไม่ตอบสนอง) "หรือข้อความเทียบเท่าในเวอร์ชันที่แปลเป็นภาษาท้องถิ่น) และทำให้เนื้อหาของหน้าต่างเป็นสีเทาหากผู้ใช้พยายามที่จะโต้ตอบกับหน้าต่าง
แอปพลิเคชันสามารถแขวนในลักษณะที่ Windows ไม่รู้จัก ตัวอย่างเช่นแอปพลิเคชันอาจทำการสำรวจความคิดเห็นต่อข้อความในคิวข้อความโดยไม่ดำเนินการกับมันอย่างถูกต้องดังนั้นสำหรับทุกความตั้งใจและจุดประสงค์ที่ใช้งานได้จริงจะปรากฏเป็น "หยุด" โดยที่ Windows ไม่ยอมรับว่ามันไม่ตอบสนอง
Windows เป็นระบบปฏิบัติการดูแลการใช้งานโปรแกรมทั้งหมด
Windows สื่อสารกับแอปพลิเคชันที่ใช้หน้าต่างโดยใช้กิจกรรม ทุกโปรแกรมมีเธรดที่คอยฟังเหตุการณ์ที่เข้ามาอย่างต่อเนื่องและประมวลผล ตัวอย่างเช่นเมื่อคุณคลิกปุ่มหรือไอคอนพื้นที่แจ้งเตือน Windows จะสร้างเหตุการณ์และป้อนเข้าสู่กระบวนการที่เหมาะสม กระบวนการสามารถตัดสินใจได้ว่าจะจัดการกับมันอย่างไร
การโต้ตอบกับโปรแกรมทั้งหมดเป็นไปตามเหตุการณ์ใน Windows ดังนั้นเมื่อโปรแกรมไม่ประมวลผลเหตุการณ์ขาเข้านานเกินไปหมายความว่าไม่ตอบสนอง ตามที่ @DavidPostill ได้พบและจดบันทึกไว้ในคำตอบของเขาการหมดเวลาคือ 5 วินาที PeekMessage
เป็นฟังก์ชันที่รับเหตุการณ์จากคิวเหตุการณ์
คำตอบสำหรับคำถามของคุณคือใช่ / ไม่ใช่
ในขณะที่ระบบปฏิบัติการ Windows สามารถและทำการสำรวจความคิดเห็นของแอปพลิเคชั่นที่มีเหตุการณ์ใน Windows Messaging Queue โปรแกรมต่าง ๆ ไม่มีภาระผูกพันที่จะเชื่อมโยงไปยัง WinAPI หรือจัดการ / ตอบคิว Windows แม้แต่การตอบข้อความใน Queue ก็ไม่ได้บอก Windows ว่าโปรแกรมนั้น "ถูกล็อก" หรือไม่ มันเป็นตัวบ่งชี้ แต่นั่นคือทั้งหมดที่มันเป็น คำตอบที่แท้จริงนั้นค่อนข้างซับซ้อนกว่าเล็กน้อย
คำตอบที่แท้จริง
ผู้คนกำลังป้องกันความเสี่ยงรอบคำตอบจริงที่นี่ การพิจารณาว่าโปรแกรม "ไม่ตอบสนอง" เป็นตัวแปรของ " ปัญหาการหยุดทำงาน " ซึ่งไม่สามารถระบุได้อย่างเป็นทางการในสาขาวิทยาศาสตร์คอมพิวเตอร์ คำอธิบายสั้น ๆ คือตัวประมวลผลไม่สามารถทำหน้าที่เป็นบุคคลที่สามที่สังเกตตัวเองเพื่อตรวจสอบว่ารูทีนย่อยติดอยู่ในลูปไม่สิ้นสุดไม่ทำอะไรเลยเทียบกับการเพิ่มตัวนับที่จะสิ้นสุดที่หมายเลขปกติคงที่ ทั้งสองอย่างนี้ถือเป็นการปิดลูปให้แน่น หนึ่งหยุดอีกอันจะไม่มีวันหยุด แม้ว่าคุณจะเป็นคนที่ไม่รู้ว่าโปรแกรมกำลังตอบสนองจริงหรือไม่โดยเฉพาะอย่างยิ่งถ้ามันอยู่ในวงปิดที่แน่นหนา - คุณจะรู้ว่าคิดว่ามันควรจะ (ตอบสนอง)
จากมุมมองของ Windows' ทั้งของลูปเหล่านี้จะ'ไม่ตอบ' นั่นเป็นสาเหตุที่ windows ให้คุณเลือกที่จะรอหรือยกเลิกเพราะมันไม่สามารถบอกได้
ดังนั้นข้อพิสูจน์คือ "ทำไมหน้าต่างรู้ว่ากระบวนการที่จะตอบสนอง?" คำตอบนั้นค่อนข้างฉลาด เมื่อกระบวนการถูกรวบรวมในระบบปฏิบัติการแบบมัลติเธรดและหลายขั้นตอนบางครั้งแม้ในลูปที่ปิดอย่างแน่นหนาคอมไพเลอร์อาจเพิ่มคำสั่งyield ()ซึ่งให้การแจ้งเตือนที่สะดวกต่อโปรเซสเซอร์ซึ่งสามารถสลับไปยังกระบวนการทำงานอื่น ๆ . มัน "ยอมแพ้" ตัวประมวลผลและ "บริบทสลับ" (ตามที่เรียกว่า) เกิดขึ้นที่ช่วยให้ระบบปฏิบัติการ (รวม Windows) เพื่อตอบกิจกรรมอื่น ๆ ในกองซึ่งบางอย่างรวมถึงการติดตามว่ากระบวนการได้ตอบสนอง
** นี้ไม่ได้หมายความว่ากระบวนการการตอบสนองจะยุติ ** กระบวนการภายในวงวนไม่สิ้นสุดสามารถให้หน่วยประมวลผลกลางทำให้ Windows สามารถประมวลผลเหตุการณ์อื่น ๆ ได้
ในบางโปรแกรมของ windows โปรแกรมจะจัดการสัญญาณ Windows OS ซึ่งสามารถบอกระบบปฏิบัติการว่าเป็น "การตอบสนอง" แต่ไม่มีโปรแกรมใดที่มีภาระผูกพันในการทำเช่นนั้น คุณสามารถเขียน CPU hogging ค่อนข้างง่ายโปรแกรมที่ไม่สิ้นสุดแม้ในภาษาระดับสูงกว่าใน Windows เช่น perl, php, python และ Windows อาจตรวจไม่พบว่ามันไม่ได้หยุดและไม่ตอบสนอง ณ จุดนั้น Windows ขึ้นอยู่กับฮิวริสติกส์ - โหลดซีพียู, หน่วยความจำ, จำนวนโปรเซสเซอร์ขัดจังหวะในขณะที่โปรแกรมกำลังทำงานเพื่อ "เดา" อีกครั้ง ณ จุดนั้น Windows จะต้องขอให้คุณยุติเพราะมันไม่รู้ว่าควรจะจริงหรือไม่
ดูคำตอบของ Viktor (ถูกต้อง) ด้วย ละเว้นความคิดเห็นเกี่ยวกับว่า "ไม่ตอบสนอง" ไม่เหมือนกับลูปแบบไม่สิ้นสุด มีข้อความขัดจังหวะลูปทุกชนิดที่แอปพลิเคชั่นอาจจัดการหรือไม่จัดการโดยไม่แจ้งคิวข้อความ Windows การจัดการคิวข้อความเป็นเพียงหนึ่งในหลาย ๆ เหตุการณ์ที่ระบบปฏิบัติการยังคงเคาน์เตอร์เพื่อพยายามเดาว่ากระบวนการหยุดทำงานหรือไม่