You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					58 lines
				
				1.7 KiB
			
		
		
			
		
	
	
					58 lines
				
				1.7 KiB
			| 
								 
											6 years ago
										 
									 | 
							
								#pragma once
							 | 
						||
| 
								 | 
							
								#include <memory>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "J2534Frame.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class J2534Connection;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								An Action represents a unit of work that can be scheduled for execution at a later time.
							 | 
						||
| 
								 | 
							
								Actions are not guaranteed to be run at their specified time, but a best effort is made.
							 | 
						||
| 
								 | 
							
								An Action will never execute early, but can execute later depending on what is in the
							 | 
						||
| 
								 | 
							
								queus.
							 | 
						||
| 
								 | 
							
								Many different operations are based on this base class. Instead of making a thread,
							 | 
						||
| 
								 | 
							
								consider if the work can be offloaded to the Task Queue.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								class Action
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									Action(
							 | 
						||
| 
								 | 
							
										std::weak_ptr<J2534Connection> connection,
							 | 
						||
| 
								 | 
							
										std::chrono::microseconds delay
							 | 
						||
| 
								 | 
							
									) : connection(connection), delay(delay) { };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Action(
							 | 
						||
| 
								 | 
							
										std::weak_ptr<J2534Connection> connection
							 | 
						||
| 
								 | 
							
									) : connection(connection), delay(std::chrono::microseconds(0)) { };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									//The function called by the task runner when this action is to be invoked.
							 | 
						||
| 
								 | 
							
									virtual void execute() = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									//Reschedule this Action for now().
							 | 
						||
| 
								 | 
							
									void scheduleImmediate() {
							 | 
						||
| 
								 | 
							
										expire = std::chrono::steady_clock::now();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									//Reschedule this Action relative to its last expiration time.
							 | 
						||
| 
								 | 
							
									void scheduleDelay() {
							 | 
						||
| 
								 | 
							
										expire += this->delay;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									//Reschedule this action {delay} after now().
							 | 
						||
| 
								 | 
							
									void scheduleImmediateDelay() {
							 | 
						||
| 
								 | 
							
										expire = std::chrono::steady_clock::now() + this->delay;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									//Reschedule this Action based on a specific base time.
							 | 
						||
| 
								 | 
							
									void schedule(std::chrono::time_point<std::chrono::steady_clock> starttine, BOOL adddelayed) {
							 | 
						||
| 
								 | 
							
										this->expire = starttine;
							 | 
						||
| 
								 | 
							
										if (adddelayed)
							 | 
						||
| 
								 | 
							
											expire += this->delay;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									std::weak_ptr<J2534Connection> connection;
							 | 
						||
| 
								 | 
							
									std::chrono::microseconds delay;
							 | 
						||
| 
								 | 
							
									//The timestamp at which point this Action is ready to be executed.
							 | 
						||
| 
								 | 
							
									std::chrono::time_point<std::chrono::steady_clock> expire;
							 | 
						||
| 
								 | 
							
								};
							 |