diff --git a/olcPixelGameEngine.h b/olcPixelGameEngine.h
index 48a9be5..fcebc00 100644
--- a/olcPixelGameEngine.h
+++ b/olcPixelGameEngine.h
@@ -856,6 +856,7 @@ namespace olc
 		virtual ~Platform() = default;
 		virtual olc::rcode ApplicationStartUp() = 0;
 		virtual olc::rcode ApplicationCleanUp() = 0;
+		virtual olc::rcode SetThreadName(const std::string&) = 0;
 		virtual olc::rcode ThreadStartUp() = 0;
 		virtual olc::rcode ThreadCleanUp() = 0;
 		virtual olc::rcode CreateGraphics(bool bFullScreen, bool bEnableVSYNC, const olc::vi2d& vViewPos, const olc::vi2d& vViewSize) = 0;
@@ -2889,6 +2890,8 @@ namespace olc
 
 	void PixelGameEngine::EngineThread()
 	{
+		platform->SetThreadName("OLC PGE Engine Thread");
+
 		// Allow platform to do stuff here if needed, since its now in the
 		// context of this thread
 		if (platform->ThreadStartUp() == olc::FAIL)	return;
@@ -4333,6 +4336,33 @@ namespace olc
 	public:
 		virtual olc::rcode ApplicationStartUp() override { return olc::rcode::OK; }
 		virtual olc::rcode ApplicationCleanUp() override { return olc::rcode::OK; }
+
+		virtual olc::rcode SetThreadName(const std::string& s) 
+		{
+			// Reference:
+			// https://docs.microsoft.com/en-us/visualstudio/debugger/how-to-set-a-thread-name-in-native-code?view=vs-2019#set-a-thread-name-by-throwing-an-exception
+
+			#pragma pack(push, 8)
+			struct THREADNAME_INFO
+			{
+				DWORD dwType;
+				LPCSTR szName;
+				DWORD dwThreadID;
+				DWORD dwFlags;
+			};
+			#pragma pack(pop)
+
+			THREADNAME_INFO info{ 0x1000, s.c_str(), 0xFFFFFFFF, 0 };
+
+			__try
+			{
+				RaiseException(0x406D1388, 0, sizeof(info) / sizeof(ULONG_PTR), reinterpret_cast<ULONG_PTR*>(&info));
+			}
+			__except(EXCEPTION_CONTINUE_EXECUTION) { }
+
+			return olc::rcode::OK;
+		}
+
 		virtual olc::rcode ThreadStartUp() override { return olc::rcode::OK; }
 
 		virtual olc::rcode ThreadCleanUp() override
@@ -4535,6 +4565,11 @@ namespace olc
 			return olc::rcode::OK;
 		}
 
+		virtual olc::rcode SetThreadName(const std::string&) override
+		{
+			return olc::rcode::OK;
+		}
+
 		virtual olc::rcode ThreadStartUp() override
 		{
 			return olc::rcode::OK;
@@ -4785,6 +4820,11 @@ namespace olc {
 			return olc::rcode::OK;
 		}
 
+		virtual olc::rcode SetThreadName(const std::string&) override
+		{
+			return olc::rcode::OK;
+		}
+
 		virtual olc::rcode ThreadStartUp() override
 		{
 			return olc::rcode::OK;
@@ -5098,6 +5138,9 @@ namespace olc
 		virtual olc::rcode ApplicationCleanUp() override 
 		{ ThreadCleanUp(); return olc::rcode::OK; }
 
+		virtual olc::rcode SetThreadName(const std::string&)
+		{ return olc::rcode::OK; }
+
 		virtual olc::rcode ThreadStartUp() override
 		{ return olc::rcode::OK; }