Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Wxwidget wxTimer在应用程序关闭时导致随机访问冲突_C++_Wxwidgets_Access Violation_Shutdown - Fatal编程技术网

C++ Wxwidget wxTimer在应用程序关闭时导致随机访问冲突

C++ Wxwidget wxTimer在应用程序关闭时导致随机访问冲突,c++,wxwidgets,access-violation,shutdown,C++,Wxwidgets,Access Violation,Shutdown,我使用wxWidgets v3.0.1在wxFrame窗口上有一个相当简单的wxTimer循环,当处理关闭事件(例如文件/退出或对话框框架上的X)时,会随机导致访问冲突,然后在销毁()之前调用m_timer.stop() 我已经挖通了堆垛溢出物,尝试了我能找到的一切,但都没有用。有谁能给我一个指示,指出我可能会出错的地方吗 系统: 我在wxApp类中创建了一个应用程序类,并在使用wxAuiManager时(通过指针)传递给wxFrame、wxPanel 计时器由以下人员初始化: m_timer.

我使用wxWidgets v3.0.1在wxFrame窗口上有一个相当简单的wxTimer循环,当处理关闭事件(例如文件/退出或对话框框架上的X)时,会随机导致访问冲突,然后在销毁()之前调用m_timer.stop()

我已经挖通了堆垛溢出物,尝试了我能找到的一切,但都没有用。有谁能给我一个指示,指出我可能会出错的地方吗

系统: 我在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_projectModel的空指针,但没有帮助
  • 我已经删除了计时器中的所有代码,但它仍然崩溃
  • 已验证没有向3.0.2更改日志中添加计时器的修复程序
  • 应用程序不创建任何其他线程

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

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

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


    停止Parallels工具服务解决了问题。

    更新了问题,并提供了讨论中的诊断信息。非常奇怪。与该函数相关的所有资源管理代码看起来都很好。是对引发异常的
    ::DestroyWindow
    的调用吗?老实说,我真的不确定,第一个条目是>intmac_client.exe!WinMain(HINSTANCE_*HINSTANCE,HINSTANCE__*HPPreInstance,char*_; formal,int nCmdShow)第123行C++后跟>wxmsw30ud_core_vc_custom.dll!wxEntry(HINSTANCE_*HINSTANCE、HINSTANCE________;formal、char*__;formal、int-nCmdShow)行415 C++和堆栈顶部(调用堆栈窗口中最顶部的条目)?
    void wxTimerHiddenWindowModule::OnExit()
    {
        if ( ms_hwnd )
        {
            if ( !::DestroyWindow(ms_hwnd) )
            {
                wxLogLastError(wxT("DestroyWindow(wxTimerHiddenWindow)"));
            }