开发者社区> night李> 正文

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;

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
vc/mfc获取rgb图像数据后动态显示及保存图片的方法
vc/mfc获取rgb图像数据后动态显示及保存图片的方法 该情况可用于视频通信中获取的位图数据回放显示或显示摄像头捕获的本地图像 第一种方法 #include 加载 vfw32.lib  链接库 [cpp] view plaincopy   //----------...
1569 0
itext在rtf文档中添加图片(略)
itext version 2.1.7 itext操作rtf文档其实还是挺方便的。 itext为图片操作提供了一个类com.lowagie.text.Image,使用方法如下: static Image createImage(URL path) { Image image;try { image = Image.
700 0
面试总结-进程、线程与多线程
线程、进程和多线程是面试过程中很容易遇到的问题,去年百度三面的时候就遇到这个问题,当时百度hr问到:线程和进程的区别是什么?你写过多进程或者多线程的程序吗?在你看来多线程和多进程程序那种程序比较难写? 第一个问题很常规,但是要完全答对却不是那么容易,现在想来,第二个问题和第三个问题实际是一个问题,因为第三个问题是验证第二个问题是否说实话的最好的方式。
1534 0
**apache环境下 禁止显示 index of/ 目录下(如何禁止访问网站根目录)
比如: http://123.57.49.XX6//  当这样访问的时候,可能会列出网站的根目录 如何禁止列出网站目录,方法如下:   让别人知道你的网站目录结构直接查看你目录下的所有文件是很危险的一个事情。
961 0
Android官方开发文档Training系列课程中文版:通知用户之在通知中显示进度
原文地址:http://android.xsoftlab.net/training/notify-user/display-progress.html#FixedProgress 通知中包含了一个进度指示器,用来向用户展示一项正在进行中的工作状态。
734 0
+关注
night李
对机器视觉 图像处理有一定的兴趣 要做一条有梦想的咸鱼
225
文章
4
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载