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.
		
		
		
		
		
			
		
			
				
					
					
						
							57 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
	
	
							57 lines
						
					
					
						
							1.7 KiB
						
					
					
				#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;
 | 
						|
};
 | 
						|
 |