【问题标题】:Wxwidget wxTimer causes random access violation on application closeWxwidget wxTimer 在应用程序关闭时导致随机访问冲突
【发布时间】: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)"));
        }

任何关于我做错了什么的建议都将不胜感激。

更新:

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

【问题讨论】:

  • 用讨论中的诊断信息更新了问题。
  • 很奇怪。与该功能相关的所有资源管理代码看起来都很好。对::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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 2016-07-12
    相关资源
    最近更新 更多