Tại sao edit.com có thể bị chấm dứt thành công bằng cách nhấp vào Tệp → Thoát, nhưng không phải bằng cách nhấp vào nút đóng ☒? Tại sao nút đóng gây ra một dấu nhắc để giết nó?
TL; DR
Vì Chỉnh sửa là chương trình DOS, nên Tệp → Thoát không liên quan gì đến Windows hoặc ☒
nút.
Các hệ thống con
Windows có hai hệ thống con chính (nếu bạn có khung), một chương trình có thể sử dụng để đơn giản hóa mọi thứ và tránh việc lập trình viên phải làm mọi thứ thủ công và phát minh lại bánh xe. Có hệ thống con Windows tiêu chuẩn và có hệ thống con giao diện điều khiển .
Các chương trình Windows là các chương trình GUI (giao diện người dùng đồ họa), trong khi các chương trình giao diện điều khiển là các chương trình CLI (giao diện dòng lệnh). Đây là những thiết kế rất khác nhau và những gì hoạt động cho một cái không hoạt động cho cái kia.
Hệ thống con Windows
Hệ thống con windows là hệ thống phổ biến hơn và các chương trình có cửa sổ đồ họa và điều khiển sẽ sử dụng điều đó. Trung tâm của chương trình là một vòng lặp thông báo Windows . Sau khi chương trình đã khởi tạo và sẵn sàng để chạy, nó sẽ đi vào một vòng lặp vô hạn nơi nó nằm im, kiên nhẫn chờ đợi điều gì đó xảy ra. Điều này có thể bao gồm đầu vào từ người dùng, hẹn giờ tắt, hoạt động mạng, v.v. Khi Windows phát hiện một số thay đổi mà chương trình phải hoặc có thể muốn phản hồi, nó sẽ gửi tin nhắn cho chương trình đó . Tại thời điểm đó, nếu thông báo là về một cái gì đó mà chương trình quan tâm, nó sẽ trả lời nó bằng một trình xử lý, đây chỉ là một chức năng thực hiện một cái gì đó.
(Đây cũng là cách mà hầu hết các trò chơi hoạt động. Họ sẽ có một vòng lặp trò chơi chính chờ đầu vào từ các nút gamepad, bộ hẹn giờ, v.v. .)
Chương trình Hùng
Thông thường, khi một chương trình nhận được một tin nhắn, nó sẽ xử lý nó hoặc chuyển nó đi. Điều này thường xảy ra nhanh chóng. Tuy nhiên, đôi khi, một chương trình có thể bị treo vì một số lý do, điều này sẽ khiến chương trình không xử lý tin nhắn. Windows có thể phát hiện khi điều này xảy ra và nếu mất quá nhiều thời gian, nó sẽ xem xét chương trình bị đóng băng và đề nghị cho phép người dùng giết chương trình không phản hồi thay vì tắt nó một cách duyên dáng. Điều này có nghĩa là nó sẽ kết thúc đột ngột và không chỉ mất các tệp chưa được lưu mà còn có khả năng khiến các tệp đang mở ở trạng thái không nhất quán, do đó làm hỏng chúng.
Bảng điều khiển hệ thống con
Các chương trình Console khác với các chương trình Windows đồ họa. Chúng đã phát triển từ tổ tiên DOS của chúng và trong khi chúng có được nhiều chức năng mới từ dấu nhắc lệnh của Windows, bên dưới tất cả, chúng hoạt động rất giống các chương trình DOS cũ, bao gồm cả cách chúng khởi động, chạy và tắt.
Kết thúc chương trình
Hãy xem xét điều gì xảy ra khi bạn nhấp vào ☒
nút cho cả hai loại chương trình.
Đóng chương trình Windows
Khi bạn bấm vào ☒
nút của chương trình Windows, Windows sẽ gửi WM_CLOSE
tin nhắn cho chương trình đó . Vòng lặp của chương trình phát hiện thông báo và trả lời bằng cách gọi một hàm thực hiện quy trình chuẩn kết thúc chương trình Windows (hy vọng sau khi thực hiện một số công việc dọn dẹp như giải phóng tài nguyên được phân bổ, lưu tệp, v.v.). Ngoài mọi công việc dọn dẹp, việc định tuyến tắt máy thực tế diễn ra khá nhanh và Windows chuyển sang nhiệm vụ tiếp theo.
Đóng chương trình điều khiển
Khi bạn bấm vào ☒
nút của dấu nhắc lệnh, bạn đang nói với dấu nhắc lệnh đóng. Khi nhận được tin nhắn đó, nó sẽ cố gắng đóng lại và nếu bạn đang ngồi im tại dấu nhắc, chắc chắn nó có thể làm như vậy mà không phải đắn đo nhiều. Nhưng điều gì xảy ra nếu bạn có một số chương trình mở và chạy trong dấu nhắc lệnh? Chương trình đó là một quá trình riêng biệt hoàn toàn. Dấu nhắc lệnh không thể giết chương trình đó, nó sẽ không thân thiện với người dùng và có thể làm hỏng dữ liệu hoặc mất các tệp chưa được lưu. Thay vào đó, nó cố gắng truyền thông điệp gần gũi đến chương trình. Có hai kịch bản có thể diễn ra tại thời điểm này:
Nếu chương trình là chương trình bảng điều khiển Windows, thì việc gửi nó, thông báo đóng thường sẽ hoạt động ngay lập tức vì nó được biên dịch với hệ thống con bảng điều khiển Windows và trong khi bạn có thể mất một số tệp chưa được lưu, vì nó đang sử dụng mã bảng điều khiển dành riêng cho Windows, có không chậm trễ, và do đó Windows không cần phải dùng đến việc tiêu diệt nó.
Tuy nhiên, nếu chương trình là một chương trình DOS (như Chỉnh sửa), thì nó đã được biên dịch để chạy trên DOS và do đó không biết gì về Windows và do đó không đáp ứng, vì vậy Windows nghĩ rằng nó bị treo và đề nghị giết chương trình.
Tệp → Thoát
Với một chương trình Windows, lệnh exit (thường File → Exit
) chỉ là bí danh cho WM_CLOSE
. Khi bạn thoát khỏi chương trình, nó sẽ nhận được thông báo đóng giống như bạn đã nhấp vào nút đóng.
Với Chỉnh sửa, lệnh exit (cũng File → Exit
) không liên quan gì đến Windows. Nó là một chức năng tích hợp sẵn của chính chương trình DOS đó. Vì vậy, khi bạn nhấp vào nút đóng, đó là một điều hoàn toàn khác so với thoát khỏi bên trong Chỉnh sửa, vì vậy nhấp vào ☒
không cho biết chương trình đóng.
Kết quả khác nhau
Nhưng tại sao Kevin lại nhận được một kết quả khác với những người khác (và bản thân tôi)? Điều này có thể là do sự khác biệt trong khoảng thời gian chờ mà Windows được cấu hình để sử dụng cho các thói quen phát hiện khi chương trình bị đóng băng. Thực tế có một số cài đặt khác nhau ảnh hưởng đến điều này. Thay đổi (các) cài đặt sẽ khiến Windows phải chờ thêm thời gian hoặc ít hơn trước khi hiển thị hộp thoại.
Tôi sẽ liệt kê tất cả, nhưng trong khi tìm kiếm chúng, cuối cùng tôi đã tìm thấy một bài đăng mà tôi đã thực hiện một lúc trước đó đã liệt kê tất cả, vì vậy nếu có ai quan tâm đến chi tiết, bạn có thể tìm thấy chúng ở đó.