UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MessageRouter.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "Containers/Queue.h"
7#include "HAL/Runnable.h"
9#include "Templates/Atomic.h"
11
12#include "IMessageContext.h"
13#include "IMessageTracer.h"
14#include "Bus/MessageTracer.h"
15
19class IBusListener;
20
22
27 : public FRunnable
28 , private FSingleThreadRunnable
29{
31
32public:
33
36
39
40public:
41
49 {
50 EnqueueCommand(FSimpleDelegate::CreateRaw(this, &FMessageRouter::HandleAddInterceptor, Interceptor, MessageType));
51 }
52
60 {
61 EnqueueCommand(FSimpleDelegate::CreateRaw(this, &FMessageRouter::HandleAddRecipient, Address, TWeakPtr<IMessageReceiver, ESPMode::ThreadSafe>(Recipient)));
62 }
63
70 {
71 EnqueueCommand(FSimpleDelegate::CreateRaw(this, &FMessageRouter::HandleAddSubscriber, Subscription));
72 }
73
83
91 {
92 EnqueueCommand(FSimpleDelegate::CreateRaw(this, &FMessageRouter::HandleRemoveInterceptor, Interceptor, MessageType));
93 }
94
101 {
102 EnqueueCommand(FSimpleDelegate::CreateRaw(this, &FMessageRouter::HandleRemoveRecipient, Address));
103 }
104
112 {
113 EnqueueCommand(FSimpleDelegate::CreateRaw(this, &FMessageRouter::HandleRemoveSubscriber, TWeakPtr<IMessageReceiver, ESPMode::ThreadSafe>(Subscriber), MessageType));
114 }
115
122 {
123 Tracer->TraceSentMessage(Context);
124 EnqueueCommand(FSimpleDelegate::CreateRaw(this, &FMessageRouter::HandleRouteMessage, Context));
125 }
126
133 {
134 EnqueueCommand(FSimpleDelegate::CreateRaw(this, &FMessageRouter::HandleAddListener, TWeakPtr<IBusListener, ESPMode::ThreadSafe>(Listener)));
135 }
136
143 {
144 EnqueueCommand(FSimpleDelegate::CreateRaw(this, &FMessageRouter::HandleRemoveListener, TWeakPtr<IBusListener, ESPMode::ThreadSafe>(Listener)));
145 }
146
147public:
148
149 //~ FRunnable interface
150
152 virtual bool Init() override;
153 virtual uint32 Run() override;
154 virtual void Stop() override;
155 virtual void Exit() override;
156
157protected:
158
165
173 {
174 Commands.Enqueue(Command);
175 WorkEvent->Trigger();
176
177 return true;
178 }
179
191
198 void FilterRecipients(
201
208
214 void ProcessCommands();
215
222
223protected:
224
225 //~ FSingleThreadRunnable interface
226
227 virtual void Tick() override;
228
229private:
230
232 struct FDelayedMessage
233 {
236
238 int64 Sequence;
239
240
242 FDelayedMessage() { }
243
247 , Sequence(InSequence)
248 { }
249
251 bool operator<(const FDelayedMessage& Other) const
252 {
253 const FTimespan Difference = Other.Context->GetTimeSent() - Context->GetTimeSent();
254
255 if (Difference.IsZero())
256 {
257 return (Sequence < Other.Sequence);
258 }
259
260 return (Difference > FTimespan::Zero());
261 }
262 };
263
264private:
265
268
270 void HandleAddRecipient(FMessageAddress Address, TWeakPtr<IMessageReceiver, ESPMode::ThreadSafe> RecipientPtr);
271
274
277
279 void HandleRemoveRecipient(FMessageAddress Address);
280
283
286
288 void HandleAddListener(TWeakPtr<IBusListener, ESPMode::ThreadSafe> ListenerPtr);
289
291 void HandleRemoveListener(TWeakPtr<IBusListener, ESPMode::ThreadSafe> ListenerPtr);
292
294 void NotifyRegistration(const FMessageAddress& Address, EMessageBusNotification Notification);
295
296private:
297
300
303
306
308 TArray<TWeakPtr<IBusListener, ESPMode::ThreadSafe>> ActiveRegistrationListeners;
309
312
314 FDateTime CurrentTime;
315
317 TArray<FDelayedMessage> DelayedMessages;
318
320 int64 DelayedMessagesSequence;
321
323 TAtomic<bool> Stopping;
324
327
329 FEvent* WorkEvent;
330
332 bool bAllowDelayedMessaging;
333};
#define FORCEINLINE
Definition AndroidPlatform.h:140
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define DECLARE_DELEGATE(DelegateName)
Definition DelegateCombinations.h:20
EMessageBusNotification
Definition IMessageBusListener.h:10
bool operator<(const FTextFormatString &LHS, const FTextFormatString &RHS)
Definition ITextFormatArgumentModifier.h:147
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Event.h:21
virtual void Trigger()=0
Definition MessageRouter.h:29
FTimespan CalculateWaitTime()
Definition MessageRouter.cpp:100
virtual uint32 Run() override
Definition MessageRouter.cpp:53
FORCEINLINE TSharedRef< IMessageTracer, ESPMode::ThreadSafe > GetTracer()
Definition MessageRouter.h:79
void ProcessDelayedMessages()
Definition MessageRouter.cpp:255
virtual FSingleThreadRunnable * GetSingleThreadInterface() override
Definition MessageRouter.cpp:41
void FilterSubscriptions(TArray< TSharedPtr< IMessageSubscription, ESPMode::ThreadSafe > > &Subscriptions, const TSharedRef< IMessageContext, ESPMode::ThreadSafe > &Context, TArray< TSharedPtr< IMessageReceiver, ESPMode::ThreadSafe > > &OutRecipients)
Definition MessageRouter.cpp:175
FORCEINLINE void RemoveSubscription(const TSharedRef< IMessageReceiver, ESPMode::ThreadSafe > &Subscriber, const FTopLevelAssetPath &MessageType)
Definition MessageRouter.h:111
void FilterRecipients(const TSharedRef< IMessageContext, ESPMode::ThreadSafe > &Context, TArray< TSharedPtr< IMessageReceiver, ESPMode::ThreadSafe > > &OutRecipients)
Definition MessageRouter.cpp:218
FMessageRouter()
Definition MessageRouter.cpp:18
FORCEINLINE void RemoveInterceptor(const TSharedRef< IMessageInterceptor, ESPMode::ThreadSafe > &Interceptor, const FTopLevelAssetPath &MessageType)
Definition MessageRouter.h:90
FORCEINLINE void RemoveNotificationListener(const TSharedRef< IBusListener, ESPMode::ThreadSafe > &Listener)
Definition MessageRouter.h:142
FORCEINLINE void AddInterceptor(const TSharedRef< IMessageInterceptor, ESPMode::ThreadSafe > &Interceptor, const FTopLevelAssetPath &MessageType)
Definition MessageRouter.h:48
FORCEINLINE bool EnqueueCommand(CommandDelegate Command)
Definition MessageRouter.h:172
FORCEINLINE void RemoveRecipient(const FMessageAddress &Address)
Definition MessageRouter.h:100
FORCEINLINE void RouteMessage(const TSharedRef< IMessageContext, ESPMode::ThreadSafe > &Context)
Definition MessageRouter.h:121
~FMessageRouter()
Definition MessageRouter.cpp:31
FORCEINLINE void AddRecipient(const FMessageAddress &Address, const TSharedRef< IMessageReceiver, ESPMode::ThreadSafe > &Recipient)
Definition MessageRouter.h:59
virtual void Stop() override
Definition MessageRouter.cpp:69
void ProcessCommands()
Definition MessageRouter.cpp:244
virtual void Tick() override
Definition MessageRouter.cpp:270
virtual bool Init() override
Definition MessageRouter.cpp:47
void DispatchMessage(const TSharedRef< IMessageContext, ESPMode::ThreadSafe > &Message)
Definition MessageRouter.cpp:118
FORCEINLINE void AddNotificationListener(const TSharedRef< IBusListener, ESPMode::ThreadSafe > &Listener)
Definition MessageRouter.h:132
virtual void Exit() override
Definition MessageRouter.cpp:77
FORCEINLINE void AddSubscription(const TSharedRef< IMessageSubscription, ESPMode::ThreadSafe > &Subscription)
Definition MessageRouter.h:69
void TraceSentMessage(const TSharedRef< IMessageContext, ESPMode::ThreadSafe > &Context)
Definition MessageTracer.cpp:297
Definition Runnable.h:20
Definition SingleThreadRunnable.h:12
Definition IMessageBusListener.h:27
Definition IMessageInterceptor.h:16
Definition IMessageReceiver.h:26
Definition IMessageSubscription.h:25
Definition Array.h:670
Definition Atomic.h:538
Definition UnrealString.h.inl:34
Definition MpscQueue.h:18
void Enqueue(ArgTypes &&... Args)
Definition MpscQueue.h:49
Definition SharedPointer.h:692
Definition SharedPointer.h:153
Definition SharedPointer.h:1295
Definition DateTime.h:76
Definition IMessageContext.h:26
Definition Timespan.h:76
static FTimespan Zero()
Definition Timespan.h:747
Definition TopLevelAssetPath.h:38