怎么叫C/C++程序没完没了?

Posted

技术标签:

【中文标题】怎么叫C/C++程序没完没了?【英文标题】:How is called a C/C++ program without end? 【发布时间】:2011-03-08 06:23:53 【问题描述】:

我的意思是一个基于事件的程序,一个“静态”程序,它不只是执行任务,而是等待事件等,直到用户手动关闭它才会结束。

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

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

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

【问题讨论】:

您已经很好地描述了任何 GUI 驱动程序、系统服务、服务器或守护程序。执行单个任务并退出的通常称为“实用程序”,以区别于其他。 【参考方案1】:

这些程序通常是围绕所谓的“event loop”编写的。

程序的主要功能,在伪代码中,一般是这样的:

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

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

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

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

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

【讨论】:

好点!我还会添加一个系统睡眠,以避免半无限循环的 100% CPU 使用率。我已经编辑了主要帖子。谢谢。 在这类程序中通常不需要显式调用sleep,因为通常getEvent 会调用一个阻塞函数(例如selectread)将暂停程序,直到有新事件(新数据)可用。这优于显式调用sleep 并定期检查事件,因为您的程序可以立即响应,并且不会浪费任何时间检查不存在的数据。 好的,那么getEvent()函数将是gets()性质的函数,等待用户输入执行。感谢您清除此问题。 是的,getEvent 在我的示例中是一个函数的通用名称,它采取任何必要的操作来获取程序所需的输入,无论是窗口事件(例如鼠标单击)、键入的字符,网络数据包,来自其他程序的管道信息等。这几乎总是一个阻塞操作,除非您的程序在其“空闲”时间有其他有用的事情要做。 在许多基于网络的守护进程中,阻塞(使您的 CPU 免于全速运行)调用包括 select() 和其他 Socket Api 调用。【参考方案2】:

由于您的描述很模糊,它可能意味着几件事:

daemon 或 Windows service shell server ...

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

更新:

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

【讨论】:

【参考方案3】:

简单地说,就是"Event-driven Program"。

【讨论】:

这就是我最初看到的。现在能找到很多这类节目的资料,谢谢。【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

我会说“应用程序”或“服务”,这取决于是否有 GUI。

怎么可能做某事 像这样

由于您使用 C++ 标记了您的问题,我假设您想使用 C++ 构建 Windows 应用程序,如 Microsoft Word 或 Excel?

您可以下载免费的 Microsoft Visual Studio C++ Express,阅读一些教程,购买一本书,然后开始学习如何编写应用程序。像 Excel 这样的应用程序是由数千名开发人员在 20 多年的时间里编写的。

为 Windows 编写应用程序有很多不同的方法,许多人使用 C++ 以外的语言来编写这些,尽管 C++ 在商业应用程序中肯定非常流行,而且我相信 Excel 和 Word 是用 C++ 和C.

在 *** 上,我统计了两种用于编写 Windows 应用程序的不同语言,包括 Python、C++、Java、Delphi 等等。

这样一个应用程序的主要结构看起来像这样,在 python-like-pseudo-code 中,与其他答案的 C-like-code 没有太大区别:

initialize_things()

while (!AreWeStoppingYet) :
     event = GetAnEvent()
     ProcessAnEvent(event)

有时上面的这个小循环是其他人所说的“框架”的一部分。换句话说,我自己从来没有真正写过这段代码,我是为我写的。我经常使用 Delphi,这个小循环是一个名为 Application 的小对象的一部分。在许多框架(包括 Delphi 和一些 C++ 框架)上,这个循环隐藏在框架源代码中的某个位置,您甚至可能没有真正考虑过它存在的事实。

【讨论】:

好答案。在我的情况下,我正在做一个简单的 linux 守护进程。我已经编辑了主要帖子。谢谢。 问您问题的更好方法是“我如何开始在类似 Unix 的操作系统(如 Linux)中编写守护进程?”。【参考方案6】:

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

键盘输入。 来自网络的连接(套接字等)。 其他 IPC 机制(共享内存、信号量、信号)。

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

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

【讨论】:

【参考方案7】:

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

周围有许多库可以帮助您编写 GUI——在开源世界中,例如 GTK,它适用于包括 Windows 在内的许多平台,并且您可以在 C 和 C++ 中使用它。

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

【讨论】:

当您启动 Microsoft Word 时,它会等待事件(文件打开、键盘等),直到用户手动关闭它才会消失。然而 Word 不是一项服务。 @Pete Kirkham:是的,很难说这里要问什么。稍微修改了答案。 Work的例子很好。怎么叫这种类型的程序?怎么可能做这样的事情?谢谢。【参考方案8】:

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

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

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

【讨论】:

以上是关于怎么叫C/C++程序没完没了?的主要内容,如果未能解决你的问题,请参考以下文章

用 gdb 调试 C/C++ 程序

到底怎么在Linux里编写c程序啊?

C和C++怎么知道一个程序是不是已经安装并获取他的安装路径

在c\c++程序里怎么执行shell脚本命令?

C/C++程序中怎么会有静态地址?

C/C++程序中怎么会有静态地址?