2011-07-21 23 views
8

Tôi đang phá hủy để thực hiện một số công việc và một trong các yêu cầu là giết quá trình nếu nó bị treo.
Suy nghĩ đầu tiên của tôi là Process.Responding, tuy nhiên, tôi không chắc nó thực sự có ý nghĩa gì.Quy trình thực hiện có nghĩa là gì?

Có giống như khi Win7 thêm (Not Responding) vào tiêu đề cửa sổ của ứng dụng không? Trên máy tính của tôi, điều này xảy ra ngay cả khi MS Word cố gắng mở một tệp từ một chia sẻ từ xa thực sự chậm.

Điều kiện để có quy trình. Tương ứng là sai?

+1

Đó là chính xác những gì nó nói: Đây luôn luôn là một trong những thông điệp un-userfriendly đó thực sự đến từ chi tiết triển khai kỹ thuật: vòng lặp tin nhắn không phản hồi. – sehe

Trả lời

14

Dưới mui xe, khi bạn kiểm tra thuộc tính Process.Responding, chức năng Windows SendMessageTimeout được gọi.

Chức năng này về cơ bản sẽ gửi thông báo đến cửa sổ chính của một quy trình khác và kiểm tra xem cửa sổ có chấp nhận thông báo trong khoảng thời gian quá 5000 ms hay không (Do đó việc kiểm tra thuộc tính này trên ứng dụng bảng điều khiển không có hiệu lực).

Nếu bạn muốn sử dụng một thời gian chờ tùy chỉnh, bạn có thể chỉ cần cũng gọi SendMessageTimeout chức năng bản thân:

[DllImport("user32.dll", CharSet=CharSet.Auto)] 
public static extern IntPtr SendMessageTimeout(
    HandleRef hWnd, 
    int msg, 
    IntPtr wParam, 
    IntPtr lParam, 
    int flags, 
    int timeout, 
    out IntPtr pdwResult); 

const int SMTO_ABORTIFHUNG = 2; 

public bool RespondingWithinMs(Process process, int timeoutMs) 
{ 
    IntPtr ptr2; 
    return SendMessageTimeout(
     new HandleRef(process, process.MainWindowHandle), 
     0, 
     IntPtr.Zero, 
     IntPtr.Zero, 
     SMTO_ABORTIFHUNG, 
     timeoutMs, 
     out ptr2) != IntPtr.Zero; 
} 
+0

[Process.Responding source] (https://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/Process.cs,953): Lưu ý rằng chúng vượt qua thời gian chờ 5000ms một cách rõ ràng. Một trang MSDN cho SendMessageTimeout [ở đây] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644952 (v = vs.85) .aspx) có nhiều thông tin hơn liên kết MSDN của bạn, cái này làm rõ rằng "Chức năng này xem xét rằng một chuỗi không phản hồi nếu nó không được gọi là GetMessage hoặc một hàm tương tự trong vòng năm giây" - Tôi cho rằng điều này chỉ ảnh hưởng đến cờ 'SMTO_ABORTIFHUNG', đây là một mã khác, cứng 5 giây kiểm tra. – Quantic

4

Responding có nghĩa là cửa sổ ứng dụng đang phản hồi người dùng. quy trình phải có một số MainWindowHandle từ msdn:

true nếu giao diện người dùng của quy trình liên quan phản hồi hệ thống; ngược lại, sai.

Nếu quy trình không có MainWindowHandle, thuộc tính này trả về true.

Bạn có thể sửa đổi thời gian chờ được ứng dụng sử dụng. Tương ứng kiểm tra this.

3

Từ http://msdn.microsoft.com/en-us/library/system.diagnostics.process.responding.aspx

Nếu một quá trình có một giao diện người dùng, địa chỉ liên lạc hữu Hưởng ứng giao diện người dùng để xác định xem quá trình này được đáp ứng để người dùng nhập vào. Nếu giao diện không phản hồi ngay lập tức, thuộc tính Responding trả về false. Sử dụng thuộc tính này để xác định xem giao diện của quá trình liên quan đã ngừng phản hồi hay chưa.

Các vấn đề liên quan