2012-03-22 38 views
9

Giả sử tôi đã có hai sự kiện này phải: -Làm thế nào để bắt đầu một quá trình và làm cho nó 'độc lập'

CreateProcess() bắt đầu một quá trình và cho phép chương trình của bạn tiếp tục trong khi nó chạy, nhưng khi chương trình của bạn kết thúc, đứa trẻ quá trình đi xuống với nó. Hơn nữa, chương trình của bạn phải lưu ý khi nào tiến trình con thoát ra để nó có thể giải phóng đúng quy trình xử lý.

system() bắt đầu một quá trình, đợi cho nó để hoàn thành sau đó tiếp tục với chương trình của bạn.

  • những gì tôi cần biết là cách bắt đầu quy trình và để chương trình chạy độc lập với chương trình của tôi và vẫn tồn tại sau khi thoát khỏi chương trình của tôi. Tôi không cần phải nắm bắt đầu ra của nó hoặc có bất kỳ kiểm soát nào hơn nữa, tôi chỉ muốn cho phép người dùng tương tác với nó - như nói rằng tôi muốn viết một thay thế cho lệnh Start Menu Run.

Vì vậy, xin vui lòng, thực sự có thể làm điều đó?

+4

Bạn đã thử với 'DETACHED_PROCESS' hoặc' CREATE_NEW_PROCESS_GROUP' [cờ tạo quy trình] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684863%28v=vs.85%29 .aspx) để 'CreateProcess'? –

+4

Giả định của bạn không chính xác. –

+0

hack nhanh: 'system (" start yourprocess.exe ")' – smerlin

Trả lời

6

CreateProcess() không chờ quá trình con hoàn thành theo mặc định, nó sẽ trả về ngay lập tức. Sử dụng WaitForSingleObject nếu bạn muốn đợi. Không, quá trình con sẽ không tự động bị chết khi cha mẹ tồn tại và xử lý được tự động giải phóng bởi hệ điều hành, không cần tự mình làm điều đó (nếu bạn sử dụng phiên bản hiện đại của cửa sổ).

Giống như bất kỳ tài nguyên hệ điều hành nào (đối tượng gdi, đối tượng người dùng, đối tượng hạt nhân), nếu bạn không tự hủy/giải phóng/đóng tài nguyên thì bạn sẽ bị rò rỉ tài nguyên trong khi ứng dụng của bạn chạy. Bạn nên đóng cả hai xử lý trả về từ CreateProcess ngay sau khi CreateProcess trả về.

+0

Bạn có chắc chắn quá trình con không bị giết tự động khi cha mẹ thoát? Tôi đã quan sát chính xác hành vi đó, dẫn tôi đến câu hỏi này. – user4815162342

+0

Tôi quan sát như vậy. Trừ khi bạn chỉ định DETACHED_PROCESS trong các cờ tạo, cha mẹ thực sự sẽ gỡ bỏ đứa trẻ. –

4

Bạn có thể chỉ định "DETACHED_PROCESS" trong CreationFlags Giống như mã snippent sau:

if (CreateProcessW(NULL, (LPWSTR) L"File.exe ", 
     0, 0, false,CREATE_DEFAULT_ERROR_MODE | CREATE_NO_WINDOW | DETACHED_PROCESS , 0, 0, 
     &siStartupInfo, &piProcessInfo) != false) 
    { 
     /* Watch the process. */ 
     dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (2 * 1000)); 
    } 
    else 
    { 

     /* CreateProcess failed */ 
     iReturnVal = GetLastError(); 
    } 

này sẽ làm cho quá trình yur độc lập. Tôi hy vọng cái này sẽ giúp bạn.

+0

Không có ý nghĩa gì khi kết hợp cờ 'CREATE_NO_WINDOW' với' DETACHED_PROCESS'. Cờ 'CREATE_NO_WINDOW' bị bỏ qua nếu ứng dụng không phải là ứng dụng bảng điều khiển hoặc nếu ứng dụng được sử dụng với' CREATE_NEW_CONSOLE' hoặc 'DETACHED_PROCESS'. Xem https://msdn.microsoft.com/en-us/library/windows/desktop/ms684863(v=vs.85).aspx –

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