Wxwidget wxTimer会导致应用程序关闭时出现随机访问冲突

时间:2015-01-19 19:05:07

标签: c++ wxwidgets access-violation shutdown

我在wxFrame窗口上使用wxWidgets v3.0.1进行了一个相当简单的wxTimer循环,当处理close事件时(例如文件/退出或对话框框架上的X),随机导致访问冲突,m_timer.stop()是然后在destroy();

之前调用

我已经通过StackOVerflow挖掘并尝试了我能找到的一切无济于事。任何人都可以给我指出我可能出错的地方,请:

系统: 我有一个在wxApp类中创建的Application类,并且通过(通过指针)传递给wxFrame,wxPanel,因为我正在使用wxAuiManager。

计时器正在通过以下方式初始化:

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)"));
        }

对我所做错的任何建议都会非常感激。

更新

  1. 检查m_projectModel的空指针并且没有帮助
  2. 我删除了计时器中的所有代码,但仍然崩溃
  3. 已确认没有针对计时器添加到3.0.2更改日志的修复程序
  4. 应用程序不会创建任何其他线程。

1 个答案:

答案 0 :(得分:1)

我发现问题不是由wxWidgets本身引起的,而是由第三方应用引起的。

OP在Coherence View模式下在Mac上的Parallels虚拟机中运行Windows。在此配置中安装在Windows中的Parallels Tools组件使用挂钩DLL(prl_hook.dll),该DLL在所有进程中注入并检查窗口管理调用,包括::DestroyWindow()

wxWidgets使用隐藏窗口来接收wxTimer事件。该窗口由wxTimerHiddenWindowModule管理。 Parallels钩子DLL不喜欢那个窗口 - 当wx在app退出时调用::DestroyWindow()作为正常清理过程的一部分时,钩子DLL代码有时会因访问冲突而崩溃。

停止Parallels Tools服务解决了这个问题。