本次主要和大家分享两个闹钟程序。它们分别是同步版本、多进程版本,之后和大家分享多线程版本。

该程序循环接受用户的输入信息,直到出错或者输入完毕。用户输入的信息第一部分是闹钟等待时间(以秒为单位),第二部分是闹钟时间到达后所显示的信息。

一 同步版本

创建Qt控制台程序,由于闹钟程序是c语言的,需要包含如下2个头文件。第一个是标准io的头文件,第二个是sleep()函数用到的头文件。接下来上码。

#include <QCoreApplication>

#include <stdio.h>

#include <unistd.h>

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

int seconds;

char line[128];

char message[64];

while (1) {

printf ("Alarm> ");

if (fgets (line, sizeof (line), stdin) == NULL) exit (0);

if (strlen (line) <= 1) continue;

if (sscanf (line, "%d %64[^\n]",&seconds, message) < 2)

{

fprintf (stderr, "Bad command\n");

} else {

sleep (seconds);

printf ("(%d) %s\n", seconds, message);

}

}

return a.exec();

}

程序过程:

fgets(), c语言函数,程序中是从标准输入流读取并存储到line中,当读取(n-1)个字符、或读取到换行符时,或到达文件末尾时则停止。程序中如果读取结果为NULL,则程序退出。(出错或者到达文件尾部)如果读取长度不大于1,比如直接按下Enter键,则重新循环。

sscanf(), 从字符串中读取与指定格式相符的数据,成功时返回参数数目,失败返回-1。程序中是解析line中的字符串,将秒数解析到seconds中,显示信息解析到message中。集合操作 %64[^\n]——%64表示最大取64个字节,[^\n]匹配非\n的任意字符,贪婪性。即不要换行符,最多读64个字节。

成功解析字符串后,延时、打印信息。

缺点:一次只能处理一个闹钟请求。实际上是把希望用异步方式实现的工作用同步方式实现了。

二 多进程版本

有多种异步实现该程序的方法。其中一种方式是为每个命令使用fork调用生成一个子进程。这样可以随时输入命令行,彼此独立运行,不会阻塞等待。程序难点在于对子进程的资源回收,不做重点说明。

上码:

#include <QCoreApplication>

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>

#include <wait.h>

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

char line[128];

int seconds;

pid_t pid;

char message[64];

while (1) {

printf ("Alarm> ");

if (fgets (line, sizeof (line), stdin) == NULL) exit (0);

if (strlen (line) <= 1) continue;

if (sscanf (line, "%d %64[^\n]",

&seconds, message) < 2) {

fprintf (stderr, "Bad command\n");

} else {

pid = fork ();

if (pid == (pid_t)-1)

printf("faild\n");

if (pid == (pid_t)0) {

sleep (seconds);

printf ("(%d) %s\n", seconds, message);

exit (0);

} else {

do {

pid = waitpid ((pid_t)-1, NULL, WNOHANG);

if (pid == (pid_t)-1)

printf("Wait for child\n");

} while (pid != (pid_t)0);

}

}

}

return a.exec();

}

程序说明:

pid_t 对应头文件#include <sys/types.h>,waitpid函数对应#include <wait.h>头文件。

成功解析输入信息后,创建子进程延时、显示信息。父进程则等待子进程结束并回收资源,通常是调用某个waitpid函数。

WNOHANG属性使父进程不必挂起等待子进程结束。如果有子进程终止,则waitpid ()函数回收子进程资源,如果没有子进程结束,该函数立即返回0。父进程继续回收终止的子进程直到没有子进程终止。

程序运行结果如图:

欢迎大家在公众号中交流!

