diff --git a/docs/changes.txt b/docs/changes.txt
index 4cb400ad3e..bc7eaae2a2 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -406,6 +406,7 @@ Major new features in this release
All:
- Added "rest" argument to wxString::Before{First,Last}().
+- Added wxThread::OnKill() and OnDelete() callbacks.
All (GUI):
diff --git a/include/wx/thread.h b/include/wx/thread.h
index ed9efa05bf..fbb3cfb042 100644
--- a/include/wx/thread.h
+++ b/include/wx/thread.h
@@ -585,6 +585,19 @@ protected:
// of this thread.
virtual void *Entry() = 0;
+
+ // Callbacks which may be overridden by the derived class to perform some
+ // specific actions when the thread is deleted or killed. By default they
+ // do nothing.
+
+ // This one is called by Delete() before actually deleting the thread and
+ // is executed in the context of the thread that called Delete().
+ virtual void OnDelete() {}
+
+ // This one is called by Kill() before killing the thread and is executed
+ // in the context of the thread that called Kill().
+ virtual void OnKill() {}
+
private:
// no copy ctor/assignment operator
wxThread(const wxThread&);
diff --git a/interface/wx/thread.h b/interface/wx/thread.h
index 34d98462fd..52b94f3128 100644
--- a/interface/wx/thread.h
+++ b/interface/wx/thread.h
@@ -454,6 +454,37 @@ public:
*/
virtual ExitCode Entry() = 0;
+ /**
+ Callback called by Delete() before actually deleting the thread.
+
+ This function can be overridden by the derived class to perform some
+ specific task when the thread is gracefully destroyed. Notice that it
+ will be executed in the context of the thread that called Delete() and
+ not in this thread's context.
+
+ TestDestroy() will be true for the thread before OnDelete() gets
+ executed.
+
+ @since 2.9.2
+
+ @see OnKill()
+ */
+ virtual void OnDelete();
+
+ /**
+ Callback called by Kill() before actually killing the thread.
+
+ This function can be overridden by the derived class to perform some
+ specific task when the thread is terminated. Notice that it will be
+ executed in the context of the thread that called Kill() and not
+ in this thread's context.
+
+ @since 2.9.2
+
+ @see OnDelete()
+ */
+ virtual void OnKill();
+
/**
@deprecated
Use CreateThread() instead.
diff --git a/src/msw/thread.cpp b/src/msw/thread.cpp
index 53c192cc50..1a668976f3 100644
--- a/src/msw/thread.cpp
+++ b/src/msw/thread.cpp
@@ -686,6 +686,8 @@ bool wxThreadInternal::Create(wxThread *thread, unsigned int stackSize)
wxThreadError wxThreadInternal::Kill()
{
+ m_thread->OnKill();
+
if ( !::TerminateThread(m_hThread, THREAD_ERROR_EXIT) )
{
wxLogSysError(_("Couldn't terminate thread"));
@@ -759,6 +761,7 @@ wxThreadInternal::WaitForTerminate(wxCriticalSection& cs,
Cancel();
}
+ threadToDelete->OnDelete();
// now wait for thread to finish
if ( wxThread::IsMain() )
diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp
index e818385c66..ebb365b0d0 100644
--- a/src/unix/threadpsx.cpp
+++ b/src/unix/threadpsx.cpp
@@ -1453,6 +1453,8 @@ wxThreadError wxThread::Delete(ExitCode *rc)
m_critsect.Leave();
+ OnDelete();
+
switch ( state )
{
case STATE_NEW:
@@ -1501,6 +1503,8 @@ wxThreadError wxThread::Kill()
wxCHECK_MSG( This() != this, wxTHREAD_MISC_ERROR,
wxT("a thread can't kill itself") );
+ OnKill();
+
switch ( m_internal->GetState() )
{
case STATE_NEW: