Linux C编程:在linux服务器上实现番茄工作法

番茄工作法是简单易行的时间管理方法,是由弗朗西斯科·西里洛于1992年创立的一种相对于GTD更微观的时间管理方法。

使用番茄工作法,选择一个待完成的任务,将番茄时间设为25分钟,专注工作,中途不允许做任何与该任务无关的事,直到番茄时钟响起,然后在纸上画一个X短暂休息一下(5分钟就行),每4个番茄时段多休息一会儿。

摘自百度百科

番茄工作法的核心是专注工作25分钟,然后短暂休息。如果中途被打扰,本次番茄时段作废。

有时候辅助执行番茄工作法的软件也叫番茄时钟,或者番茄计时器。由于我们ICer一般从Windows远程登录到Linux服务器工作,我们可以在Linux服务器上实现一个简易的番茄计时器,我把它叫做“Work Timer”。

先来整理一下我们的需求:

以25分钟为单位计时

25分钟结束后,提醒休息

休息完后,自动进入下一个25分钟工作时间

需要提高专注力

这样做的好处是:1. 提高工作效率;2. 强制休息,保持头脑清醒。

一个简易的方案

调用0.5s定时器,每0.5s读取一次操作系统时间,实现一个时钟。

番茄计时开始时,记录一次系统时间time_start。每次0.5s中断服务函数里,对比系统时间与开始时间的差,如果时间差达到25分钟,就计时结束。

番茄计时结束时,弹出消息框提示该休息了。

休息片刻回来,关闭刚才的提示框,下一个番茄计时则自动开始。

辅助功能:

1. 系统时间调整

2. 番茄工作时间统计

关于如何提高专注力:

手机:手机调震动、静音、关闭网络、关机等

Windows:VNC全屏、关闭Outlook邮件提醒等

其它:戴耳机、听音乐等

一般的番茄计时器都有一个醒目倒计时画面,我觉得这个不太好,很可能会一会儿看一下还剩几分钟,这样反而不利于专注。我这个解决方案里,没有倒计时显示,仅有到时提醒。

实现细节

运行图形界面如下:

非常简洁,就是一个系统时钟。没有菜单栏、状态栏。可以显示在其它软件之上,不担心被emacs或者verdi挡住。

所有的操作都通过右键菜单:Quit(退出程序),Pause/Resume Timer(中断番茄工作计时),+/- 1分钟5分钟(调整系统时钟偏差。一般我们ICer没有权限修改系统时间,但可以自己做一个时钟,想调快调慢都行)。

其中,Pause Timer是在中途遇到其它不得不打断的事情时暂时关闭番茄计时器的。Resume Timer是忙完其它琐碎的事后,重新开始工作时恢复番茄计时器的。

番茄时间计时结束提醒如下。提醒休息的同时,统计一下今天已经执行了几个番茄工作时间。休息片刻回来再点“OK”,下一个番茄工作时间又开始了。

源码分析

用GTK实现图形界面

主要用到了gtk_window和gtk_button。在init和create组件后,设置各种属性,如无边框、大小等。再g_signal_connect设置组件与处理函数的对应关系。最后,gtk_widget_show显示出图形界面,并进入检测鼠标和键盘等事件的Loop(gtk_main)。

实现0.5秒的定时器

先在主函数里,调用g_timeout_add增加一个定时器,设置时间为500ms,设置处理函数timer_handler。

在处理函数里,读取系统时间cur_time,用time_adj进行时间调节,再转成tm结构体。tm结构体存储着年月日时分秒,还有星期。

再格式化成字符串,“2018-12-02\n08:50 Sun”或者“2018-12-02\n08 50 Sun”,小时和分钟的冒号可以半秒显示、半秒不显示,看起来就是一个在走的时钟了。

实现25分钟的计时器

在定时处理函数里,当前时间 - 开始时间 >= 25分钟,则重装开始时间,并弹出消息框提醒番茄工作时间结束,注意休息。

实现消息框

封装一个gtk_message_dialog。设置了两个属性,“居中”和“保持在其它程序之上”,这样的提醒最为醒目,不管你在做什么,仿真还是调试,消息框总能跑到你眼前。

实现右键菜单

用event-button == 3判断是右键,动态创建gtk_menu、gtk_menu_item,设置菜单的回调函数,最后显示菜单gtk_menu_popup。

可扩展性

基于本番茄工作计时器的框架,你可以定制自己的工作方式,也可以实现自己的定时任务提醒,定时自动执行任务,如自动项目备份等。

获取源码

https://github.com/chenfengrugao/gtimer

欢迎关注ExASIC

分享数字集成电路设计中的经验和方法

分享让工作更轻松

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181203G0B0UK00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券