我正在尝试在C ++中创建一个新进程(不应该阻止当前程序),并让C ++监听一条消息。当消息到达时,我想再运行一些代码。
我有这个方法执行命令并立即产生结果,但我不知道如何在进程返回消息时创建一个运行代码的方法:
string exec(const char* cmd)
{
// popen for *nix
FILE* pipe = _popen(cmd, "r");
if (!pipe)
return "";
char buffer[128];
string result = "";
while(!feof(pipe)) {
if(fgets(buffer, 128, pipe) != NULL)
result += buffer;
}
// pclose for *nix
_pclose(pipe);
return result;
}
注意:在进程返回消息之前可能需要1-3秒 - 然后进程将继续执行,因此上述代码不足以执行程序永远不会结束。
答案 0 :(得分:1)
您可以将执行该进程的代码放在一个单独的线程中,这样主线程可以在辅助线程启动进程时继续执行,并等待来自子进程的消息。
答案 1 :(得分:0)
开始此过程后,请定期检查是否已向您发送消息。如果是这样,请拨打您需要拨打的代码。
具体如何执行此操作取决于其余代码的结构。例如,如果您已经有一个定期事件表,那么它非常简单。如果你有一个'选择'循环类型设计,它再次非常简单。
如果您还没有这些东西,请写一个'CheckIfTheresAnythingToDo'功能。有一个布尔标志,指示您是否正在运行子进程。如果标志清除,在'CheckIfTheresAnythingToDo'中立即返回。如果已设置,请致电select
并查看是否已收到该消息。如果是这样,请拨打您需要拨打的代码。 (我建议不要使用标准I / O,因为它不能很好地解决你需要一次做多件事的非阻塞语义。)
然后只需在代码中的关键点调用CheckIfTheresAnythingToDo
即可。如果您有某种循环结构,请在循环的每次传递中调用一次。如果你有等待事物的代码,请让你的wait函数调用它。
但是,当你开始设计时,你应该已经知道该怎么做了。 “我需要偶尔检查一下”是一个非常典型的要求,如果你的整体设计无法适应它,你应该重新考虑这个设计。