我指的是一个基于事件的程序,一个“静态”程序,不仅可以执行任务,还可以等待事件等,并且在用户手动关闭之前不会结束。
编辑:我在下面已经回答过,例如我们每天使用的程序,基于Windows,如Microsoft Word,Firefox等。这类程序叫做什么?怎么可能做那样的事情?编辑2:我将单独回复一些答案,但我最好在这里回复。
我想要做的程序就像蜘蛛一样在VPS作为守护进程工作。当它启动时,它应该看看是否有任务要做。如果是这样,它将生成必要的线程(它也是基于线程的),因此main函数需要基于事件的无限循环。
答案 0 :(得分:11)
这些程序通常围绕所谓的“event loop”编写。
程序的主要功能通常是伪造的,类似这样的东西:
while (!shouldClose()) {
Event e = getEvent();
dispatchEvent(e);
}
dispatchEvent
函数接受事件e
,确定它应调用哪个函数,然后使用事件的任何参数调用这些函数。
getEvent
函数可以是任意数量的函数,具体取决于程序的性质。对于交互式命令行程序,它可能只是从用户检索和解析一行文本。对于GUI程序,它可能正在等待鼠标点击或来自窗口系统的其他消息。对于网络服务,它可能正在等待传入的数据包。
例如,在GUI程序中,getEvent
可能会等待,然后从OS窗口系统接收鼠标单击消息。然后dispatchEvent
将查看鼠标单击事件,根据单击按钮的坐标确定,然后查找与该按钮对应的对象,并调用buttonObject.clicked()
。然后buttonObject.clicked
的实现负责执行应该是单击按钮的任何代码。一旦完成运行,控制将返回到事件循环,并处理下一个事件。
现在,显然,对于GUI程序来说,这可能会变得相当复杂,因此您通常不会从头开始编写自己的事件循环。相反,程序员经常使用图形框架为您提供这样的循环,然后只填写事件响应代码。对于命令行程序和网络服务,事件处理起来要简单一些,并且通常从头开始编写循环。
答案 1 :(得分:5)
由于您的描述非常模糊,可能意味着几件事:
如果您提供更多详细信息,我们可以进一步限制可能性。
<强>更新强>
像Firefox或Word这样的程序可以称为application。这些通常使用application frameworks开发,用各种编程语言编写。
答案 2 :(得分:2)
我认为你要问的是你所谓的没有运行完成的程序。它被称为“阻塞”程序。这是因为它在等待外部事件或输入导致其解除阻塞并执行某些工作时阻止执行。
“如何”取决于你在等什么。如果您正在等待用户输入,则在读取发生鼠标和键盘事件时取消阻止的事件队列时,通常会阻止GUI。如果您正在等待网络数据,那么您将被阻止等待套接字调用或可能的选择调用(监视多个描述符上的活动的方法)。如果您正在等待另一个进程,则可能会在读取管道或队列或可能是进程间信号量时被阻止。
这些机制通过不调度阻塞的线程执行来暂停执行,直到解除阻塞特定操作的条件变为真。
答案 3 :(得分:2)
简单地说,它被称为"Event-driven Program"。
答案 4 :(得分:2)
我会说“应用程序”或“服务”,具体取决于是否有GUI。
怎么可能做某事 像那样
由于您使用C ++标记了您的问题,我假设您要使用C ++构建Windows应用程序,如Microsoft Word或Excel?
您可以下载免费的Microsoft Visual Studio C ++ Express,阅读一些教程,购买书籍,并开始学习如何编写应用程序。像Excel这样的应用程序是由数千名开发人员组成的团队在20多年的时间里编写的。
有许多不同的方法可以编写Windows应用程序,很多人使用C ++以外的语言来编写这些,尽管C ++在商业应用程序中肯定非常流行,我相信Excel和Word是用C ++编写的。 C.
在StackOverflow上,我统计了二十多种用于编写Windows应用程序的不同语言,包括Python,C ++,Java,Delphi等等。
这样一个应用程序的主要结构看起来像这样,在python-like-pseudo-code中,与其他答案的C-like代码没有太大区别:
initialize_things()
while (!AreWeStoppingYet) :
event = GetAnEvent()
ProcessAnEvent(event)
有时上面的这个小循环是其他人所说的“框架”的一部分。换句话说,我自己从未真正编写过此代码,我已经为我编写了代码。我经常使用Delphi,这个小循环是一个名为Application的小对象的一部分。在许多框架上,包括Delphi和一些C ++框架,这个循环都隐藏在框架的源代码中,你甚至可能不会真正考虑它存在的事实。
答案 5 :(得分:1)
这种程序通常被称为具有GUI。
有许多库可以帮助您编写GUI - 在开源世界中,有例如GTK,它可以在包括Windows在内的许多平台上运行,您可以在C和C ++中使用它。
为了帮助您入门,这里有一个“Hello World”:http://library.gnome.org/devel/gtk-tutorial/stable/c39.html#SEC-HELLOWORLD
答案 6 :(得分:1)
嗯,您只需要让程序接收事件,例如:
有很多方法可以做到。
然后在前台运行它(如果您希望用户能够轻松地停止它)或作为各种操作系统下的后台进程(UNIX守护程序或Windows服务,或使用UNIX {{1的后台任务)或Windows &
)。
答案 7 :(得分:1)
这些程序通常在事件循环中运行,在相应的反应之前等待事件。如前所述,这不仅限于GUI应用程序,尽管它们是一个很好的例子。
聊天服务器程序是一个持久运行的非GUI程序的简单示例。它只是等待它直到它收到一条消息,然后它必须推送到所有连接的客户端。接收消息是事件触发器,然后使程序采取行动。在GUI程序中,事件触发器通常是鼠标单击或按下按钮,程序会对此作出反应。
视频游戏在某种意义上也利用了事件循环......当游戏还未结束时,他们必须更新世界/ NPC并在等待用户输入更新角色时每秒重绘帧数60次/ p>