Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 进程间:如何从另一个进程中的类调用函数并将数据发送到该函数?_C++_Multithreading_Multiprocessing_Boost Interprocess - Fatal编程技术网

C++ 进程间:如何从另一个进程中的类调用函数并将数据发送到该函数?

C++ 进程间:如何从另一个进程中的类调用函数并将数据发送到该函数?,c++,multithreading,multiprocessing,boost-interprocess,C++,Multithreading,Multiprocessing,Boost Interprocess,因此,我创建了一个适用于线程的简单类-您可以将任何类的任何void函数添加到从我的类中增强的类的订阅函数列表中: #include <iostream> #include <vector> #include <boost/thread.hpp> // parts of c++0x std #include <boost/bind.hpp> #include <boost/function.hpp> #ifndef _CoreEv

因此,我创建了一个适用于线程的简单类-您可以将任何类的任何void函数添加到从我的类中增强的类的订阅函数列表中:

#include <iostream>
#include <vector>

#include <boost/thread.hpp>

// parts of c++0x std
#include <boost/bind.hpp> 
#include <boost/function.hpp>

#ifndef _CoreEvents_h_
#define _CoreEvents_h_

using namespace std ;
template <typename DataType >
class CoreEvents{

        typedef boost::function<void(DataType)>   Function;
        typedef std::vector<Function>      FunctionSequence;
        typedef typename FunctionSequence::iterator FunctionIterator; 

public:
        DataType* dataElement;
        FunctionSequence funcs;
        boost::thread_group tg;

        CoreEvents()
        {
                dataElement = new DataType();
        }
        // Function for adding subscribers functions
        // use something like std::bind(&currentClassName::FunctionToAdd, this, std::placeholders::_1) to add function to vector
        void Add(Function f)
        {
                funcs.push_back(f);
        }

        // Cast data to subscribers and clean up given pointer
        //ToDo: One  will be solved when pool of pre-initialized objects will be developed 
        virtual void Cast(){
                for (FunctionIterator it(funcs.begin()); it != funcs.end(); ++it){
                        DataType dataCopy = *dataElement;
                        tg.create_thread(boost::bind(*it, dataCopy));
                }
        }  
};
当我们处理线程时,这很简单——例如,我们可以随时调用create_thread,并在其他应用程序线程中完成所有需要的操作

但是,如果我们有app1 app2和app3,并且您希望共享来自一个进程的函数指针,并使用代理应用程序将该指针提供给另一个应用程序,以便可以使用上一个进程/应用程序的参数调用它,该怎么办

在现实生活中,如果我们有一个运行着不可编辑文本字段的应用程序,而运行着一个运行着可编辑文本字段的应用程序,情况会是这样。我们有一个应用程序№3可以将输入从可编辑TF连接到不可编辑TF

有可能吗?怎么做

我对C++很陌生,但我想我发现了一些:

禁止引用

参考文献也有同样的问题 作为指针的问题(主要是因为 它们被实现为指针)。 但是,不可能创建 完全可行的智能参考 当前在C++中(例如, 运算符。()不能重载)。 因此,如果用户想要 将对象放入共享内存中 对象不能有任何(智能或非智能) 作为成员的参考

只有当 映射的区域映射在同一区域中 所有进程中的基址共享 内存段。像指针一样,一个 放置在映射区域中的引用 应该只指向那个物体 映射区域

虚拟禁止

虚拟表指针和 虚拟表位于地址空间中 构建 对象,所以如果我们用 虚函数或虚基 类中放置的虚拟指针 共享内存将对无效 其他进程,它们将崩溃

这个问题很难解决 解决,因为每个过程都需要一个 不同的虚拟表指针和 包含该指针的对象 跨多个进程共享。即使 如果我们在 每个进程中的地址相同 虚拟表可以位于不同的位置 在每一个过程中都有地址。使能 共享对象的虚拟函数 进程间,深度编译器 变化是需要的,而且是虚拟的 功能会影响性能 打这就是为什么Boost.Interprocess 没有任何支持的计划 虚函数与虚函数 映射共享区域中的继承 进程之间

小心使用静态类成员

类的静态成员是全局的 对象的所有实例共享的对象 班级。因此,静态成员 在中作为全局变量实现 过程

当用静态 成员,每个进程都有自己的副本 的静态成员,因此更新 一个进程中的静态成员不存在 更改静态成员的值 这是另一个过程。所以要小心 在这些课上。静态成员是 如果他们只是 常量变量在 过程开始了,但他们没有 完全改变(例如,使用时 它们的值是 大家都一样


但我创建的所有应用程序都使用同一个库。当我需要最好的性能时,我会使用线程,但碰巧我需要进程间通信。那么,我该怎么做?如何创建一种机制来模拟急需的功能?

对不起,这个问题有点难以理解,但我会尝试回答

在进程之间共享函数指针是您几乎不应该做的事情。这很危险。共享非原始数据也不受欢迎,但在某些情况下可以


通常,您应该使用类似于消息传递的方式来实现此目的。您可能希望使用Boost.Interprocess共享参数。

几乎从不。。。意味着这是可能的…-我知道这很危险——我愿意冒险。怎么做这样的事?
someClass->Add(boost::bind(&someOtherClass::someVoidFunction, this, _1));