2012-10-15 19 views
6

Lợi ích của việc sử dụng WaitForSingleObject ở đây trái ngược với việc không sử dụng nó là gì? Khối mã đầu tiên là từ previous answer. Khối thứ hai là cách tôi đang làm nó.Lợi ích của việc sử dụng WaitForSingleObject khi kiểm tra quá trình ID

BOOL IsProcessRunning(DWORD pid) 
{ 
    HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, pid); 
    DWORD ret = WaitForSingleObject(process, 0); 
    CloseHandle(process); 
    return (ret == WAIT_TIMEOUT); 
} 

vs

BOOL IsProcessRunning(DWORD pid) 
{ 
    HANDLE process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid); 
    const bool exists = (process != NULL); 
    CloseHandle(process); 
    return exists; 
} 

Nó có vẻ như sử dụng SYNCHRONIZE đòi hỏi đặc quyền cao hơn và tôi chỉ muốn kiểm tra PID cho người dùng hiện.

+1

Để thêm bạn một số công việc so sánh - bạn có thể muốn so sánh 'GetExitCodeProcess' với' WaitForSingleObject' để xác định trạng thái hoàn thành quá trình. –

Trả lời

8

Khi quá trình hoàn tất, nó ngừng chạy nhưng nó không biến mất cho đến khi xử lý cuối cùng cho nó được đóng lại. Giải pháp đầu tiên phân biệt giữa hai trạng thái đó (vẫn chạy hoặc chạy xong). Tất nhiên, câu trả lời có thể lỗi thời vào thời điểm nó quay trở lại.

Nếu bạn không cần sự phân biệt đó, thì cách tiếp cận của bạn là tốt (mặc dù tôi sẽ đặt tên cho hàm giống như DoesProcessExist).

+1

Tôi cũng sẽ thêm ID quá trình * theo lý thuyết * có thể được sử dụng lại. Vì vậy, nó thường không phải là một ý tưởng tốt mỗi khi mở quá trình bằng ID của nó. Tốt hơn mở xử lý của nó một lần (hoặc lưu nó nếu bạn tạo ra nó, hoặc thu được từ một số bên thứ 3). – valdo

-1

WaitForSingleObject sẽ đợi cho đến khi quá trình hoàn thành/thoát. Chỉ sau đó nó sẽ trở lại.

+3

Không có thời gian chờ là 0 –

+0

@AdrianMcCarthy bạn nói đúng - Tôi không thấy 0. – user93353

+0

Thời gian chờ bằng 0 là một phần của tính không thể thiếu (hy vọng tôi viết đúng), nó sẽ hết thời gian ngay lập tức (= quá trình chạy) hoặc thất bại (= quá trình zombie). – Damon

1

Việc triển khai IsProcessRunning cũng có thể sử dụng API GetExitCodeProcess Win32.

+0

Điều gì sẽ xảy ra nếu quá trình cố ý trả lại 259 ('STILL_ACTIVE') làm mã thoát? – zett42