Windows จะทราบได้อย่างไรว่าโปรแกรมไม่ตอบสนอง


174

Windows จะทราบได้อย่างไรว่าโปรแกรมไม่ตอบสนอง แอปพลิเคชันที่ทำงานอยู่ทั้งหมดทำงานต่อเนื่องหรือไม่



@ magicandre1981 หน้านั้นเสนอวิธีหนึ่งในการตรวจสอบว่าโปรแกรมกำลังทำอะไรบางอย่าง แต่ไม่ใช่วิธีที่ Windows ใช้จริง
Kevin Panko

ดูคิวข้อความของ Windows ผู้สมัครคือฟังก์ชั่น PeekMessage ()
Luciano

คำตอบ:


150

แอปพลิเคชันรับเหตุการณ์จากคิวที่ Windows จัดหาให้

หากแอปพลิเคชันไม่ได้สำรวจเหตุการณ์เป็นระยะเวลาหนึ่ง (5 วินาที) เช่นเมื่อทำการคำนวณแบบยาว Windows จะถือว่าแอพพลิเคชั่นหยุดทำงานและแจ้งเตือนผู้ใช้

เพื่อหลีกเลี่ยงการใช้งานที่ควรผลักดันการคำนวณที่มีราคาแพงไปยังเธรดผู้ปฏิบัติงานหรือแยกการประมวลผลและตรวจสอบให้แน่ใจว่าคิวได้รับการสำรวจเป็นประจำ


27
↑สิ่งนี้ ไม่มีอะไรจะทำอย่างไรกับการตั้งเวลาหรือเช่นข้อเสนอแนะในคำตอบที่ได้รับการยอมรับเพียงว่าคุณเป็นประจำเรียกGetMessage(หรือชอบ) DispatchMessageและ
เดมอน

1
คำตอบที่ได้รับการยอมรับในหมายถึงได้อย่างถูกต้องข้อสังเกตว่าโปรแกรมในขั้นตอนการเริ่มต้นไม่ได้มีการโทรIsHungAppWindow GetMessage
MSalters

@MSalters ด้วยการเริ่มต้นถูกกำหนดเป็นเวลาก่อนGetMessage? คุณลักษณะดังกล่าวช่วยให้แอปบรรทัดคำสั่งง่าย ๆ ทำงานได้โดยไม่ต้องถูกระงับเนื่องจากไม่จำเป็นต้องสำรวจความคิดเห็นของคิว
วงล้อประหลาดที่

4
@ratchetfreak: สมมุติก่อนการเรียก CreateWindow ครั้งแรก แอพบรรทัดคำสั่งเป็นสัตว์ที่แตกต่างกันโดยสิ้นเชิง พวกเขากำลังทำงานอยู่ภายใน ConHost.EXE และมันโต้ตอบกับ Windows GUI susbystem สำหรับพวกเขา
MSalters

1
สำหรับฉันแล้วดูเหมือนว่าใน Windows 7 (และอาจเป็นไปได้ก่อนหน้านี้) ว่า windows จะสังเกตเห็นได้เร็วกว่านี้หากคุณพยายามและไม่สามารถควบคุมหน้าต่างได้ในบางวิธี เช่นถ้าโปรแกรมไม่ได้ดำเนินการขยายหรือย้ายข้อความ, Windows 7 จะกระโดดสิทธิที่จะไม่ตอบสนองหลังจากนั้นประมาณ 1 หรือ 2 วินาที ..
เดฟ Cousineau

78

Windows จะทราบได้อย่างไรว่าโปรแกรมไม่ตอบสนอง

หากไม่มีซอร์สโค้ดสำหรับ Windows เราไม่สามารถมั่นใจได้ว่ามันทำงานอยู่ภายใน

มีฟังก์ชั่น SDK Windows IsHungAppWindowที่สามารถใช้งานได้

แอปพลิเคชันจะถือว่าไม่ตอบสนองหากไม่รออินพุตไม่ได้อยู่ในการประมวลผลเริ่มต้นและไม่ได้เรียกว่าPeekMessageภายในระยะเวลาหมดเวลาภายใน 5 วินาที

ฟังก์ชัน Source IsHungAppWindow

หากหน้าต่างระดับบนสุดไม่ตอบสนองต่อข้อความนานกว่าหลายวินาทีระบบจะถือว่าหน้าต่างไม่ตอบสนอง ในกรณีนี้ระบบจะซ่อนหน้าต่างและแทนที่ด้วยหน้าต่างผีที่มีลำดับ Z, สถานที่, ขนาดและคุณลักษณะด้านภาพเหมือนกัน สิ่งนี้ทำให้ผู้ใช้สามารถย้ายปรับขนาดหรือแม้แต่ปิดแอปพลิเคชัน อย่างไรก็ตามสิ่งเหล่านี้เป็นเพียงการดำเนินการที่มีอยู่เนื่องจากแอปพลิเคชันไม่ตอบสนอง

