【问题标题】:Open a few files, wait ~30 mins, relaunch them in C++打开几个文件,等待约 30 分钟,用 C++ 重新启动它们
【发布时间】:2016-11-27 10:47:02
【问题描述】:

我发布了一个关于如何批量执行此操作的帖子,但事实证明批处理脚本不是很流行,我什至几乎不知道,所以现在我请求您帮助在 C++ 中执行此操作。

这是我尝试过的

#include <Windows.h>
using namespace std;

void openBat(char* path) {
    system(path);
}

int main() {
    for(;;) {
    openBat("C:\\Users\\Ivan\\Desktop\\folder\\run.bat");
    Sleep(1800000);
    //kill opened process
    }
    return 0;
}

我不确定如何杀死打开的进程,因为每次我运行 bat 脚本时,它都会有一个新的 ID,而且我不能按名称杀死,因为我需要打开其中的 4 个。感谢所有帮助。

【问题讨论】:

  • I posted a thread about how to do this in batch 能给个链接吗?此外,“线程”通常在 Stack Overflow 上称为“问题”。
  • 抱歉,我删了,只有2条回复,看不懂
  • 嗯,这不是删除它的真正理由
  • 好吧,如果它意味着什么,我取消删除它。 stackoverflow.com/questions/38543991/…
  • 谢谢,埃德。如果真的没用,管理员会删除它。

标签: c++


【解决方案1】:

您在那里所做的并不是真正的 C++。您基本上是在使用 Windows 来解释您传递给它的命令,就像批处理一样。这是您想在 C++ 中执行的操作,即使它仅在 Windows 上运行。

#include <Windows.h>
#include <string>

std::wstring GetEnvString()
{
    wchar_t* env = GetEnvironmentStrings();
    std::wstring result{ env };
    FreeEnvironmentStrings(env);
    result.push_back('\0');
    return result;
}

int main()
{
    //Setup needed structures
    STARTUPINFO si{ sizeof si };
    PROCESS_INFORMATION pi;

    //Command line (read- and writeable)
    wchar_t cmd[] = L"cmd.exe /C C:\\Users\\Ivan\\Desktop\\folder\\run.bat";

    //Create process
    CreateProcess(nullptr, cmd, nullptr, nullptr, false, CREATE_UNICODE_ENVIRONMENT, 
        const_cast<wchar_t*>(GetEnvString().c_str()), nullptr, &si, &pi);

    Sleep(1800000);

    //Process Termination
    TerminateProcess(pi.hProcess, 0);   

    // Close process and thread handles. 
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}

我建议您阅读 CreateProcess 函数以及 Terminate Process 函数。还有一个example from Microsoft关于如何使用两者中的前者。我希望这些信息可以帮助到你。

编辑: 修复了一些东西。现在应该可以工作了。感谢 user4581301,他的链接非常有用。

【讨论】:

    【解决方案2】:

    我认为解决方案可以在不杀死进程本身的情况下杀死自身进程树。

    Terminate a process tree (C for Windows)

    【讨论】:

      【解决方案3】:

      创建进程时,请按住进程句柄并在完成后使用句柄终止进程。通过句柄,您可以确切地知道同一进程的数千个实例中的哪个实例要死掉。

      注意:终止进程可能会产生不良结果。你几乎总是最好以这样一种方式编写流程,以便你可以向它们发送消息并要求它们礼貌地终止自己。你将如何使用批处理文件来做到这一点......如果我知道的话,Smurfed。其他人可能对这个问题有更好的答案,我对此很好。有一天我可能需要那个更好的解决方案。

      在 Windows 上,您可能需要 CreateProcessTerminateProcess

      此处介绍了使用 CreateProcess 运行批处理文件:Use CreateProcess to Run a Batch File

      此处介绍了终止使用 Create 进程启动的进程: how to terminate a process created by CreateProcess()?

      【讨论】:

        猜你喜欢
        • 2013-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多