中断+显示,这样写对么?

[复制链接]
 楼主| 情场探花 发表于 2012-4-6 13:13 | 显示全部楼层 |阅读模式
环境: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;
}
hongong 发表于 2012-4-6 16:44 | 显示全部楼层
貌似很复杂
mage心寒 发表于 2012-4-7 14:49 | 显示全部楼层
2# hongong
因为人家是C++
您需要登录后才可以回帖 登录 | 注册

本版积分规则

472

主题

1259

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部

472

主题

1259

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部