mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-26 09:29:45 +00:00
Merge pull request #612 from TomHarte/HighPrecisionTimer
Sketches a high-precision timer class.
This commit is contained in:
commit
48d1d27067
@ -0,0 +1,27 @@
|
||||
//
|
||||
// CSHighPrecisionTimer.h
|
||||
// Clock Signal
|
||||
//
|
||||
// Created by Thomas Harte on 07/03/2019.
|
||||
// Copyright © 2019 Thomas Harte. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
/*!
|
||||
Provides a high-precision timer; provide it with a block and an
|
||||
interval, and it will ensure the block is performed as regularly
|
||||
as the system will allow at the specified intervals.
|
||||
|
||||
The block will be executed on an arbitrary thread.
|
||||
*/
|
||||
@interface CSHighPrecisionTimer: NSObject
|
||||
|
||||
/// Initialises a new instance of the high precision timer; the timer will begin
|
||||
/// ticking immediately.
|
||||
- (instancetype)initWithTask:(dispatch_block_t)task interval:(uint64_t)interval;
|
||||
|
||||
/// Stops the timer.
|
||||
- (void)invalidate;
|
||||
|
||||
@end
|
@ -0,0 +1,37 @@
|
||||
//
|
||||
// CSHighPrecisionTimer.m
|
||||
// Clock Signal
|
||||
//
|
||||
// Created by Thomas Harte on 07/03/2019.
|
||||
// Copyright © 2019 Thomas Harte. All rights reserved.
|
||||
//
|
||||
|
||||
#import "CSHighPrecisionTimer.h"
|
||||
|
||||
@implementation CSHighPrecisionTimer {
|
||||
dispatch_source_t _timer;
|
||||
dispatch_queue_t _queue;
|
||||
}
|
||||
|
||||
- (instancetype)initWithTask:(dispatch_block_t)task interval:(uint64_t)interval {
|
||||
self = [super init];
|
||||
if(self) {
|
||||
_queue = dispatch_queue_create("High precision timer queue", DISPATCH_QUEUE_SERIAL);
|
||||
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, _queue);
|
||||
if(_timer) {
|
||||
dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), interval, 0);
|
||||
dispatch_source_set_event_handler(_timer, task);
|
||||
|
||||
// TODO: dispatch_activate is preferred to dispatch_resume, but arrives only
|
||||
// as of macOS 10.12. So switch if/when upping the OS requirements.
|
||||
dispatch_resume(_timer);
|
||||
}
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)invalidate {
|
||||
dispatch_suspend(_timer);
|
||||
}
|
||||
|
||||
@end
|
Loading…
Reference in New Issue
Block a user