C++ 用数组或静态向量替换向量是一种更好的方法

C++ 用数组或静态向量替换向量是一种更好的方法,c++,c++17,C++,C++17,我的应用程序使用createprocess(windows api)并行(使用线程)运行特定数量的进程(不同的可执行文件)。用户可以随时刷新/关闭我的应用程序。现在,我正在将进程句柄推入vector,每当收到close请求时,我都会迭代该向量并终止(使用GetExitCodeProcess和TerminateProcessAPI)和关闭(使用CloseHandle API)进程句柄。当进程完成时,我也会关闭进程的句柄。当前模型的问题是,无论何时进程完成,句柄都将关闭,当再次收到关闭请求时,我将尝

我的应用程序使用createprocess(windows api)并行(使用线程)运行特定数量的进程(不同的可执行文件)。用户可以随时刷新/关闭我的应用程序。现在,我正在将进程句柄推入vector,每当收到close请求时,我都会迭代该向量并终止(使用GetExitCodeProcess和TerminateProcessAPI)和关闭(使用CloseHandle API)进程句柄。当进程完成时,我也会关闭进程的句柄。当前模型的问题是,无论何时进程完成,句柄都将关闭,当再次收到关闭请求时,我将尝试使用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;
    }
}
//成员对象
std::向量处理句柄;
//这是一个线程,将在应用程序中使用不同的可执行文件名多次调用
void方法(std::string可执行文件)
{
STARTUPINFO startInfo{};
处理信息procInfo{};
bool ret=CreateProcess(NULL、可执行、NULL、NULL、TRUE、CREATE\u NO\u窗口、NULL、NULL、startInfo和procInfo);
mpprocessinfo.push_back(procInfo);
如果(ret)
{
WaitForSingleObject(procInfo.hProcess,无限);
CloseHandle(procInfo.hProcess);
procInfo.hProcess=NULL;
CloseHandle(procInfo.hThread);
procInfo.hThread=NULL;
}
返回;
}
//当请求关闭应用程序时,将调用此函数
void forceKill()
{
用于(自动和进程句柄IT:MPProcessHandles)
{
DWORD错误代码=0;
GetExitCodeProcess(processHandlesIt.hProcess,&errorcode);
如果(错误代码==仍处于活动状态)
{
TerminateProcess(processHandlesIt.hpProcess,错误代码);
}
CloseHandle(processHandlesIt.hProcess);
processHandlesIt.hProcess=NULL;
CloseHandle(processHandlesIt.hThread);
processHandlesIt.hThread=NULL;
}
}

关闭句柄后,不应使用它们(例如在
GetExitCodeProcess
中)

我不会简单地关闭线程中的那些进程句柄,而是将它们留给
forceKill
或其他清理函数来关闭

另外,由于您没有使用
procInfo.hThread
,因此可以在
CreateProcess
返回后立即关闭它


我猜您没有使用
procInfo
的任何其他成员,因此只能在向量中存储进程的句柄。

您当前的方法很好,为什么要更改它或使用静态向量?如果您事先知道项目的数量,那么固定数组将是一个更好的选择。但是,一般的方法大致相同。您对
push_back
的调用应该同步,因为
std::vector
不是线程安全的。或者,您可以使用静态数组并将索引传递给线程函数,这样每个线程都将使用自己的元素。