【发布时间】:2015-01-19 19:05:06
【问题描述】:
我在使用 wxWidgets v3.0.1 的 wxFrame 窗口上有一个相当简单的 wxTimer 循环,它在处理关闭事件(例如文件/退出或对话框框架上的 X)时随机导致访问冲突,m_timer.stop() 是然后在destroy()之前调用;
我已经通过 StackOVerflow 进行了挖掘,并尝试了所有我能找到的方法,但均无济于事。谁能给我一个指向我可能出错的地方:
系统: 我在 wxApp 类中创建了一个应用程序类,并在使用 wxAuiManager 时(通过指针)传递给 wxFrame、wxPanel。
定时器正在被初始化:
m_timer.SetOwner( this, ID_toolbarPaneTimer );
m_timer.Start( 2000, wxTIMER_CONTINUOUS );
Connect( ID_toolbarPaneTimer
, wxEVT_TIMER
, wxTimerEventHandler( ToolbarPane::OnTimerTick ) );
::OnTimerTick 函数本身也很简单:
void ToolbarPane::OnTimerTick( wxTimerEvent &event )
{
AssetDataTransaction *transaction = NULL;
int transactionsWaiting = m_projectModel->GetNumberOfAssetTransactions();
if ( transactionsWaiting > 0 )
{
for ( int transNo = 0; transNo < transactionsWaiting; transNo++ )
{
transaction = m_projectModel->GetTopAssetTransaction();
switch( transaction->GetType() )
{
case AssetDataTransactionType_add:
AddAssetItem( transaction );
m_projectModel->PopTopAssetTransaction();
break;
default:
break;
}
}
}
}
当主对话框关闭时,工具栏窗格会执行 m_timer.stop()。当 wxApp 被销毁时,应用程序类被销毁。
访问冲突中断:
void wxTimerHiddenWindowModule::OnExit()
{
if ( ms_hwnd )
{
if ( !::DestroyWindow(ms_hwnd) )
{
wxLogLastError(wxT("DestroyWindow(wxTimerHiddenWindow)"));
}
任何关于我做错了什么的建议都将不胜感激。
更新:
- 检查了 m_projectModel 的 Null 指针,但没有帮助
- 我已经删除了计时器中的所有代码,但它仍然崩溃
- 已验证 3.0.2 更改日志中没有添加计时器修复
- 应用程序不会创建任何其他线程。
【问题讨论】:
-
用讨论中的诊断信息更新了问题。
-
很奇怪。与该功能相关的所有资源管理代码看起来都很好。对
::DestroyWindow的调用是否会引发异常? -
说实话我真的很不确定,第一个条目是 > intmac_client.exe!WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow) 第 123 行 C++
-
后跟 > wxmsw30ud_core_vc_custom.dll!wxEntry(HINSTANCE__ * hInstance, HINSTANCE__ * __formal, char * __formal, int nCmdShow) 第 415 行 C++
-
还有栈顶(调用栈窗口中最顶层的条目)?
标签: c++ wxwidgets access-violation shutdown