调试断言在mfc中失败 [英] Debug assertion failed in mfc

查看:160
本文介绍了调试断言在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