src/thread_win32.cpp
changeset 9477 00be34b8e9fd
parent 9476 902f9cf6373f
child 9479 c8ab793e4595
--- a/src/thread_win32.cpp	Sun Jun 08 10:51:36 2008 +0000
+++ b/src/thread_win32.cpp	Sun Jun 08 12:06:27 2008 +0000
@@ -20,17 +20,19 @@
 	OTTDThreadFunc m_proc;
 	void     *m_param;
 	bool     m_attached;
+	OTTDThreadTerminateFunc m_terminate_func;
 
 public:
 	/**
 	 * Create a win32 thread and start it, calling proc(param).
 	 */
-	ThreadObject_Win32(OTTDThreadFunc proc, void *param) :
+	ThreadObject_Win32(OTTDThreadFunc proc, void *param, OTTDThreadTerminateFunc terminate_func) :
 		m_id_thr(0),
 		m_h_thr(NULL),
 		m_proc(proc),
 		m_param(param),
-		m_attached(false)
+		m_attached(false),
+		m_terminate_func(terminate_func)
 	{
 		m_h_thr = (HANDLE)_beginthreadex(NULL, 0, &stThreadProc, this, CREATE_SUSPENDED, &m_id_thr);
 		if (m_h_thr == NULL) return;
@@ -45,7 +47,8 @@
 		m_h_thr(NULL),
 		m_proc(NULL),
 		m_param(NULL),
-		m_attached(false)
+		m_attached(false),
+		m_terminate_func(NULL)
 	{
 		BOOL ret = DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &m_h_thr, 0, FALSE, DUPLICATE_SAME_ACCESS);
 		if (!ret) return;
@@ -130,12 +133,14 @@
 			m_proc(m_param);
 		} catch (...) {
 		}
+
+		if (this->m_terminate_func != NULL) this->m_terminate_func(this);
 	}
 };
 
-/* static */ ThreadObject *ThreadObject::New(OTTDThreadFunc proc, void *param)
+/* static */ ThreadObject *ThreadObject::New(OTTDThreadFunc proc, void *param, OTTDThreadTerminateFunc terminate_func)
 {
-	return new ThreadObject_Win32(proc, param);
+	return new ThreadObject_Win32(proc, param, terminate_func);
 }
 
 /* static */ ThreadObject* ThreadObject::AttachCurrent()