环境:VC6,XP。
目的:计算中断次数,并显示之。
中断次数用 giCnt1K 和 giCntInterrupt 来计算,OnInterrupt()是中断服务程序,它向主线程发送消息WM_REFRESH_WINDOW,由OnRefreshWindow()来刷新屏幕。
gbMsgPost是OnRefreshWindow()和OnInterrupt()之间的同步变量,避免一下子发很多个消息把消息队列撑爆了。
症状:giCntInterrupt计到数百的时候,程序会死掉,不再计数了。而且即使用任务管理器杀,也没法杀掉进程。
请高手相助,谢谢!
#define WM_REFRESH_WINDOW WM_USER+103
int giCntInterrupt;
int giCnt1K;
bool gbMsgPost; //true 表示上次的消息还没处理。false可以发送新消息。
BEGIN_MESSAGE_MAP(CPCI9054AppDlg, CDialog)
//{{AFX_MSG_MAP(CPCI9054AppDlg)
这里有很多系统生成的消息,都略去了
//}}AFX_MSG_MAP
ON_MESSAGE(WM_REFRESH_WINDOW, OnRefreshWindow)
END_MESSAGE_MAP()
LRESULT CPCI9054AppDlg::OnRefreshWindow(WPARAM wParam, LPARAM lParam)
{
m_edtInt = giCntInterrupt;
UpdateData(false);
gbMsgPost = false;
return 0;
}
LRESULT CPCI9054AppDlg::OnInterrupt(WPARAM wParam, LPARAM lParam)
{
……
……
giCnt1K ++;
if (giCnt1K >= 999)
{
giCnt1K = 0;
giCntInterrupt++; //@@@
if (giCntInterrupt >= 65520)
{ giCntInterrupt = 0;
}
if (!gbMsgPost)
{
gbMsgPost = true;
PostMessage(WM_REFRESH_WINDOW, 0, 0);
}
}
……
……
return 0;
}
void CPCI9054AppDlg::OnBtnS3Int()
{
// TODO: Add your control notification handler code here
giCntInterrupt = 0;
giCnt1K = 0;
gbMsgPost = false;
CWinThread* receiveThread;
if (!m_bLoop)
{
receiveThread = AfxBeginThread(GenS3Int,this, THREAD_PRIORITY_HIGHEST);
m_bLoop = true;
}
else
{
m_bLoop = FALSE;
}
return;
}
UINT CPCI9054AppDlg::GenS3Int(LPVOID pParam)
{
……
……
CPCI9054AppDlg* dlg = (CPCI9054AppDlg*)pParam;
while (dlg->m_bLoop)
{
Sleep(1);
}
……
……
return 32;
} |