MFC多线程进行图片的显示

简介: 在MFC编程中开始学习都是只利用一个主线程,比较蛋疼的是,当你只用一个主线程进行如播放,查询时,MFC的界面会卡死,你无法进行其他的操作,这时需要进行多线程的编程,在操作时生成一个子线程来进行一些如播放,查询等的费时的操作。 多线程,经常会与对实时性要求比较高的并行运算结合,用来隐藏数据传输过程中用到的等待时间。 基于MFC的多线程在上一篇博客的基础上进行改进: 1.简

在MFC编程中开始学习都是只利用一个主线程,比较蛋疼的是,当你只用一个主线程进行如播放,查询时,MFC的界面会卡死,你无法进行其他的操作,这时需要进行多线程的编程,在操作时生成一个子线程来进行一些如播放,查询等的费时的操作。
多线程,经常会与对实时性要求比较高的并行运算结合,用来隐藏数据传输过程中用到的等待时间。
基于MFC的多线程在上一篇博客的基础上进行改进:
1.简单建立如下的界面:
这里写图片描述
2给各个控制按键添加消息响应函数:
主要是对播放按钮填加函数使在点击按钮时生成一个子线程来播放图片:

        zhanting=0;
        hThread=CreateThread(NULL,
        0,
        (LPTHREAD_START_ROUTINE)ThreadFunc,
        NULL,
        0,
        &ThreadID);
        GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
        GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
        GetDlgItem(IDC_CONTIUN)->EnableWindow(FALSE);

通过调用CreateThread()函数来生成一个子线程;
在Dlg.h中声明句柄:

    HANDLE hThread;
    DWORD ThreadID;

GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
GetDlgItem(IDC_CONTIUN)->EnableWindow(FALSE);
为设置当按键被按下时其他各个框是否可被按下
下面是生成线程函数的代码:

    IplImage *image=NULL; //原始图像
    char filename[128];
    m_bRun=true;
    if(zhanting==0)
        i=2;
    else
    {
        i=weizhi;
    }
    for(;i<300;i++)
    {   
        UINT ID;
        ID=IDC_PICTURE;
        sprintf(filename,"5//%d.jpg",i);
        //if(image) 
        //  cvReleaseImage(&image);
        image = cvLoadImage(filename); //显示图片
        cvWaitKey(3);
        //DrawPicToHDC(image, IDC_Picture);
        //  CPicturesDlg.DrawPicToHDC(image, IDC_Picture);
        CDuoxiancDlg* pMainWnd=(CDuoxiancDlg*)AfxGetMainWnd();
        CDC *pDC = (CDC*)pMainWnd->GetDlgItem(ID)->GetDC();
        HDC hDC= pDC->GetSafeHdc();
        CRect rect;
        pMainWnd->GetDlgItem(ID)->GetClientRect(&rect);
        CvvImage cimg;
        cimg.CopyOf(image);
        cimg.DrawToHDC(hDC,&rect);
        pMainWnd->ReleaseDC(pDC);
        Sleep(30);
        cvReleaseImage(&image);
        if(!m_bRun)
        {
            weizhi=i;
            break;
        }
    }

由于生成子线程函数不继承Dlg类,所以要用声明一个Dlg类pMainWnd
由于这里还没有与数据库连接,直接在文件夹中放图片进行读取;
线程之间的通信,这里只是简单地定义了全局变量

volatile BOOL m_bRun;
volatile int weizhi;
volatile int i;
volatile int zhanting=0;

其他两个按钮的功能通过改变全局变量来控制播放的暂停继续。
这里写图片描述
如果你是魔女,我只要化身魔王就可以了…..

目录
相关文章
|
5月前
|
数据采集 XML 存储
【Python实战】Python多线程批量采集图片
【Python实战】Python多线程批量采集图片
|
Python
生活这么无聊,保存点小姐姐图片作为调料吧(多线程版本)
生活这么无聊,保存点小姐姐图片作为调料吧(多线程版本)
用python多线程抓取网站图片,速度极快
用python多线程抓取网站图片,速度极快
|
数据采集 Java Python
Python爬虫之多线程下载豆瓣Top250电影图片
爬虫项目介绍   本次爬虫项目将爬取豆瓣Top250电影的图片,其网址为:https://movie.douban.com/top250, 具体页面如下图所示:   本次爬虫项目将分别不使用多线程和使用多线程来完成,通过两者的对比,显示出多线程在爬虫项目中的巨大优势。
2464 0
|
数据采集 Java 存储
Java爬虫之多线程下载IMDB中Top250电影的图片
介绍   在博客:Java爬虫之下载IMDB中Top250电影的图片中我们实现了利用Java爬虫来下载图片,但是效率不算太高。
1544 1
|
Android开发
Android官方开发文档Training系列课程中文版:高效显示位图之在非UI线程中处理图片
原文地址:http://android.xsoftlab.net/training/displaying-bitmaps/process-bitmap.html 我们在上节课Load Large Bitmaps Efficiently中讨论了BitmapFactory.decode*方法,说到了不应该在UI线程中执行读取数据的过程,尤其是从磁盘或者网络上读取数据(或者其它读取速度次于内存的地方)。
1078 0
|
缓存 Java Android开发
使用Android新式LruCache缓存图片,基于线程池异步加载图片
import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.
955 0
下一篇
无影云桌面