调试断言在mfc中失败 [英] Debug assertion failed in mfc
本文介绍了调试断言在mfc中失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
首先,我简要介绍一下我的代码。我的代码以30Hz收集数据。如果我使用Ontimer,代码没有问题,但是当我使用多媒体计时器时,我的代码有一个错误:
First, I briefly describe my code. My code collect data in 30Hz. If I use Ontimer, the code is no problem but when I use Multimedia timer, my code have an error:
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp
Line: 946
这是我的代码(不完全):
This is my code (Not fully):
LONG CPredOTSDlg::nGetSystemTransformData( UINT wParam, LONG lParam )
{
char pszTemp[256];
CString szCBHandle, szPortNo;
int nRow = -1;
Rotation dtEulerRot;
if (!m_bIsTracking)
return 0;
//UpdateData(true);
#if 0
/*
* if tracking mode is 0, we are asking for TX data, else we are
* asking for BX data.
*/
if ( m_nTrackingMode == 0 )
{
if ( !pCommandHandling->nGetTXTransforms( m_bUse0x0800Option ? true : false ) )
return 0;
} /* if */
else if ( m_nTrackingMode == 1 )
{
if ( !pCommandHandling->nGetBXTransforms( m_bUse0x0800Option ? true : false ) )
return 0;
} /* else if */
#else
if ( !pCommandHandling->nGetTXTransforms( false ) )
return 0;
#endif
/* check for system flags */
//GetDlgItem(IDC_TEMPERATURE_NOTE)->SetWindowText(pCommandHandling->m_dtSystemInformation.bTemperatureOutOfRange ? _T("Temperature out of range") : _T("Temperature within range") );
//GetDlgItem(IDC_DIAGNOSTICS_PENDING)->EnableWindow(pCommandHandling->m_dtSystemInformation.bDiagnosticsPending);
//UpdateData(false);
/*
* if a new port has become occupied we do the following:
* 1) Stop tracking
* 2) Activate Ports
* 3) Start Tracking
*/
if ( pCommandHandling->m_dtSystemInformation.bPortOccupied )
{
if ( pCommandHandling->nStopTracking() &&
nActivatePorts() &&
pCommandHandling->nStartTracking() )
{
return 1;
}/* if */
/*
* We don't want the tracking thread to track if
* activating the ports failed!
*/
m_bStopTracking = true;
m_bIsTracking = FALSE;
return 0;
} /* if */
for ( int i = 0; i < NO_HANDLES; i ++ )
{
if ( pCommandHandling->m_dtHandleInformation[i].HandleInfo.bInitialized > 0 &&
pCommandHandling->m_dtHandleInformation[i].szToolType[1] != _T('8') )
{
/* only update the frame if the handle isn't disabled*/
if ( pCommandHandling->m_dtHandleInformation[i].Xfrms.ulFlags == TRANSFORM_VALID ||
pCommandHandling->m_dtHandleInformation[i].Xfrms.ulFlags == TRANSFORM_MISSING )
{
//m_szFrameNumber.Format( _T("%d"), pCommandHandling->m_dtHandleInformation[i].Xfrms.ulFrameNumber );
UpdateData(false);
//m_ctlFrameNo.RedrawWindow();
}/* if */
if( i == pCommandHandling->m_nRefHandle )
sprintf( pszTemp, _T("R%02X"), i );
else
sprintf( pszTemp, _T("%02X"), i );
#if 0
for ( int j = nRow+1; j < m_ctlTrackingList.GetItemCount(); j++ )
{
szPortNo = m_ctlTrackingList.GetItemText( j, 1 );
if ( pCommandHandling->m_dtHandleInformation[i].szPhysicalPort == szPortNo )
{
nRow = j;
break;
} /* if */
//nRow = -1;
} /* for */
#endif
/* fill the table */
//m_ctlTrackingList.SetItemText( nRow, 0, pszTemp );
if ( pCommandHandling->m_dtHandleInformation[i].Xfrms.ulFlags == TRANSFORM_VALID )
{
sprintf( pszTemp, _T("%.2f"),
pCommandHandling->m_dtHandleInformation[i].Xfrms.translation.x );
//m_ctlTrackingList.SetItemText( nRow, 2, pszTemp );
sprintf( pszTemp, _T("%.2f"),
pCommandHandling->m_dtHandleInformation[i].Xfrms.translation.y );
//m_ctlTrackingList.SetItemText( nRow, 3, pszTemp );
sprintf( pszTemp, _T("%.2f"),
pCommandHandling->m_dtHandleInformation[i].Xfrms.translation.z );
//m_ctlTrackingList.SetItemText( nRow, 4, pszTemp );
if( !m_bUseEulerAngles )
{
sprintf( pszTemp, _T("%.4f"),
pCommandHandling->m_dtHandleInformation[i].Xfrms.rotation.q0 );
//m_ctlTrackingList.SetItemText( nRow, 5, pszTemp );
sprintf( pszTemp, _T("%.4f"),
pCommandHandling->m_dtHandleInformation[i].Xfrms.rotation.qx );
//m_ctlTrackingList.SetItemText( nRow, 6, pszTemp );
sprintf( pszTemp, _T("%.4f"),
pCommandHandling->m_dtHandleInformation[i].Xfrms.rotation.qy );
//m_ctlTrackingList.SetItemText( nRow, 7, pszTemp );
sprintf( pszTemp, _T("%.4f"),
pCommandHandling->m_dtHandleInformation[i].Xfrms.rotation.qz );
//m_ctlTrackingList.SetItemText( nRow, 8, pszTemp );
}
else
{
CvtQuatToEulerRotation( &pCommandHandling->m_dtHandleInformation[i].Xfrms.rotation,
&dtEulerRot );
sprintf( pszTemp, _T("%.4f"), dtEulerRot.fYaw );
//m_ctlTrackingList.SetItemText( nRow, 5, pszTemp );
sprintf( pszTemp, _T("%.4f"), dtEulerRot.fPitch );
//m_ctlTrackingList.SetItemText( nRow, 6, pszTemp );
sprintf( pszTemp, _T("%.4f"), dtEulerRot.fRoll );
//m_ctlTrackingList.SetItemText( nRow, 7, pszTemp );
sprintf( pszTemp, _T("") );
//m_ctlTrackingList.SetItemText( nRow, 8, pszTemp );
}
sprintf( pszTemp, _T("%.4f"),
pCommandHandling->m_dtHandleInformation[i].Xfrms.fError );
//m_ctlTrackingList.SetItemText( nRow, 9, pszTemp );
#if 0
if ( pCommandHandling->m_dtHandleInformation[i].HandleInfo.bPartiallyOutOfVolume )
//m_ctlTrackingList.SetItemText( nRow, 10, _T("POOV") );
else if ( pCommandHandling->m_dtHandleInformation[i].HandleInfo.bOutOfVolume )
//m_ctlTrackingList.SetItemText( nRow, 10, _T("OOV") );
else
//m_ctlTrackingList.SetItemText( nRow, 10, _T("OK") );
#endif
//-> 20130322_hs.choi: 타이머에서 사용할 데이터 담기
if(i == 1)
{
m_GantryX.px = pCommandHandling->m_dtHandleInformation[i].Xfrms.translation.x;
m_GantryX.py = pCommandHandling->m_dtHandleInformation[i].Xfrms.translation.y;
m_GantryX.pz = pCommandHandling->m_dtHandleInformation[i].Xfrms.translation.z;
m_GantryX.rx = dtEulerRot.fYaw;
m_GantryX.ry = dtEulerRot.fPitch;
m_GantryX.rz = dtEulerRot.fRoll;
CvtQuatToRotationMatrix(&pCommandHandling->m_dtHandleInformation[i].Xfrms.rotation,m_motgRM);
}
else if(i == 2)
{
m_MeasuredX.px = pCommandHandling->m_dtHandleInformation[i].Xfrms.translation.x;
m_MeasuredX.py = pCommandHandling->m_dtHandleInformation[i].Xfrms.translation.y;
m_MeasuredX.pz = pCommandHandling->m_dtHandleInformation[i].Xfrms.translation.z;
m_MeasuredX.rx = dtEulerRot.fYaw;
m_MeasuredX.ry = dtEulerRot.fPitch;
m_MeasuredX.rz = dtEulerRot.fRoll;
CvtQuatToRotationMatrix(&pCommandHandling->m_dtHandleInformation[i].Xfrms.rotation,m_motxRM);
}
//<- 20140123_Hung
}/* if */
#if 0
else
{
if ( pCommandHandling->m_dtHandleInformation[i].Xfrms.ulFlags == TRANSFORM_MISSING )
m_ctlTrackingList.SetItemText( nRow, 2, _T("MISSING") );
else
{
m_ctlTrackingList.SetItemText( nRow, 2, _T("DISABLED") );
/* EC-03-0071 */
if (m_ctlPortHandleCB.GetCurSel() >= 0)
{
m_ctlPortHandleCB.GetLBText( m_ctlPortHandleCB.GetCurSel(), szCBHandle );
if ( !(strncmp( (LPSTR) (LPCSTR)szCBHandle, pszTemp, 2 )) &&
pCommandHandling->m_dtHandleInformation[i].HandleInfo.bEnabled )
{
/* if port has become DISABLED show it in the check box */
m_szManufID = _T("");
m_bPortEnabled = FALSE;
m_bPortInitialized = FALSE;
m_szSerialNo = _T("");
m_szToolRev = _T("");
m_szToolType = _T("");
m_szPartNumber = _T("");
UpdateData(false);
} /* if */
}
} /* else */
m_ctlTrackingList.SetItemText( nRow, 3, _T("---") );
m_ctlTrackingList.SetItemText( nRow, 4, _T("---") );
m_ctlTrackingList.SetItemText( nRow, 5, _T("---") );
m_ctlTrackingList.SetItemText( nRow, 6, _T("---") );
m_ctlTrackingList.SetItemText( nRow, 7, _T("---") );
if( !m_bUseEulerAngles )
m_ctlTrackingList.SetItemText( nRow, 8, _T("---") );
else
m_ctlTrackingList.SetItemText( nRow, 8, _T("") );
m_ctlTrackingList.SetItemText( nRow, 9, _T("---") );
if ( pCommandHandling->m_dtHandleInformation[i].HandleInfo.bPartiallyOutOfVolume )
m_ctlTrackingList.SetItemText( nRow, 10, _T("POOV") );
else if ( pCommandHandling->m_dtHandleInformation[i].HandleInfo.bOutOfVolume )
m_ctlTrackingList.SetItemText( nRow, 10, _T("OOV") );
else
m_ctlTrackingList.SetItemText( nRow, 10, _T("---") );
}/* else */
#endif
}/* if */
}/* for */
//m_ctlTrackingList.RedrawItems(0, m_ctlTrackingList.GetItemCount()-1);
//m_ctlTrackingList.UpdateWindow();
return 1;
} /* nGetSystemTransformData */
调试时会在行创建一个断点
And when debugging it creates a breakpoint at line
if( i == pCommandHandling->m_nRefHandle )
sprintf( pszTemp, _T("R%02X"), i );
else
sprintf( pszTemp, _T("%02X"), i );
这里是我的回调函数
Here, is my callback function
void CALLBACK TimeProc(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
CCriticalSection cs;
CPredOTSDlg* obj = (CPredOTSDlg*) dwUser;
//obj->MMTimerHandler(wTimerID);
cs.Lock();
obj->nGetSystemTransformData(0,0); /* Get tumor position */
cs.Unlock();
}
如何解决这个问题?
How can I solve this problem?
推荐答案
它听起来相对简单:使用来自回调(工作线程)的PostThreadMessage,带有自己的消息ID,通知GUI有关新数据的信息。
这里应该说明我的意思: PostThreadMessage揭秘 [ ^ ]
it sound relativly easy: use PostThreadMessage from the callback (worker thread) with a own message ID to inform the GUI about new data.
Here should be demonstrated what I mean: PostThreadMessage Demystified[^]
1。你必须使用ON_THREAD_MESSAGE
2.是从实际线程分配的缓冲区,足够大
1. you must use ON_THREAD_MESSAGE
2. is the buffer allocated from the actual thread and big enough
sprintf( m_szCommand, "TX %04X", nReplyMode );
3. PostThreadMessage(m_idThread,MM_PCB,0 ,0); // m_idThread必须是目标,即UI-Thread
3. PostThreadMessage(m_idThread, MM_PCB,0,0);//m_idThread must be target ie UI-Thread
这篇关于调试断言在mfc中失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文