C++定时扫描
小弟接触C++没多久,这几天在做Wifi信号扫描程序时遇到麻烦了,请各路大侠不吝赐教:
程序要求是每隔1s扫描一次,并把扫描结果显示在CtrlList控件中。我用SetTimer()定时器做了(因为这好像简单些),结果也能跑,但问题是程序跑了一段时间(大约是扫描了128次)后就停下来了,而且再次按“扫描”按钮也没用,我想让它一直跑下去,有什么解决办法?
附:
我的“扫描”按钮代码和OnTimer()函数代码如下:
void CmyWifiDlg::OnBnClickedButtonScan()
{
// TODO: 在此添加控件通知处理程序代码
SetTimer(1000,800,NULL);//ID为1000,间隔为800ms
}
void CmyWifiDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch(nIDEvent)
{
case 1000:
m_ListWifi.SetRedraw(FALSE);//CtrlList控件
EnumInterface();//实现扫描的主要函数
m_ListWifi.SetRedraw(TRUE);
m_ListWifi.UpdateWindow();
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
多谢各位大侠了!!!
[解决办法]
程序本身看不出什么问题,可能和EnumInterface()的具体实现有关,实际上也可以用另外的解决方案,就是单独写一个扫描的线程,用一个无限循环来实现重复扫描:
while ( !Terminate ) {
ScanWifi();
Sleep(1000);
}
[解决办法]
加断点看看是什么问题。确定是否定时器被关闭了。
[解决办法]
UINT nTimer;void CmyWifiDlg::OnBnClickedButtonScan(){ // TODO: 在此添加控件通知处理程序代码 nTimer=SetTimer(1000,800,NULL);//ID为1000,间隔为800ms}void CmyWifiDlg::OnTimer(UINT_PTR nIDEvent){ // TODO: 在此添加消息处理程序代码和/或调用默认值 switch(nIDEvent) { case 1000: KillTimer(nTimer); m_ListWifi.SetRedraw(FALSE); //CtrlList控件 EnumInterface(); //实现扫描的主要函数 m_ListWifi.SetRedraw(TRUE); m_ListWifi.UpdateWindow(); nTimer=SetTimer(1000,800,NULL);//ID为1000,间隔为800ms break; default: break; }}CDialog::OnTimer(nIDEvent); }
[解决办法]
计时器一旦SetTimer,在KillTimer之前会一直运行
扫描128次后就失效,更大的可能是你的EnumInterface()函数有问题,只能运行128次
自己在OnTimer内加个计数,在计数上下断点,看看计时器能否运行到第200次,如果能,那问题就很明显了
[解决办法]