异步编程举例之闹钟程序相关推荐

  1. 深入理解python异步编程_深入理解Python异步编程

    1 什么是异步编程 1.1 阻塞程序未得到所需计算资源时被挂起的状态. 程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的. 常见的阻塞形式有:网络I/O阻塞.磁盘I/O ...

  2. [你必须知道的异步编程]——异步编程模型(APM)

    本专题概要: 引言 你知道APM吗? 你想知道如何使用异步编程模型编写代码吗? 使用委托也可以实现异步编程,你知道否? 小结 一.引言 在前面的C#基础知识系列中介绍了从C#1.0--C#4.0中一些 ...

  3. 异步编程中的最佳做法(Async/Await) --转

    近日来,涌现了许多关于 Microsoft .NET Framework 4.5 中新增了对 async 和 await 支持的信息. 本文旨在作为学习异步编程的"第二步":我假设 ...

  4. C#异步编程-------异步编程模型(APM)

    术语解释: APM               异步编程模型, Asynchronous Programming Model EAP                基于事件的异步编程模式, Event ...

  5. [进阶] --- Python3 异步编程详解(史上最全篇)

    [进阶] - Python3 异步编程详解:https://blog.csdn.net/lu8000/article/details/45025987 参考:http://aosabook.org/e ...

  6. 认识Java异步编程

    一 .认识异步编程 通常Java开发人员喜欢使用同步代码编写程序,因为这种请求(request)/响应(response)的方式比较简单,并且比较符合编程人员的思维习惯;这种做法很好,直到系统出现性能 ...

  7. [转][进阶]-Python3 异步编程详解

    目录 1 什么是异步编程 1.1 阻塞 1.2 非阻塞 1.3 同步 1.4 异步 1.5 并发 1.6 并行 1.7 概念总结 1.8 异步编程 1.9 异步之难(nán) 2 苦心异步为哪般 2. ...

  8. async And await异步编程活用基础

    async And await异步编程活用基础 原文:async And await异步编程活用基础 好久没写博客了,时隔5个月,奉上一篇精心准备的文章,希望大家能有所收获,对async 和 awai ...

  9. Java 异步编程 (5 种异步实现方式详解)

    同步操作如果遇到一个耗时的方法,需要阻塞等待,那么我们有没有办法解决呢?让它异步执行,下面我会详解异步及实现 @mikechen 目录 什么是异步? 一.线程异步 二.Future异步 三.Compl ...

  10. [进阶]-Python3 异步编程详解(史上最全篇)

    目录 1 什么是异步编程 1.1 阻塞 1.2 非阻塞 1.3 同步 1.4 异步 1.5 并发 1.6 并行 1.7 概念总结 1.8 异步编程 1.9 异步之难(nán) 2 苦心异步为哪般 2. ...

最新文章

  1. 打包phar文件过大的问题。
  2. python连接sqlserver_python 链接sqlserver 写接口实例
  3. 源码读不会,小白两行泪!
  4. Sybase identity 字段
  5. 测试双打:模拟,假人和存根
  6. python安全攻防---爬虫基础---get和post提交数据
  7. unity vs没有智能提示_Unity博主营地你不可不知的Unity C#代码小技巧
  8. php图片旋转显示不出来的,php – 我服务的图像不正确,它们都显示为旋转90度
  9. 【Python-3.3】遍历字典键值练习
  10. Windows10与Vmware配置Windowsserver2003共享磁盘
  11. c语言 graph,基于图(graph)的应用举例
  12. 解决Oracle监听器服务不能启动的问题
  13. qss设置平面按钮_QToolButton设置QSS
  14. 微信小程序开发文档-萧然 8.28
  15. 2022淘宝双十一优惠券如何叠加使用?淘宝双十一优惠券叠加规则介绍
  16. 西门子实数转整数_怎样将实数转换成整数
  17. win10安装Vmware虚拟机黑屏的解决
  18. 【无标题】人工智能的定义
  19. Java8函数式接口与Lambda表达式
  20. Java基础:方法和类详解

热门文章

  1. 使用sikuli测试web网页实例
  2. 用Python做的整蛊小程序——整点阴间的东西
  3. 2020年中国保理行业市场现状分析,独立化、创新化和多产业渠道是发展关键「图」
  4. 微软漏洞导致SQL注入威胁
  5. ssd测试软件寿命查看,SSD固态硬盘使用寿命检测方法 固态硬盘怎么测剩余寿命?...
  6. ElasticSearch7.3.0 集群搭建及配置安全认证
  7. IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
  8. java获取文件名后缀
  9. android 高仿网易新闻,Android实战:仿网易新闻app--简介
  10. 邮箱收取后删除服务器邮件设置,邮件为什么会被客户端(POP)收取并删除?能不能避免这种情况?...