打印

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

[复制链接]
1642|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
情场探花|  楼主 | 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++

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

447

主题

1208

帖子

6

粉丝