แหล่งที่มาเกี่ยวกับข้อความและคิวข้อความ


แอปพลิเคชันที่ทำงานอยู่ทั้งหมดทำงานต่อเนื่องหรือไม่

ไม่แอปพลิเคชันไม่ได้รับการโพล แต่ให้เวลาตัวประมวลผล

Windows มีระบบการตั้งเวลาที่ให้เวลาตัวประมวลผลกับเธรดแอปพลิเคชัน

วิธีการตั้งเวลามีความซับซ้อนและมีคำอธิบายอย่างเต็มที่ในการใช้ Windows Internals ส่วน 1 (6th Edition) (อ้างอิงที่ผู้พัฒนา)


2
สถานะแฮงค์ไม่ได้ขึ้นอยู่กับ CPU โปรแกรมส่วนใหญ่ "หยุด" ในแง่นั้น 99.999% ของเวลาและไม่ทำอะไรเลย
usr

2
@usr ฉันพูดว่า "hang" ขึ้นอยู่กับ CPU ได้ที่ไหน
DavidPostill

2
@usr ครึ่งแรกของคำตอบคือการตอบ "มันยังคงทำการสำรวจแอปพลิเคชันที่ทำงานอยู่ตลอดเวลาอยู่หรือไม่" ครึ่งหลังกำลังตอบว่า "Windows จะรู้ได้อย่างไรว่าโปรแกรมไม่ตอบสนองหรือไม่? OP ถามคำถามสองข้อในหนึ่งข้อ)
DavidPostill

9
แม้ว่ามันจะไม่ได้ลงคะแนนเลือกตั้งจริงๆใช่ไหม ผมถือว่า internals PeekMessageที่มีมากขึ้นเช่นรอจับบนหน้าต่างเป็นสัญญาณเมื่อคุณเรียก ดังนั้นเมื่อ Windows ส่งข้อความไปยังแอปพลิเคชันและไม่ได้รับสัญญาณภายในห้าวินาทีมันจะทำเครื่องหมายแอปพลิเคชันว่าไม่ตอบสนอง และในความเป็นจริงใน Windows ล่าสุดหน้าต่างจะมีเครื่องหมาย "ไม่ตอบสนอง" เท่านั้นหากไม่ตอบสนองต่อการป้อนข้อมูลของผู้ใช้ทันเวลา - จนกว่าฉันจะพยายามคลิกหรือกดปุ่มหรือบางสิ่งบางอย่าง นาทีโดยที่ "ไม่ปรากฏ" ไม่ตอบสนอง
Luaan

2
คุณสามารถลบทุกอย่างที่อยู่ด้านบน "เกี่ยวกับข้อความและคิวข้อความ" เนื่องจากไม่สามารถตอบคำถามได้ Windows รู้ว่าแอพหยุดตอบสนองเพราะหยุดปั๊มข้อความ แอปสามารถทำงานได้แม้ว่าจะทำสิ่งที่เข้มข้นแทนที่จะเป็นปั๊มข้อความ (แต่เป็นโปรแกรมที่ออกแบบมาไม่ดี)
Andy

32

ที่จริงแล้ว Windows ไม่รู้เสมอว่าแอปพลิเคชันไม่ตอบสนอง แอปพลิเคชันจะต้องเป็นแอปพลิเคชันแบบโต้ตอบที่มีหน้าต่างและหน้าต่างจะต้องได้รับข้อความว่าแอปพลิเคชันไม่สามารถดำเนินการได้ก่อนที่ Windows จะสรุปว่าแอปพลิเคชันไม่ตอบสนอง

ยกตัวอย่างเช่น Windows ไม่มีทางรู้ได้ว่าแอปพลิเคชันที่มีตัวเลขเป็นตัวเลขที่ไม่มีส่วนต่อประสานผู้ใช้ที่รันจากบรรทัดคำสั่งกำลังทำสิ่งนั้นอยู่หรืออาจติดอยู่ในวงวนไม่สิ้นสุด

