- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在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()
关于c - C与LabVIEW的事件结构有何相似之处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2422147/
这个问题已经有答案了: What is the difference between a variable, object, and reference? [duplicate] (5 个回答) 已关
我正在使用以下代码来学习java套接字编程。它的作用是,client.java 程序从用户那里获取一个号码并将其发送到 sever.java。然后服务器将其乘以2并发回给客户端。在我的客户端程序中,它
我编写了一个自己开发的串行端口类,为了简单起见,我使用了阻塞/同步/非重叠。我浏览了所有 MSDN 文档,这对我来说很困难。 我在从端口打开、传输或接收字节方面没有任何问题。所有操作都是同步并且没有线
//Not finished -- disregard function evaluate() { var cdate = new Date(); var cday = cdate.getDa
我已经尝试过了,但它有效 例如: x= 523.897 y= x[0:"."] print y 我只想打印 523。如何让 Python 抓取字符串直到某个字母或数字? 最佳答案 行 y = x[0:
我想移动拐 Angular 处的方框(从左上角开始水平移动 Angular 落到右上角然后你去到右下角。 function myMove() { var elem = document.getEl
如何让侧边栏停止在第二个侧边栏部分而不是顶部? fiddle http://jsfiddle.net/EvAdP/2/ HTML I'm the header
我刚刚在大学开始我的第二门编程类(class),我们的第一个作业相当简单,旨在基本上检查我们的环境并检查我们是否知道如何通过类(class)网站提交作业。 当我运行我们提供的代码时,它卡在应该提示用户
我目前正忙于我的这个信息学元素(构建一个示例交友网站)。问题是我在把所有东西都放在正确的地方时遇到了一些麻烦。一切都很顺利,直到我的邮箱出现在错误的位置(但是,Dreamweaver 会按照我的意
我想,和你一样hover a GIF shot on Dribbble , 当光标位于元素高度顶部之后/50% 处时显示带有信息的 div。 测试示例 我做了这个,这是有效的,但有点棘手......特
我有一个下拉菜单,并且我已将 mouseenter 设置为选项。因此,如果鼠标位于触发器之外,菜单应该关闭。我正在使用 jQuery 1.8.0。这可能是 CSS 问题吗? 这是我初始化插件的代码。
我正在尝试在 Visual Basic for Applications 中编写一个 hello world 应用程序,即修改 Excel 工作表中的单元格。这是: Sub hello() D
我的应用程序使用 JSF 2.1 和 PrimeFaces。最近,由于一些线程卡住,观察到 CPU 利用率非常高。所有卡住线程的卡住线程转储都指向 javax.faces.component.UICo
在列出 aws cognito 用户时,我的 Node js 应用程序遇到问题。 仅当我有超过 60 个 Cognito 用户时才会出现此问题。 Reference of API 下面是我的代码片段。
我是 ubuntu 用户..我在 php 中有一个执行 python 文件的命令..python 文件设置为可执行文件..所以,我的 php 命令是:- shell_exec("try.py");
我正在尝试将剪贴板内容写入文件,但由于某种原因程序卡住了。 FILE *fp; fp = fopen("tmp.code","w"); fprintf(fp,getclip()); /*writes*
当用户向下滚动时,我使用此代码使侧边栏固定在某个 div 处。问题是我必须手动输入一个阈值数字,这并不总是理想的,因为该部分的位置可能会更改或在各种浏览器和系统之间不一致。我想知道是否有一种方法可以在
我有一个字符串数组,例如 first_page = {{"U","M","Y","Q","I","A","L","D","P"、"F"、"E"、"G"、"T"、"Z"、"V"、"W"、"H"、"O"、
我能否在页面上的特定 px 位置放置一个元素(例如图像),然后让文本围绕它流动? 必要时使用 JS/jquery。 我确实看到了这个Have text flow around an object th
第一次在这里提问。 我有两个简单的 Javascript 函数,1. 生成一个随机字母,2. 在每个单元格中使用单个字母填充 10x10 表格。创建表的主要函数是通过带有 onclick 的简单 HT
我是一名优秀的程序员,十分优秀!