我在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)"));
}
对我所做错的任何建议都会非常感激。
更新
答案 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服务解决了这个问题。