自学VC有几个星期了.前面几周把基础的内容给看了.然后就手痒了,想自己动手做点东西.
先做点简单的,做个定时关机的程序吧,调试了好久,运行后,调整日期日间先取器控件的时间,却出现了内存读错误.对这种错误真是一点办法都没有.把一些关键代码贴出来:
BOOL CPCTimeCtrlDlg::OnInitDialog()
{
CDialog::OnInitDialog(); AddIcon(); //启动计时器,一秒钟更新一次
    SetTimer(0,1000,NULL);
bSetTime=false;
bSetTime1=false;
bSetTime2=false;

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

return TRUE;  // return TRUE  unless you set the focus to a control
}void CPCTimeCtrlDlg::OnTimer(UINT nIDEvent)
{
int hour,min,sec;
    int yhour,ymin,ysec;
    
    CTime nowtime = CTime::GetCurrentTime();
m_sNowTime = nowtime.Format(_T("%Y-%m-%d %H:%M:%S"));
UpdateData(FALSE);

hour = nowtime.GetHour();
min  = nowtime.GetMinute();
sec  = nowtime.GetSecond();

yhour = m_Time.GetHour();
ymin  = m_Time.GetMinute();
ysec  = m_Time.GetSecond();
//如果时间到,则执行相应操作

if(bSetTime)
{
if(hour == yhour && min == ymin )
ExitWindowsEx(EWX_SHUTDOWN,0);
}

if(bSetTime1)
{
if(hour == yhour && min == ymin )
ExitWindowsEx(EWX_REBOOT,0);
}

if(bSetTime2)
{
if(hour == yhour && min == ymin )
ExitWindowsEx(EWX_LOGOFF,0);
}

CDialog::OnTimer(nIDEvent);

}void CPCTimeCtrlDlg::OnDatetimechangeDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult) 
{
// TODO: Add your control notification handler code here
UpdateData(true); //更新控件显示
*pResult = 0;
}
像这种内存错误一直困扰我,一点办法都没有.高手指教,小弟感激不尽!

解决方案 »

  1.   

    调整日期日间先取器控件的时间.
    对控件的操作要判断控件的句柄是不是为空,不然的话,你对控件的任何操作都会是无效的,你如果不清楚控件的生成流程的话,那么你每次使用控件之前,就要首先判定控件的句柄。还有就是你OnDatetimechangeDatetimepicker1是不是连续触发进入了,如果是连续循环触发的话,也有可能导致问题
      

  2.   

    没看到有内存分配,是不是ExitWindowsEx有问题?
      

  3.   

    定时关机不是你这么做的,在用VC编写程序的时候一般要尽量避免使用Timer,这个会消耗大量的系统资源,或者,当Timer的时间间隔过小的时候可能会出现内存问题或是程序直接出错发送报告。你将定时器设为5秒就应该不会有错了。
    纠正你的一个错误
    UpdateData(true);    //更新控件显示
    这句是你写的吧?UpdateData(TRUE) -- 刷新控件的值到对应的变量,UpdateData(FALSE) -- 拷贝变量值到控件显示。你的参数应该是UpdateData(FALSE),而不是用TRUE。
      

  4.   

    写定时关机的程序根本不需要定时器,你创建一个线程,将用户定义的关机时间和当前时间减一下,得出一个秒数对吧?然后你就让线程睡眠,睡眠醒来就ExitWindowsEx。WORD time;
    sleep(time);
    ExitWindowsEx(EWX_SHUTDOWN,0);这样子的话会节省很多很多的系统资源,实现起来又方便。
      

  5.   

    SetTimer(0,1000,NULL);  第一个参数是定时器标识ID,且不能为0(所以你这里就错误了)
    对应OnTimer(UINT nIDEvent)的nIDEvent,当设置了几个定时器,可以通过这个判别.
    当设置了定时器时,一定要KillTimer(定时器标识ID)
      
      

  6.   

    关闭窗口是要killtimer释放内存
      

  7.   

       SetTimer(0,1000,NULL); 第一个参数不能为0;
    最后还要killtimer释放内存