繁体   English   中英

如何称之为C / C ++程序而没有结束?

[英]How is called a C/C++ program without end?

我的意思是一个基于事件的程序,一个“静态”程序,它不仅可以执行任务,还可以等待事件等,并且在用户手动关闭它之前不会结束。

编辑:我已在下面回答,例如我们每天使用的程序,基于Windows,如Microsoft Word,Firefox等。这类程序叫做什么? 怎么可能做那样的事情?

编辑2:我打算单独回复一些答案,但我最好在这里回复。

我想要做的程序就像蜘蛛一样在VPS中作为守护进程工作。 当它启动时,它应该看看是否有任务要做。 如果是这样,它将生成必要的线程(它也是基于线程的),因此main函数需要基于事件的无限循环。

这些程序通常围绕所谓的“ 事件循环 ”编写。

该程序的主要功能通常是在psuedocode中,如下所示:

while (!shouldClose()) {
   Event e = getEvent();
   dispatchEvent(e);
}

dispatchEvent函数获取事件e ,确定它应调用哪个函数,然后使用事件的任何参数调用这些函数。

getEvent函数可以是任意数量的东西,具体取决于程序的性质。 对于交互式命令行程序,它可能只是从用户检索和解析一行文本。 对于GUI程序,它可能正在等待鼠标点击或来自窗口系统的其他消息。 对于网络服务,它可能正在等待传入的数据包。

例如,在GUI程序中, getEvent可能会等待,然后从OS窗口系统接收鼠标单击消息。 然后dispatchEvent将查看鼠标单击事件,根据单击按钮的坐标确定,然后查找与该按钮对应的对象,并调用buttonObject.clicked() 然后buttonObject.clicked的实现负责执行应该是单击按钮的任何代码。 一旦完成运行,控制将返回到事件循环,并处理下一个事件。

现在,显然,对于GUI程序,这可能会变得相当复杂,因此您通常不会从头开始编写自己的事件循环。 相反,程序员经常使用图形框架为您提供这样的循环,然后只填写事件响应代码。 对于命令行程序和网络服务,事件处理起来要简单一些,并且通常从头开始编写循环。

由于您的描述非常模糊,因此可能意味着以下几点:

如果您提供更多详细信息,我们可以进一步限制可能性。

更新:

像Firefox或Word这样的程序可以称为应用程序 这些通常使用以各种编程语言编写的应用程序框架开发。

我想你要问的是你所谓的程序没有完成。 它被称为“阻塞”程序。 这是因为它在等待外部事件或输入导致其解除阻塞并执行某些工作时阻止执行。

“如何”取决于你在等什么。 如果您正在等待用户输入,则在读取发生鼠标和键盘事件时取消阻止的事件队列时,通常会阻止GUI。 如果您正在等待网络数据,那么您将被阻止等待套接字调用或可能的选择调用(监视多个描述符上的活动的方法)。 如果您正在等待另一个进程,则可能会在读取管道或队列或可能是进程间信号量时被阻止。

这些机制通过不调度阻塞的线程执行来暂停执行,直到解除阻塞特定操作的条件变为真。

简而言之,它被称为“事件驱动程序”

我会说“应用程序”或“服务”,取决于是否存在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 ++框架,这个循环都隐藏在框架的源代码中,你甚至可能不会真正考虑它存在的事实。

这种程序通常被称为具有GUI。

有许多库可以帮助您编写GUI - 在开源世界中,有GTK ,它可以在包括Windows在内的许多平台上运行,您可以在C和C ++中使用它。

为了帮助您入门,这里有一个“Hello World”: http//library.gnome.org/devel/gtk-tutorial/stable/c39.html#SEC-HELLOWORLD

好吧,你只需要有一个方法让程序接收事件,例如:

  • 键盘输入。
  • 通过网络连接(套接字等)。
  • 其他IPC机制(共享内存,信号量,信号)。

有很多方法可以做到这一点。

然后在前台运行它(如果您希望用户能够轻松地停止它)或在各种操作系统下运行后台进程(UNIX守护程序或Windows服务,或使用UNIX &或Windows start的后台任务)。

这些程序通常在事件循环中运行,在响应之前等待事件。 如前所述,这不仅限于GUI应用程序,尽管它们是一个很好的例子。

聊天服务器程序是持久运行的非GUI程序的简单示例。 它只是等待它直到它收到一条消息,然后它必须推送到所有连接的客户端。 接收消息是事件触发器,然后使程序采取行动。 在GUI程序中,事件触发器通常是鼠标单击或按下按钮,程序对此作出反应。

视频游戏在某种意义上也利用了事件循环......当游戏还未结束时,他们必须更新世界/ NPC并在等待用户输入更新角色的同时每秒重绘帧数60次

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM