Call OnXXX() from wxThread::Kill() and Delete() respectively to allow the
thread being terminated perform some cleanup.
Closes #9046.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65882
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
All:
- Added "rest" argument to wxString::Before{First,Last}().
+- Added wxThread::OnKill() and OnDelete() callbacks.
All (GUI):
// 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&);
*/
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
+ <b>not</b> 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 <b>not</b>
+ in this thread's context.
+
+ @since 2.9.2
+
+ @see OnDelete()
+ */
+ virtual void OnKill();
+
/**
@deprecated
Use CreateThread() instead.
wxThreadError wxThreadInternal::Kill()
{
+ m_thread->OnKill();
+
if ( !::TerminateThread(m_hThread, THREAD_ERROR_EXIT) )
{
wxLogSysError(_("Couldn't terminate thread"));
Cancel();
}
+ threadToDelete->OnDelete();
// now wait for thread to finish
if ( wxThread::IsMain() )
m_critsect.Leave();
+ OnDelete();
+
switch ( state )
{
case STATE_NEW:
wxCHECK_MSG( This() != this, wxTHREAD_MISC_ERROR,
wxT("a thread can't kill itself") );
+ OnKill();
+
switch ( m_internal->GetState() )
{
case STATE_NEW: