C++ Wxwidget wxTimer在应用程序关闭时导致随机访问冲突
我使用wxWidgets v3.0.1在wxFrame窗口上有一个相当简单的wxTimer循环,当处理关闭事件(例如文件/退出或对话框框架上的X)时,会随机导致访问冲突,然后在销毁()之前调用m_timer.stop() 我已经挖通了堆垛溢出物,尝试了我能找到的一切,但都没有用。有谁能给我一个指示,指出我可能会出错的地方吗 系统: 我在wxApp类中创建了一个应用程序类,并在使用wxAuiManager时(通过指针)传递给wxFrame、wxPanel 计时器由以下人员初始化: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.
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;
}
}
}
}
任何关于我做错了什么的建议都将不胜感激
更新:
我发现问题不是由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)"));
}