关于定时器和多线程的问题??

时间:2022-06-28 23:33:06
开了一个定时器,间隔为300ms,循环的播放3副图片以形成动态的效果,但是程序运行了大概5分钟后,屏幕就黑了,没图了,只剩下TextOut输出的文本,这是为什么,难道要用多线程吗????
代码如下:
if(nIDEvent==dynamic_bk) //动态背景播放
{
if(m_show_bk>2)
m_show_bk=0;

CClientDC dc(this); //客户区DC
                CDC compDC;        //内存DC
compDC.CreateCompatibleDC(&dc);  //创建内存DC与当前设备上下文相兼容
//////////////////////////////////////////
//CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,m_dynamicBk_rect.Width(),m_dynamicBk_rect.Height()); //创建兼容位图

        switch(m_show_bk)
{
case 0:
bitmap.LoadBitmap(IDB_BMP_MAINBK01);
break;
case 1:
bitmap.LoadBitmap(IDB_BMP_MAINBK02);
break;
case 2:
bitmap.LoadBitmap(IDB_BMP_MAINBK03);
break;
}
//BITMAP  bmp;
//bitmap.GetBitmap(&bmp);
                ////////////////////////////////////////////////////////////*/
compDC.SelectObject(&bitmap);
compDC.SetTextColor(RGB(255,0,0));
compDC.SetBkColor(RGB(245,245,245));
                compDC.TextOut(100,100,"m_show_value");
        dc.BitBlt(m_dynamicBk_rect.left,m_dynamicBk_rect.top,m_dynamicBk_rect.Width(),
                m_dynamicBk_rect.Height(),&compDC,0,0,SRCCOPY);
}
m_show_bk++;

5 个解决方案

#1


检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!
if(nIDEvent==dynamic_bk) //动态背景播放
{
    if(m_show_bk>2)
        m_show_bk=0;

    CClientDC dc(this); //客户区DC
    CDC compDC;        //内存DC
    compDC.CreateCompatibleDC(&dc);  //创建内存DC与当前设备上下文相兼容
    //////////////////////////////////////////
    //CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(&dc,m_dynamicBk_rect.Width(),m_dynamicBk_rect.Height()); //创建兼容位图

    switch(m_show_bk) {
    case 0:
        bitmap.LoadBitmap(IDB_BMP_MAINBK01);
        break;
    case 1:
        bitmap.LoadBitmap(IDB_BMP_MAINBK02);
        break;
    case 2:
        bitmap.LoadBitmap(IDB_BMP_MAINBK03);
        break;
    }
    //BITMAP  bmp;
    //bitmap.GetBitmap(&bmp);
    ////////////////////////////////////////////////////////////*/
    compDC.SelectObject(&bitmap);
    compDC.SetTextColor(RGB(255,0,0));
    compDC.SetBkColor(RGB(245,245,245));
    compDC.TextOut(100,100,"m_show_value");
    dc.BitBlt(m_dynamicBk_rect.left,m_dynamicBk_rect.top,m_dynamicBk_rect.Width(),
              m_dynamicBk_rect.Height(),&compDC,0,0,SRCCOPY);
    bitmap.DeleteObject();//加这句再试试?
}
m_show_bk++;

#2


感觉内存、句柄、GDI泄漏了,

#3


估计,是加载绘制图片的代码位置错误

定时器的消息响应函数中,不应该处理图片显示,等界面相关的信息。
定时器,只需要指定定对应的图片就可以了。
由绘制程序(MFC在 OnDraw  函数中处理,Win32  在OnPaint 中处理  )处理图片绘制的事情

#4


   从不考虑资源释放,,,,

#5


应该是资源泄漏造成,楼主打开资源管理器,点击菜单“查看”——“选择列”,将GDI相关选项勾选,然后运行程序,观察这些使用数量是不是在一直增长,如果是那么就说是GDI泄露了,要记得释放GDI喽!

#1


检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!
if(nIDEvent==dynamic_bk) //动态背景播放
{
    if(m_show_bk>2)
        m_show_bk=0;

    CClientDC dc(this); //客户区DC
    CDC compDC;        //内存DC
    compDC.CreateCompatibleDC(&dc);  //创建内存DC与当前设备上下文相兼容
    //////////////////////////////////////////
    //CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(&dc,m_dynamicBk_rect.Width(),m_dynamicBk_rect.Height()); //创建兼容位图

    switch(m_show_bk) {
    case 0:
        bitmap.LoadBitmap(IDB_BMP_MAINBK01);
        break;
    case 1:
        bitmap.LoadBitmap(IDB_BMP_MAINBK02);
        break;
    case 2:
        bitmap.LoadBitmap(IDB_BMP_MAINBK03);
        break;
    }
    //BITMAP  bmp;
    //bitmap.GetBitmap(&bmp);
    ////////////////////////////////////////////////////////////*/
    compDC.SelectObject(&bitmap);
    compDC.SetTextColor(RGB(255,0,0));
    compDC.SetBkColor(RGB(245,245,245));
    compDC.TextOut(100,100,"m_show_value");
    dc.BitBlt(m_dynamicBk_rect.left,m_dynamicBk_rect.top,m_dynamicBk_rect.Width(),
              m_dynamicBk_rect.Height(),&compDC,0,0,SRCCOPY);
    bitmap.DeleteObject();//加这句再试试?
}
m_show_bk++;

#2


感觉内存、句柄、GDI泄漏了,

#3


估计,是加载绘制图片的代码位置错误

定时器的消息响应函数中,不应该处理图片显示,等界面相关的信息。
定时器,只需要指定定对应的图片就可以了。
由绘制程序(MFC在 OnDraw  函数中处理,Win32  在OnPaint 中处理  )处理图片绘制的事情

#4


   从不考虑资源释放,,,,

#5


应该是资源泄漏造成,楼主打开资源管理器,点击菜单“查看”——“选择列”,将GDI相关选项勾选,然后运行程序,观察这些使用数量是不是在一直增长,如果是那么就说是GDI泄露了,要记得释放GDI喽!