From: Stefan Csomor Date: Tue, 21 May 2002 20:45:44 +0000 (+0000) Subject: survive delete within Notify X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/e5f0419b0d8437e20b50a0bf40a782dc1795d512 survive delete within Notify git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15629 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/mac/carbon/timer.cpp b/src/mac/carbon/timer.cpp index d485c86b8c..debf409696 100644 --- a/src/mac/carbon/timer.cpp +++ b/src/mac/carbon/timer.cpp @@ -26,6 +26,8 @@ IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxObject) #include #endif +#include "wx/dynarray.h" + typedef struct MacTimerInfo { TMTask m_task; @@ -41,20 +43,33 @@ static pascal void MacTimerProc( TMTask * t ) wxMacAddEvent( tm->m_table , wxProcessTimer, 0 , (void*) tm->m_timer , TRUE ) ; } +wxArrayPtrVoid gTimersInProcess ; + static void wxProcessTimer( unsigned long event , void *data ) { if ( !data ) return ; wxTimer* timer = (wxTimer*) data ; + if ( timer->IsOneShot() ) timer->Stop() ; + gTimersInProcess.Add( timer ) ; + timer->Notify(); - if ( timer->m_info->m_task.tmAddr && !timer->IsOneShot() ) + int index = gTimersInProcess.Index( timer ) ; + + if ( index != wxNOT_FOUND ) { - PrimeTime( (QElemPtr) &timer->m_info->m_task , timer->GetInterval() ) ; + gTimersInProcess.RemoveAt( index ) ; + + if ( !timer->IsOneShot() && timer->m_info->m_task.tmAddr ) + { + PrimeTime( (QElemPtr) &timer->m_info->m_task , timer->GetInterval() ) ; + } + } } @@ -79,6 +94,9 @@ wxTimer::~wxTimer() Stop(); delete m_info ; m_info = NULL ; + int index = gTimersInProcess.Index( this ) ; + if ( index != wxNOT_FOUND ) + gTimersInProcess.RemoveAt( index ) ; } bool wxTimer::Start(int milliseconds,bool mode) diff --git a/src/mac/timer.cpp b/src/mac/timer.cpp index d485c86b8c..debf409696 100644 --- a/src/mac/timer.cpp +++ b/src/mac/timer.cpp @@ -26,6 +26,8 @@ IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxObject) #include #endif +#include "wx/dynarray.h" + typedef struct MacTimerInfo { TMTask m_task; @@ -41,20 +43,33 @@ static pascal void MacTimerProc( TMTask * t ) wxMacAddEvent( tm->m_table , wxProcessTimer, 0 , (void*) tm->m_timer , TRUE ) ; } +wxArrayPtrVoid gTimersInProcess ; + static void wxProcessTimer( unsigned long event , void *data ) { if ( !data ) return ; wxTimer* timer = (wxTimer*) data ; + if ( timer->IsOneShot() ) timer->Stop() ; + gTimersInProcess.Add( timer ) ; + timer->Notify(); - if ( timer->m_info->m_task.tmAddr && !timer->IsOneShot() ) + int index = gTimersInProcess.Index( timer ) ; + + if ( index != wxNOT_FOUND ) { - PrimeTime( (QElemPtr) &timer->m_info->m_task , timer->GetInterval() ) ; + gTimersInProcess.RemoveAt( index ) ; + + if ( !timer->IsOneShot() && timer->m_info->m_task.tmAddr ) + { + PrimeTime( (QElemPtr) &timer->m_info->m_task , timer->GetInterval() ) ; + } + } } @@ -79,6 +94,9 @@ wxTimer::~wxTimer() Stop(); delete m_info ; m_info = NULL ; + int index = gTimersInProcess.Index( this ) ; + if ( index != wxNOT_FOUND ) + gTimersInProcess.RemoveAt( index ) ; } bool wxTimer::Start(int milliseconds,bool mode)