Для моего приложения я пытался завершить процесс Python и его порожденные процессы открывались с помощью «subprocess.Popen». Я попробовал TerminateProcess, и это слишком зло. :) Наконец-то я решил, что могу использовать консольную команду taskkill . Я сделал это в программе на C ++:
// standard kill process call
void stopProcess(DWORD pid)
{
STARTUPINFO startupInfo;
LPPROCESS_INFORMATION processInfo = new PROCESS_INFORMATION;
// clear the memory to prevent garbage
ZeroMemory(&startupInfo, sizeof(startupInfo));
// set size of structure (not using Ex version)
startupInfo.cb = sizeof(STARTUPINFO);
// tell the application that we are setting the window display
// information within this structure
startupInfo.dwFlags = STARTF_USESHOWWINDOW;
// hide process
startupInfo.wShowWindow = SW_HIDE;
//TerminateProcess(itr->second->hProcess, 0); // not friendly to process, and does not kill child processes
std::stringstream comStream;
comStream << "taskkill /pid ";
comStream << pid;
//comStream << " /t /f"; // to be more like TerminateProcess
_MESSAGE("%s", comStream.str().c_str());
//system(comStream.str().c_str()); // works, but pops up a window momentarilly when called
//LPSTR s = const_cast<char *>(comStream.str().c_str());
LPSTR cString = strdup( comStream.str().c_str() );
if(!CreateProcess(NULL,cString,NULL,NULL,false,NORMAL_PRIORITY_CLASS,NULL,NULL,&startupInfo,processInfo)){
_MESSAGE("Could not launch '%s'",cString);
SAFE_DELETE(processInfo);
}else{
// clean up
CloseHandle(processInfo);
SAFE_DELETE(processInfo);
}
// clean up
free(cString);
}
Вы увидите, что мои другие эксперименты закомментированы. Я наконец остановился на этом методе, потому что он скрывает все всплывающие окна, которые могут появиться. Я также обнаружил, что это позволяет приложению Python правильно вызывать atexit. Однако даже без моего явного завершения подпроцессов они все равно отключаются с помощью метода taskkill. Я предполагаю, что это связано с тем, как разработан код Python.
Итак, вы можете попробовать описанный выше метод, подождать, пока процесс не закроется, и если он потерпит неудачу, вы можете переключиться на большие пушки, используя TerminateProcess, если он просто не будет взаимодействовать. У Taskkill также есть режимы для безжалостного убийства, если это необходимо.