如何创建从线程查询的全局可访问对象的持久列表



几个小时以来,我一直在尝试从线程中获取一个持久对象。我想用C++编写一个共享库,在函数中启动一个持久循环。在下面的代码片段中,有一个名为Process的类。进程初始化TCP/IP接口以从Simulink模型读取和写入数据。

这只是为了申报,对于这个问题应该不重要,但现在你知道我在提到流程时说的是什么了。

main.cpp

我知道,它看起来有点难看/不专业,但我对C++还很陌生。。

// frustrated attempt to make everything persistent
static vector<std::thread> processThreads;
static ProcessHandle processHandle;
static vector<std::promise<Process>> promiseProcess;
static vector<std::future<Process>> futureProcess;
EXPORT int initializeProcessLoop(const char *host, int port)
{
std::promise<Process> promiseObj;
futureProcess.push_back(std::future<Process>(promiseObj.get_future()));
processThreads.push_back(std::thread(&ProcessHandle::addProcess, processHandle, host, port, &promiseProcess[0]));
Process val = futureProcess[0].get();
processHandle.handleList.push_back(val);
return (processHandle.handleList.size() - 1);
}

ProcessHandle.cpp

ProcessHandle中的addProcess函数创建应该持久的Process,将其添加到ProcessHandle的静态向量成员中,并将promise传递给执行循环。

int ProcessHandle::addProcess(const char *address, int port, std::promise<Process> * promiseObj) {
Process process(address, port);
handleList.push_back(process);
handleList[handleList.size() - 1].exec(promiseObj);
return handleList.size() - 1;
}

对于现在的主要问题。。。

如果我将"initializeProcessLoop"更改为包括:

if(processHandle.handleList[0].isConnected())
{
processHandle.handleList[0].poll("/Compare To Constant/const");
}

在我将"val"推送到processHandle.handleList之后,一切都很好,我可以按原样轮询数据。

如果我改为从主函数(例如(轮询它,则循环在"initializeProcessLoop"内部崩溃,因为"Process val"是用futureProcess[0].get((重新分配的(?(。

函数返回后,如何使Process变量和线程循环保持一致?

如果对代码有任何问题(我敢打赌会有(,请随时询问。提前感谢!

附言:强制性的"英语不是我的母语,请原谅任何拼写错误或胡言乱语"。。。

好吧,首先我必须声明,上面和下面的编码风格无论如何都不是最佳实践。

虽然Sam Varshavchik仍然正确地学习C++,只是改变了

Process val = futureProcess[0].get();

static Process val = futureProcess[0].get();

完成了任务。

需要明确的是:不要这样做。这是一个快速的解决办法,但将来会适得其反。但我希望它能帮助任何有类似问题的人。

如果有人有更好的解决方案(不会变得更糟,是吗?(,请随时添加您对这个问题的回答。

最新更新