Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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
发生GUI事件。与LabVIEW相比,Windows中的每个子窗口(LabVIEW:控件或指示器)都有更多的事件GetMessage()只是在每个事件上返回,随后必须进行精细过滤(如LabVIEW中),通常使用DispatchMessage()和窗口的事件处理程序过程WindowProc()及其或多或少较大的switch()语句_C_Events_Labview - Fatal编程技术网

发生GUI事件。与LabVIEW相比,Windows中的每个子窗口(LabVIEW:控件或指示器)都有更多的事件GetMessage()只是在每个事件上返回,随后必须进行精细过滤(如LabVIEW中),通常使用DispatchMessage()和窗口的事件处理程序过程WindowProc()及其或多或少较大的switch()语句

发生GUI事件。与LabVIEW相比,Windows中的每个子窗口(LabVIEW:控件或指示器)都有更多的事件GetMessage()只是在每个事件上返回,随后必须进行精细过滤(如LabVIEW中),通常使用DispatchMessage()和窗口的事件处理程序过程WindowProc()及其或多或少较大的switch()语句,c,events,labview,C,Events,Labview,大多数Tookit使用“事件推送”样式,这与事件结构不相等。中断驱动的程序也是如此 如果使用了超时,请认为在调用具有零文件句柄的MsgWaitForMultipleObjects()之前先调用peek消息()。当给定时间范围内没有事件到达时,超时情况适用 实际上,LabVIEWs事件结构应该在一个单独的循环中。一个单独的循环就是一个线程。对于典型的Win32编程,主线程中使用了GetMessage(),并且根据需要通过用户交互生成额外的(“工作者”)线程 LabVIEW无法轻松创建线程。只有通过

大多数Tookit使用“事件推送”样式,这与事件结构不相等。中断驱动的程序也是如此

如果使用了超时,请认为在调用具有零文件句柄的
MsgWaitForMultipleObjects()
之前先调用
peek消息()。当给定时间范围内没有事件到达时,超时情况适用

实际上,LabVIEWs事件结构应该在一个单独的循环中。一个单独的循环就是一个线程。对于典型的Win32编程,主线程中使用了
GetMessage()
,并且根据需要通过用户交互生成额外的(“工作者”)线程

LabVIEW无法轻松创建线程。只有通过调用异步子vi才能实现。真正地因此,大多数LabVIEW程序使用第二个while循环作为永久可用的工作线程,该线程将在必须执行某些操作时运行,否则将阻塞(即停止消耗CPU电源)。为了指示必须在后台执行的操作,使用了一个队列。 作为一个坏的副作用,当工作线程执行某些操作时,用户不能在后台执行其他操作,因为只有一个工作线程

LabVIEWs事件结构与其他编程语言有很大区别:LabVIEW事件可以有多个使用者!如果使用多个事件结构,则一切都会继续正常工作(具有布尔返回值的事件除外)。在Windows中,事件被发布到特定的线程,主要是发布到Windows的线程。要提供多个线程,必须多次发布事件。与其他编程语言类似。那里的事件由类似于LabVIEW“队列”相关函数的功能来处理:如果有人接收到事件,它将退出队列

多目标要求每个消费者以某种方式向生产者注册自己。对于GUI事件,这是自动完成的。对于用户事件,这必须以编程方式完成。参见LabVIEW示例


在Windows中使用DDE实现将事件分发到多个侦听器,但这仅适用于进程而不是线程。使用
DdeConnect()
或类似工具注册到线程,并将事件推送到回调函数。(更确切地说,Win32是如何工作的,
GetMessage()
接收DDE消息,而
DispathcMessage()
实际上调用回调函数。)

核心语言不提供此类功能。您使用库或操作系统API。您可能想看看National Instruments的CVI是如何做到这一点的。不过,我不确定CVI是否适用于Linux。如果硬件提供了足够的中断机制并且操作系统支持,则不需要轮询。没有人喜欢忙着等待,这是千真万确的。我曾考虑加入一个关于中断处理程序的特殊情况的条款,但我认为这对问题试图解决的问题没有什么帮助。。如果代码在应用层而不是内核中运行,则无法直接访问中断回调。相反,您可以通过上面提到的select系统调用间接地从中断处理程序获得通知。不幸的是,大多数硬件都是基于中断的。被轮询的设备是响应任何远程现代操作系统上的周期性计时器中断而被轮询的。在任何情况下,第一句话“事件结构实际上只是一个对您隐藏轮询的抽象。”都是错误的,具有高度误导性,应该删除。它是从select()或类似的东西中提取的,而不是从轮询中提取的。@reinerpost:谢谢,我澄清了答案。我认为你有权认为这是误导。在Linux上,系统调用几乎相同——请查看Unix机器上poll()系统调用的手册页。select()的功能几乎相同。事实上,一个调用通常只是另一个调用的包装。在这种情况下,如果说poll()或select()上的某些东西是抽象的,那真是令人毛骨悚然。然而,在这个术语之外,术语polling通常是交替使用的“忙碌等待”,所以我认为这就是我误入歧途的地方。
 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()