gpt4 book ai didi

c - C与LabVIEW的事件结构有何相似之处?

转载 作者:太空狗 更新时间:2023-10-29 14:54:32 25 4
gpt4 key购买 nike

在LabVIEW中我经常使用的一种编程结构是Event Structure。这给我带来的好处是不必通过轮询不必要地浪费CPU周期,而仅在生成我感兴趣的事件时才执行操作。

作为一个对C有相当了解的经验丰富的LabVIEW程序员,我很好奇如何在C中模拟LabVIEW的事件结构。最好在Linux下。一个小代码示例(如上面的链接中的示例)说明了如何完成此操作,将不胜感激。另外,如果已经存在(用于Linux的)第三方库来将此事件框架添加到C中,那也很高兴。谢谢。

最佳答案

事件结构实际上只是对您隐藏执行线程的一种抽象。必须在计算机上的某个地方运行一些代码,这些代码正在检查这些事件,然后调用事件处理程序。在C语言中,您应该自己提供此代码(程序的“主循环”)。此代码将检查您感兴趣的各种事件源,并调用事件处理程序函数。

然后,技巧就变成了如何不让这个主循环疯狂地旋转CPU。一个简单的技巧是让主循环休眠一段时间,然后检查是否需要处理任何事件,然后再次休眠。这具有引入延迟的缺点。如果适用,一个更好的技巧是让操作系统作为其正常操作的一部分进行这些检查,然后在发生有趣的事情时唤醒应用程序的主循环。在Linux中,这是通过“选择”系统调用完成的,但是select的局限性在于它只能指定可以与文件描述符关联的资源,因此设备,stdin,文件,网络端口都可以。

编辑:为了澄清我的反对者:我并不否认硬件中断的存在。是的,在代码可以直接访问其要处理的所有事件(例如嵌入式系统或设备驱动程序)的硬件中断的情况下,您可以编写具有多个不忙于等待或休眠的入口点的真正“事件驱动”代码。但是,在Linux下运行的普通应用程序级C程序中,此代码体系结构实际上并不存在,而是在应用程序级进行仿真。任何Linux应用程序都会有一个主循环和至少一个执行线程。该线程可能会被调度程序暂停,但是它始终存在,并且始终在特定指令处具有指令指针。如果代码离开了main(),程序将结束。没有代码可以从main返回并稍后从内核获取回调的功能。该代码具有单个入口点,并且必须手动调用其各种事件处理程序。除了在设备驱动程序(或使用信号的非常特定的系统代码)中之外,如果用户单击某个菜单项,而您的代码正在运行,无法检测到此事件本身,则内核或硬件将无法自动调用特定功能,并调用正确的事件处理程序。

您可以告诉LabView“当XX发生时调用此函数”。在C语言中,您告诉自己的事件分发代码“XX发生时调用此函数”。

我要说的(可怜吗?)是事件框架体系结构不是C/Linux应用程序固有的。它必须由您的代码通过具有主分发线程来模仿,该主分发线程给出事件驱动框架的外观。您可以手动执行此操作,也可以使用在后台执行此操作的事件库来呈现事件驱动模型的外观。 LabView采用第二种方法,因此在没有事件发生时似乎没有代码在运行,但实际上,是LabView自己的C++代码正在运行以管理事件队列。这并不意味着它一直都在忙于等待,正如我之前说过的那样,在执行诸如select和sleep之类的系统调用之前,代码可以在没有工作要做时使用它来产生cpu时间,但是代码不能简单地停止执行。

假设您要编写一个带有两个事件处理程序的“事件驱动”程序。每十秒钟调用一次,称为tick(),每按下一次键一次,调用一次,称为key();每键入“foobar”一次,一次调用,一次称为foobar()。您可以定义这三个事件处理程序,但此外,您还需要一些 dispatch 主线程,基本上

 while not quitting
If 10 seconds have elapsed, call tick()
If Key has been Pressed
call key()
add save the key to our key buffer
If buffer now contains "foobar" call foobar() and clear buffer
Wait()

如果您关心的所有事件都是系统级事件或时间级事件,则可以通过Wait()告诉内核“这些情况之一发生时叫醒我”,因此我不需要“忙碌等待” ,但是您不能简单地告诉内核“按下foobar时调用foobar()”。您必须具有模拟事件结构的应用程序级分发代码。您是C程序,只有一个来自内核的入口点如果您查看提供事件分配模型的库(例如Qt),则会发现它们在幕后这样工作。

关于c - C与LabVIEW的事件结构有何相似之处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2422147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com