gpt4 book ai didi

c++ - 用数组或静态 vector 替换 vector 以获得更好的方法

转载 作者:行者123 更新时间:2023-12-02 09:59:55 28 4
gpt4 key购买 nike

我的应用程序使用createprocess(windows api)并行(使用线程)运行特定数量的进程(不同的可执行文件)。用户可以随时刷新/关闭我的应用程序。到目前为止,我正在将进程句柄插入 vector ,并且每当收到关闭请求时,我都会迭代 vector 并终止(使用 GetExitCodeProcess 和 TerminateProcess API)并关闭(使用 CloseHandle API)进程句柄。此外,当它完成时,我正在关闭进程的句柄。当前模型的问题是,每当处理完成的句柄将被关闭并且当再次收到关闭请求时,我将尝试使用 vector 关闭它(句柄未更新)。为了解决这个问题,我必须在 vector 中/从 vector 中更新/删除句柄。为此,需要维护索引。
由于我知道进程的数量,我想创建一个静态 vector 并更新它,而不是将本地对象推送到 vector 。有人可以提出一个最好的方法。
下面是示例代码。

//member object
std::vector<PROCESS_INFORMATION> mProcessHandles;

//this is a thread and will be called multiple times with different executable names in the application
void method(std::string executable)
{
STARTUPINFO startInfo{};
PROCESS_INFORMATION procInfo{};
bool ret = CreateProcess(NULL, executable, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &startInfo, &procInfo);
mProcessInfo.push_back(procInfo);
if(ret)
{
WaitForSingleObject(procInfo.hProcess, INFINITE);
CloseHandle(procInfo.hProcess);
procInfo.hProcess = NULL;
CloseHandle(procInfo.hThread);
procInfo.hThread = NULL;
}
return;
}

//this will be called when application close requested
void forceKill()
{
for (auto &processHandlesIt : mProcessHandles)
{
DWORD errorcode = 0;
GetExitCodeProcess(processHandlesIt.hProcess, &errorcode);
if (errorcode == STILL_ACTIVE)
{
TerminateProcess(processHandlesIt.hProcess, errorcode);
}
CloseHandle(processHandlesIt.hProcess);
processHandlesIt.hProcess = NULL;
CloseHandle(processHandlesIt.hThread);
processHandlesIt.hThread = NULL;
}
}

最佳答案

在句柄关闭后,您不应使用句柄(例如在 GetExitCodeProcess 中)。
我根本不会关闭线程中的那些进程句柄,而将它们留给 forceKill或其他清理功能关闭。
另外,由于您没有使用 procInfo.hThread ,您可以在 CreateProcess 之后立即关闭它返回。
我猜你没有使用 procInfo 的任何其他成员,因此您只能将进程的句柄存储在您的 vector 中。

关于c++ - 用数组或静态 vector 替换 vector 以获得更好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63159520/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com