// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved. #pragma once #include "Engine/Core/Types/BaseTypes.h" #include "Engine/Core/Types/String.h" #include "Engine/Core/Object.h" #include "Engine/Core/Delegate.h" /// /// Interface for runnable objects for multi-threading purposes. /// class IRunnable : public Object { public: // Virtual destructor virtual ~IRunnable() { } /// /// Initializes the runnable object. /// /// True if initialization was successful, otherwise false. virtual bool Init() { return true; } /// /// Executes the runnable object. /// /// The exit code. Non-zero on error. virtual int32 Run() = 0; /// /// Stops the runnable object. Called when thread is being terminated /// virtual void Stop() { } /// /// Exits the runnable object /// virtual void Exit() { } /// /// Called when thread ends work (via Kill or normally). /// /// True if thread has been killed. virtual void AfterWork(bool wasKilled) { } }; /// /// Simple runnable object for single function bind /// class SimpleRunnable : public IRunnable { private: bool _autoDelete; public: /// /// Working function /// Function OnWork; public: /// /// Init /// /// True if delete itself after work. SimpleRunnable(bool autoDelete) : _autoDelete(autoDelete) { } public: // [IRunnable] String ToString() const override { return TEXT("SimpleRunnable"); } int32 Run() override { int32 result = -1; if (OnWork.IsBinded()) result = OnWork(); return result; } void AfterWork(bool wasKilled) override { if (_autoDelete) Delete(this); } };