UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Timeout.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Misc/Timespan.h"
6#include "HAL/PlatformTime.h"
8#include "CoreTypes.h"
9
10namespace UE
11{
21 {
22 public:
23
24 UE_DEPRECATED(5.5, "Use IsExpired() instead.")
25 explicit operator bool() const
26 {
27 return IsExpired();
28 }
29
31 bool IsExpired() const
32 {
33 // First two cases can skip the slow current time check
34 if (WillNeverExpire())
35 {
36 return false;
37 }
38 else if (IsAlwaysExpired())
39 {
40 return true;
41 }
42 else
43 {
44 return FPlatformTime::Cycles64() > (StartCycles + TimeoutCycles);
45 }
46 }
47
49 static FTimeout Never()
50 {
51 return FTimeout(FPlatformTime::Cycles64(), NeverExpireCycles);
52 }
53
56 {
57 return TimeoutCycles == NeverExpireCycles;
58 }
59
62 {
64 }
65
68 {
69 return TimeoutCycles == 0;
70 }
71
74 {
75 TimeoutCycles = 0;
76 }
77
78
79 // Preferred API for creating and querying using double seconds
80
82 explicit FTimeout(double TimeoutSeconds)
83 : StartCycles(FPlatformTime::Cycles64())
84 {
86 }
87
90 : StartCycles(BaseTimeout.StartCycles)
91 {
93 }
94
96 double GetElapsedSeconds() const
97 {
98 // StartCycles can never be greater than current time as there is no way to construct a timeout starting in the future
100 }
101
103 double GetRemainingSeconds() const
104 {
105 if (WillNeverExpire())
106 {
107 return NeverExpireSeconds;
108 }
109
110 // We convert to double separately to avoid underflow on the cycles
111 // This could also be done with some branches or treating cycles as signed int64
113 }
114
116 double GetTimeoutSeconds() const
117 {
118 return FPlatformTime::ToSeconds64(TimeoutCycles);
119 }
120
123 {
124 if (TimeoutSeconds <= 0.0)
125 {
126 SetToExpired();
127 }
128 else
129 {
131 }
132 }
133
136 {
138 {
139 return;
140 }
141
142 if (DeltaTimeoutSeconds >= 0.0)
143 {
145 }
146 else
147 {
149 if (RemovedCycles >= TimeoutCycles)
150 {
151 SetToExpired();
152 }
153 else
154 {
155 TimeoutCycles -= RemovedCycles;
156 }
157 }
158 }
159
160
161 // Older API for creating and querying using FTimespan
162
165 : StartCycles(FPlatformTime::Cycles64())
166 {
168 {
169 TimeoutCycles = NeverExpireCycles;
170 }
171 else
172 {
173 SetTimeoutSeconds(TimeoutValue.GetTotalSeconds());
174 }
175 }
176
182
185 {
186 if (WillNeverExpire())
187 {
188 return FTimespan::MaxValue();
189 }
190
192 }
193
196 {
197 if (WillNeverExpire())
198 {
199 return FTimespan::MaxValue();
200 }
201
203 }
204
221
223 {
224 // Timeout cycles need to match which handles differentiating between always and never
225 // For normal timeouts, also check the start cycles
226 return Left.TimeoutCycles == Right.TimeoutCycles
227 && (Left.WillNeverExpire() || Left.IsAlwaysExpired() || Left.StartCycles == Right.StartCycles);
228 }
229
231 {
232 return !operator==(Left, Right);
233 }
234
235 private:
237 : StartCycles(StartValue)
238 , TimeoutCycles(TimeoutValue)
239 {
240 }
241
242 static constexpr uint64 NeverExpireCycles = TNumericLimits<uint64>::Max();
243 static constexpr double NeverExpireSeconds = TNumericLimits<double>::Max();
244
245 // Value of FPlatformTime::Cycles64 at timeout creation, cannot be directly converted to seconds
246 uint64 StartCycles = 0;
247
248 // Length of timeout, can be converted to seconds as it is relative to StartCycles
249 uint64 TimeoutCycles = 0;
250 };
251}
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define MAX_uint32
Definition NumericLimits.h:21
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Timeout.h:21
FTimeout(double TimeoutSeconds)
Definition Timeout.h:82
FTimespan GetTimeoutValue() const
Definition Timeout.h:195
FTimeout(FTimespan TimeoutValue)
Definition Timeout.h:164
FTimespan GetElapsedTime() const
Definition Timeout.h:178
friend bool operator!=(FTimeout Left, FTimeout Right)
Definition Timeout.h:230
FTimeout(const FTimeout &BaseTimeout, double TimeoutSeconds)
Definition Timeout.h:89
friend bool operator==(FTimeout Left, FTimeout Right)
Definition Timeout.h:222
void ModifyTimeoutSeconds(double DeltaTimeoutSeconds)
Definition Timeout.h:135
double GetElapsedSeconds() const
Definition Timeout.h:96
static FTimeout AlwaysExpired()
Definition Timeout.h:61
uint32 GetRemainingRoundedUpMilliseconds() const
Definition Timeout.h:209
double GetRemainingSeconds() const
Definition Timeout.h:103
double GetTimeoutSeconds() const
Definition Timeout.h:116
FTimespan GetRemainingTime() const
Definition Timeout.h:184
void SetToExpired()
Definition Timeout.h:73
UE_FORCEINLINE_HINT bool WillNeverExpire() const
Definition Timeout.h:55
UE_FORCEINLINE_HINT bool IsAlwaysExpired() const
Definition Timeout.h:67
void SetTimeoutSeconds(double TimeoutSeconds)
Definition Timeout.h:122
bool IsExpired() const
Definition Timeout.h:31
static FTimeout Never()
Definition Timeout.h:49
constexpr int64 TicksPerMillisecond
Definition Timespan.h:41
Definition AdvancedWidgetsModule.cpp:13
Definition AndroidPlatformTime.h:18
static uint64 Cycles64()
Definition AndroidPlatformTime.h:34
static double ToSeconds64(const uint64 Cycles)
Definition GenericPlatformTime.h:208
static uint64 SecondsToCycles64(double Seconds)
Definition GenericPlatformTime.h:214
static constexpr UE_FORCEINLINE_HINT T DivideAndRoundUp(T Dividend, T Divisor)
Definition UnrealMathUtility.h:694
Definition Timespan.h:76
int64 GetTicks() const
Definition Timespan.h:454
static FTimespan FromSeconds(double Seconds)
Definition Timespan.h:673
static FTimespan MaxValue()
Definition Timespan.h:686
Definition NumericLimits.h:41