如何创建从线程查询的全局可访问对象的持久列表?
How can I create a persistent list of globally accesible objects queried from threads?
几个小时以来,我一直在尝试从线程中获取持久对象。
我想用 C++ 编写一个共享库,它在一个函数中启动一个持久循环。
在以下代码片段中,有一个名为 Process 的 class。进程初始化一个 TCP/IP 接口以从 Simulink 模型读取和写入数据。
这只是为了声明,对于这个问题应该不重要,但是现在你知道我在提到过程时在说什么了。
main.cpp
我知道,它看起来有点 ugly/unprofessional,但我是 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 的静态向量成员并将承诺传递给执行循环。
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 之后,一切正常,我可以按应有的方式轮询数据。
如果我改为从 - 例如 - main 函数轮询它,循环会在 "initializeProcessLoop" 内部崩溃,因为 "Process val" 被 futureProcess[0].get() 重新分配(?) .
如何让Process变量和线程循环在函数后保持一致returns?
如果对代码有任何疑问(我敢打赌会有),请随时提问。提前致谢!
PS:必填项"English is not my native language, please excuse any spelling errors or gibberish"...
好的,首先我必须声明,上面和下面的编码风格无论如何都不是最佳实践。
虽然 Sam Varshavchik 对如何以正确的方式学习 C++ 仍然是正确的,只是改变了
Process val = futureProcess[0].get();
至
static Process val = futureProcess[0].get();
完成任务。
明确一点:不要这样做。这是一个快速修复,但将来会适得其反。但我希望它能帮助遇到类似问题的人。
如果有人有更好的解决方案(它不会变得更糟,不是吗?),请随时添加您对这个问题的回答。
几个小时以来,我一直在尝试从线程中获取持久对象。 我想用 C++ 编写一个共享库,它在一个函数中启动一个持久循环。 在以下代码片段中,有一个名为 Process 的 class。进程初始化一个 TCP/IP 接口以从 Simulink 模型读取和写入数据。
这只是为了声明,对于这个问题应该不重要,但是现在你知道我在提到过程时在说什么了。
main.cpp
我知道,它看起来有点 ugly/unprofessional,但我是 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 的静态向量成员并将承诺传递给执行循环。
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 之后,一切正常,我可以按应有的方式轮询数据。
如果我改为从 - 例如 - main 函数轮询它,循环会在 "initializeProcessLoop" 内部崩溃,因为 "Process val" 被 futureProcess[0].get() 重新分配(?) .
如何让Process变量和线程循环在函数后保持一致returns?
如果对代码有任何疑问(我敢打赌会有),请随时提问。提前致谢!
PS:必填项"English is not my native language, please excuse any spelling errors or gibberish"...
好的,首先我必须声明,上面和下面的编码风格无论如何都不是最佳实践。
虽然 Sam Varshavchik 对如何以正确的方式学习 C++ 仍然是正确的,只是改变了
Process val = futureProcess[0].get();
至
static Process val = futureProcess[0].get();
完成任务。
明确一点:不要这样做。这是一个快速修复,但将来会适得其反。但我希望它能帮助遇到类似问题的人。
如果有人有更好的解决方案(它不会变得更糟,不是吗?),请随时添加您对这个问题的回答。