第八章 计时器(BEEPER1)

图片 1图片 2

很详细的计时器小说 介绍了两种定时器方法
http://www.jianshu.com/p/c167ca4d1e7e

第八章 计时器(BEEPER1)。职能如下:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
dispatch_source_set_event_handler(timer, ^{
    //@"倒计时结束,关闭"
    dispatch_source_cancel(timer);
    dispatch_async(dispatch_get_main_queue(), ^{

    });
});
dispatch_resume(timer);
 1 *-------------------------------------
 2     BEEPER1.C -- Timer Demo Program No.1
 3     (c) Charles Petzold, 1998
 4     -------------------------------------*/
 5 
 6 #include <Windows.h>
 7 
 8 #define ID_TIMER 1
 9 
10     LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
11 
12 int WINAPI WinMain( __in HINSTANCE hInstance
13     , __in_opt HINSTANCE hPrevInstance
14     , __in LPSTR lpCmdLine
15     , __in int nShowCmd )
16 {
17     static TCHAR szAppName[] = TEXT("Bepper1");
18     HWND hwnd;
19     MSG msg;
20     WNDCLASS wndclass;
21 
22     wndclass.style = CS_HREDRAW | CS_VREDRAW;
23     wndclass.lpfnWndProc = WndProc;
24     wndclass.cbClsExtra = 0;
25     wndclass.cbWndExtra = 0;
26     wndclass.hInstance = hInstance;
27     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
28     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
29     wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
30     wndclass.lpszMenuName = NULL;
31     wndclass.lpszClassName = szAppName;
32 
33     if (!RegisterClass(&wndclass))
34     {
35         MessageBox(NULL, TEXT("Program requires Windows NT!")
36             , szAppName, MB_ICONERROR);
37         return 0;
38     }
39 
40     hwnd = CreateWindow(szAppName, TEXT("Beeper1 Timer Demo")
41         , WS_OVERLAPPEDWINDOW
42         , CW_USEDEFAULT, CW_USEDEFAULT
43         , CW_USEDEFAULT, CW_USEDEFAULT
44         , NULL, NULL, hInstance, NULL);
45 
46     ShowWindow(hwnd, nShowCmd);
47     UpdateWindow(hwnd);
48 
49     while (GetMessage(&msg, NULL, 0, 0))
50     {
51         TranslateMessage(&msg);
52         DispatchMessage(&msg);
53     }
54 
55     return msg.wParam;
56 }
57 
58 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
59 {
60     static BOOL fFlipFlop = FALSE;
61     HBRUSH hBrush;
62     HDC hdc;
63     PAINTSTRUCT ps;
64     RECT rc;
65 
66     switch (message)
67     {
68     case WM_CREATE:
69         SetTimer(hwnd, ID_TIMER, 1000, NULL);
70         return 0;
71 
72     case WM_TIMER:
73         MessageBeep(-1);
74         fFlipFlop = !fFlipFlop;
75         InvalidateRect(hwnd, NULL, FALSE);
76         return 0;
77 
78     case WM_PAINT:
79         hdc = BeginPaint(hwnd, &ps);
80 
81         GetClientRect(hwnd, &rc);
82         hBrush = CreateSolidBrush(fFlipFlop ? RGB(255, 0, 0) : RGB(0, 0, 255));
83         FillRect(hdc, &rc, hBrush);
84 
85         EndPaint(hwnd, &ps);
86         DeleteObject(hBrush);
87         return 0;
88 
89     case WM_DESTROY:
90         KillTimer(hwnd, ID_TIMER);
91         PostQuitMessage(0);
92         return 0;
93     }
94 
95     return DefWindowProc(hwnd, message, wParam, lParam);
96 }
  • NSTimer
    必须投入Runloop、
    留存延迟、
    UIScrollView滑动会暂停计时(若不想被UIScrollView滑动影响,必要将
    timer 添加再到 UITrackingRunLoopMode 或
    直接抬高到NSRunLoopCommonModes 中)
  • GCD计时器 精度最好 ✨
  • CADisplayLink
    刷新频率固定 (取决CPU的无暇程度)、
    显示屏刷新时调用
    (CADisplayLink在健康状态下会在历次刷新落成都被调用,精确度格外高。但假如调用的法门比较耗时,当先了显示屏刷新周期,就会促成跳过多少次回调调用机会)、
    顺应做界面渲染(CADisplayLink可以保险系统渲染每一帧的时候大家的办法都被调用,从而保险了动画片的流畅性。)

图片 3

BEEPER1.C

后台常驻 的题材 看到了一篇小说
https://www.cnblogs.com/lyanet/archive/2013/03/26/2983079.html
还有另一篇
http://www.jianshu.com/p/d1ecc467faff
透过那五个
苹果文档说到其它利用都有3分钟的后台执行职责的年华
。。。跟苹果借点时间用用。。。不用配置info.plist
防止因为布署后台长期运营后,苹果审查出你滥用api(假诺您布署了
项目中必需求有相关的效益)

首先篇涉嫌了 应该在漫长职务达成后,我们要求做一些业务进展清理:

 思路:

 

  1. 完工全数的线程和定时器,不管他们是基础定时器依旧GCD中开创的。

  2. 调用UIApplication的endBackgroundTask:方法来截止后台职责。

  3. 将职务标识设置为UIBackgroundTaskInvalid,标志大家的职分已毕。

  通过标签的data-time-end和data-time-start来得到倒计时的竣事和始发时间(先河时间可传可不传)

说到底,当大家的使用回到前台,假若大家的后台任务还在推行中,大家须求保障大家在杀死它:

  调用counter方法时需传入{callback:function(回调函数来收取状态和时间距离),
countbeforeStart: Boolean(是还是不是要求开始倒计时,不传暗中同意不需求先河倒计时)}

要害代码放在上边避防丢失

  尽管有开端时间,则开始时间必须低于截至时间,否则弹出警告