我有要求组件负责接收消息和处理消息。 应该有一个通用的消息接口,如uint8数组(它是一个二进制消息)和一个通用框架,从外部配置文件读取,一个处理程序列表。 处理程序应实现通用接口,例如: -

uint8[] process(uint8[] message);

每个处理程序都应处理消息并将处理后的消息返回给框架,以便框架可以将处理后的消息传递给下一个处理程序,依此类推。 这种方法的优点在于它可以通过在配置文件中添加新的处理程序来允许在运行时添加新功能。 通用框架应该初始化新的处理程序,将它放在处理程序的相应位置,并通过所有处理程序传递消息。

我已经在Java中多次实现了这种方法,但我很难在C和C ++中实现它。 例如在C中,我想也许通过一个指向框架的函数指针来注册每个处理程序的进程函数,这样框架就可以将消息传递给每个处理程序。 但我不知道如何基于配置文件初始化处理程序。 配置文件将包含处理程序的“String”名称。 main方法如何将该字符串名称映射到处理程序文件?

任何指向存在这种模式的代码的指针都将非常有用。

===============>>#1 票数:2

对于C,您有几个选择。

一种是使用dlsym()或其等价物来查找与指定为字符串的函数名称对应的函数指针。

另一种是使用预定的名称数组和相应的函数指针。 如果接口变化,这会变得混乱(尽管dlsym()也存在问题)。

struct func_name
{
    const char *name;
    uint8   (*function)(void);
};

static const struct func_name func_list[] =
{
    { "function1",       function1       },
    { "anotherfunction", anotherfunction },
};

然后,您可以使用搜索(如果按顺序保留名称,可能是二进制搜索,与我的示例不同),以查找与名称对应的函数指针。 与使用dlsym()进行查找相比,此技术的一个优点是数组中的名称不需要与函数名称匹配,因此如果有意义,您可以提供别名。

===============>>#2 票数:2 已采纳

好吧,如果你的配置文件说:

handler1.so
handler2.so
handler3.so

你在Linux平台上,你可以这样做:

void *lib = dlopen(name, RTLD_NOW);
typedef uint8* (handler_t)(uint8*);
handler_t *func = (handler_t*)dlsym("handler");

对于配置文件中的每个名称。 这会动态加载一个共享库,每个库都包含一个处理函数(名为“handler”)。

对于其他操作系统,存在类似的工具(Windows上的LoadLibrary,例如* .dll)。

  ask by Jimm translate from so

未解决问题?本站智能推荐:

5回复

在我的情况下用C#编写服务器应用程序是否合理?

我希望它能在Windows服务器上运行。 它将是一个云型服务器 - 它将由运行在世界各地的不同机器上的模块\\部件组成,使用http \\ tcp + upnp相互连接 每台机器上都会有控制\\监控\\观察模块,以提供性能统计数据 这个网将用于大量的VIDEO \\
2回复

如何在不使用汇编的情况下以独立于cpu的方式从C / C ++应用程序进行Linux系统调用? [关闭]

我正在寻找一个程序,该程序将需要对进程进行低级工作(例如,使用fork系统调用等)。 该程序将用C ++编写,并且只能在Linux上运行。 理想情况下,这将是整个CPU架构(即86,x86_64和ARM)与只不过是重新编译更便携,但我只真正需要x86_64的支持。 由于每个Linux系
4回复

在没有库的情况下用C解析XML。 [关闭]

谁能给我概述仅使用标准库在独立C中解析xml的过程。 我想以此作为实践,因为这实际上是一个有用的项目。 我看到的大多数示例似乎都大量使用了指针以及结构数组。 因此,任何提示或大纲将不胜感激。
2回复

在没有窗口的情况下运行控制台应用程序

我有3个控制台程序(.exe),我想从一个控制台应用程序运行它们而不显示3个控制台程序的窗口。 所有程序都是用VC ++编写的。 关于如何执行此操作的任何建议?
20回复

用C或C ++编写Android应用程序? [关闭]

我正在尝试开发/移植游戏到Android,但是它在C中,并且Android支持Java,但我确信必须有一种方法可以在那里获得一个C应用程序,任何人都知道有关该主题的良好教程? 谢谢!
3回复

C / C ++应用程序的新手设计注意事项

我对编程“较大”的应用程序很陌生。 现在,我已经在Visual C ++ 2010中编写了一个包含几千行代码的命令行应用程序,该应用程序可以正常编译和运行。 大多数代码都是C兼容的(我认为),但是,我发现在这里和那里使用一些C ++构造很有用。 例如,有时我使用new / delete而不
2回复

extern“C”(C链接)默认情况下

题 GCC,MSVC或Clang,或某些组合支持设置链接默认为C? 背景 我有一个大型的混合C / C ++项目,虽然使用C链接在C ++源代码中导出符号既简单又合乎逻辑,但这些相同的源代码假设项目其余部分的内容都在C ++链接下。 当前的情况要求我明确地包装C源代码中定
1回复

我们可以仅使用C或C ++创建android应用程序吗? [关闭]

已关闭 。 这个问题需要更加集中。 它当前不接受答案。 了解更多 。 想改善这个问题吗?
13回复

分析永不退出的基于C或C ++的应用程序[关闭]

对于在我们手动重启机器之前从未退出的应用程序分析我有一个小小的疑问。 我使用像valgrind这样的工具来讨论内存泄漏或任何在某个时间后退出的应用程序的膨胀。 但是有没有任何工具可以用来告诉应用程序在各个阶段创建的内存消耗,膨胀和开销,如果可能的话? 注意: 我更感兴趣的是了解
3回复

在我的网站上运行python,C,C ++应用程序[关闭]

很难说出这里的要求。 这个问题是模棱两可的,模糊的,不完整的,过于广泛的或修辞性的,不能以目前的形式合理地回答。 如需帮助澄清此问题以便可以重新打开, 请访