แอปพลิเคชั่นกราฟิกเชิงโต้ตอบใน Windows รับเหตุการณ์โดยการสำรวจคิวข้อความอย่างต่อเนื่อง Windows เติมคิวข้อความนี้ด้วยแป้นพิมพ์เมาส์ตัวจับเวลา ฯลฯ กิจกรรม หากแอปพลิเคชันไม่สามารถสำรวจคิวข้อความในบางครั้ง (5 วินาทีคือการหมดเวลาที่ระบุไว้ในเอกสารประกอบฟังก์ชั่น IsHungAppWindow ()) Windows จะพิจารณาแอปพลิเคชัน "หยุด" ซึ่งอาจระบุได้โดยเปลี่ยนชื่อหน้าต่าง (เพิ่มข้อความ) (ไม่ตอบสนอง) "หรือข้อความเทียบเท่าในเวอร์ชันที่แปลเป็นภาษาท้องถิ่น) และทำให้เนื้อหาของหน้าต่างเป็นสีเทาหากผู้ใช้พยายามที่จะโต้ตอบกับหน้าต่าง

แอปพลิเคชันสามารถแขวนในลักษณะที่ Windows ไม่รู้จัก ตัวอย่างเช่นแอปพลิเคชันอาจทำการสำรวจความคิดเห็นต่อข้อความในคิวข้อความโดยไม่ดำเนินการกับมันอย่างถูกต้องดังนั้นสำหรับทุกความตั้งใจและจุดประสงค์ที่ใช้งานได้จริงจะปรากฏเป็น "หยุด" โดยที่ Windows ไม่ยอมรับว่ามันไม่ตอบสนอง


8
การไม่ตอบสนองตามคำนิยามหมายถึงไม่ประมวลผลข้อความหน้าต่างดังนั้นจึงไม่สามารถใช้ได้กับบริการหรือแอปคอนโซลและดังนั้นฉันจึงบอกว่า Windows จะรู้เสมอว่าแอปไม่ตอบสนองหรือไม่ คุณกำลังสับสนกับล็อคที่ตายแล้วและไม่ตอบสนอง
Andy

แน่นอนว่าสามารถรู้ได้ว่าโปรแกรมไม่ตอบสนองหรือไม่ "ไม่ตอบสนอง" ไม่เหมือนกับ "ติดอยู่ในวงวนไม่สิ้นสุด"
BlueRaja - Danny Pflughoeft

1
ที่จริงแล้วแอปพลิเคชันสามารถดึงข้อความผ่าน GetMessage () และล้มเหลวในการประมวลผลและมันจะไม่ได้รับการยอมรับว่าเป็น "ไม่ตอบสนอง" โดย Windows แม้ว่าข้อเท็จจริงที่ว่ามันจะปรากฏขึ้นไม่ตอบสนองต่อผู้ใช้ คำว่า "ไม่ตอบสนอง" มักใช้เพื่ออธิบายเครือข่ายบริการบรรทัดคำสั่งแบบโต้ตอบ ฯลฯ AFAIK ไม่มีคำจำกัดความที่เป็นทางการที่ จำกัด วลีของแอปพลิเคชันที่มีหน้าต่าง ทั้งการหยุดชะงักหรือการวนซ้ำไม่สิ้นสุด (หรือข้อผิดพลาดการเขียนโปรแกรมอื่น ๆ ) สามารถทำให้แอปพลิเคชันไม่ตอบสนองได้ แต่ไม่ฉันไม่ได้สับสนสาเหตุและผลกระทบ
Viktor Toth

10

Windows เป็นระบบปฏิบัติการดูแลการใช้งานโปรแกรมทั้งหมด

Windows สื่อสารกับแอปพลิเคชันที่ใช้หน้าต่างโดยใช้กิจกรรม ทุกโปรแกรมมีเธรดที่คอยฟังเหตุการณ์ที่เข้ามาอย่างต่อเนื่องและประมวลผล ตัวอย่างเช่นเมื่อคุณคลิกปุ่มหรือไอคอนพื้นที่แจ้งเตือน Windows จะสร้างเหตุการณ์และป้อนเข้าสู่กระบวนการที่เหมาะสม กระบวนการสามารถตัดสินใจได้ว่าจะจัดการกับมันอย่างไร

การโต้ตอบกับโปรแกรมทั้งหมดเป็นไปตามเหตุการณ์ใน Windows ดังนั้นเมื่อโปรแกรมไม่ประมวลผลเหตุการณ์ขาเข้านานเกินไปหมายความว่าไม่ตอบสนอง ตามที่ @DavidPostill ได้พบและจดบันทึกไว้ในคำตอบของเขาการหมดเวลาคือ 5 วินาที PeekMessageเป็นฟังก์ชันที่รับเหตุการณ์จากคิวเหตุการณ์


0

คำตอบสำหรับคำถามของคุณคือใช่ / ไม่ใช่

ในขณะที่ระบบปฏิบัติการ 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 การจัดการคิวข้อความเป็นเพียงหนึ่งในหลาย ๆ เหตุการณ์ที่ระบบปฏิบัติการยังคงเคาน์เตอร์เพื่อพยายามเดาว่ากระบวนการหยุดทำงานหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.