11#pragma once
22
3+ #include < ESPressio_Thread.hpp>
4+
35#include < ESPressio_EventThreadBase.hpp>
46#include " ESPressio_EventListener.hpp"
57#include " ESPressio_EventManager.hpp"
68
9+ using namespace ESPressio ::Threads;
10+
711namespace ESPressio {
812
913 namespace Event {
@@ -35,6 +39,44 @@ namespace ESPressio {
3539 }
3640 };
3741
42+ enum EventThreadProcessOrder {
43+ EventsBeforeLoop,
44+ EventsAfterLoop
45+ };
46+
47+ class EventThreadWithLoop : public Thread , public EventReceiver , public IEventThreadBase , public EventListener , public IEventThread {
48+ private:
49+ EventThreadProcessOrder _processOrder = EventThreadProcessOrder::EventsBeforeLoop;
50+ protected:
51+ void OnLoop () override {
52+ if (_processOrder == EventThreadProcessOrder::EventsBeforeLoop) {
53+ WithEvents ([&](IEvent* event, EventDispatchMethod dispatchMethod, EventPriority priority) {
54+ ProcessEvent (event, dispatchMethod, priority);
55+ });
56+ }
57+
58+ OnThreadLoop ();
59+
60+ if (_processOrder == EventThreadProcessOrder::EventsAfterLoop) {
61+ WithEvents ([&](IEvent* event, EventDispatchMethod dispatchMethod, EventPriority priority) {
62+ ProcessEvent (event, dispatchMethod, priority);
63+ });
64+ }
65+ }
66+
67+ virtual void OnThreadLoop () = 0;
68+ public:
69+ EventThreadBase (bool freeOnTerminate) : Thread(freeOnTerminate) { }
70+
71+ virtual ~EventThreadBase () {
72+
73+ }
74+
75+ EventThreadProcessOrder GetProcessOrder () { return _processOrder; }
76+
77+ void SetProcessOrder (EventThreadProcessOrder processOrder) { _processOrder = processOrder; }
78+ };
79+
3880 }
3981
4082}
0 commit comments