MFC多线程进行图片的显示

在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;

其他两个按钮的功能通过改变全局变量来控制播放的暂停继续。

如果你是魔女,我只要化身魔王就可以了…..

时间: 2024-09-18 18:41:57

MFC多线程进行图片的显示的相关文章

如何从数据库中读取图片并显示在MFC picture控件当中?

问题描述 如何从数据库中读取图片并显示在MFC picture控件当中? 如何从sqlite读取图片并显示在MFC picture控件当中?新手啊,不知道大概怎么弄,如果能给几行代码,感激不尽! 解决方案 参考:http://blog.csdn.net/zhangyulin54321/article/details/8098484 解决方案二: MFC picture控件中显示图片MFC picture控件中显示图片MFC picture控件显示图片(新手)

软件-Euresys eVision不用图像卡将相机图片直接显示在MFC的对话框界面上

问题描述 Euresys eVision不用图像卡将相机图片直接显示在MFC的对话框界面上 在看Euresys eVision的图像处理软件,想知道不用它的图像卡怎么将相机采集回来的图像显示在界面上,编程环境是vc6.0基于对话框的

mfc surface 图片显示-mfc 用SURFACE的blit显示图片

问题描述 mfc 用SURFACE的blit显示图片 void CView::OnDraw(SURFACE* psurfTarget){ //简略片段 希望大家能够看懂 m_ImageCenter.Load(""center.psd""); m_ImageCenter.DrawImage(m_ImagePanal(width-m_ImageCenter.GetWidth())/2(height- m_ImageCenter.GetHeight())/2);} cla

如何把数据库中存放 BLOB 数据恢复成 JPEG 图片并显示在 MFC 对话框中呢?

问题描述 如何把数据库中存放 BLOB 数据恢复成 JPEG 图片并显示在 MFC 对话框中呢? 我把 JPEG 图像以 BLOB 类型存放在了 MYSQL 数据库中. 现在想把BLOB恢复成 JPEG 图像并显示在对话框中,该如何写代码呢? 解决方案 http://download.csdn.net/download/chenxh/145095 解决方案二: 如果我的回答帮助了您,请麻烦受累点下我回答右边的采纳 解决方案三: 二进制转换为图片文件 解决方案四: 使用ADO实现BLOB数据的存取

C++ 关于MFC多线程编程的注意事项

  这篇文章主要介绍了C++ 关于MFC多线程编程的注意事项的相关资料,需要的朋友可以参考下 在多线程编程中,最简单的方法,无非就是利用 AfxBeginThread 来创建一个工作线程,看一下这个函数的说明: 代码如下: CWinThread* AFXAPI AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize =

求助vs mfc opencv 做一个能显示摄像头的窗口

问题描述 求助vs mfc opencv 做一个能显示摄像头的窗口 各位大神好,我是一名即将大三的学生,老师要求我做一个窗口,能打开摄像头, 捕捉图片里的物体,并找到物体的中心点,然后传给机械手臂将物体抓起来, 现在一头雾水,请问还剩一周能完成吗?该从哪入手,各位大牛,走过路过给点小建议, 小弟感激不尽.. 解决方案 opencv2 在mfc窗口中显示关于cv::Mat 的解决方法OpenCv显示窗口移植到MFC 解决方案二: http://blog.csdn.net/liu1164316159

MFC如何改变图片控件大小?

问题描述 MFC如何改变图片控件大小? 如图,我想改变图片控件大小到方框那么大,好让图片适应控件显示,不知道怎么样才能做到?谢谢(很奇怪为什么不能拖动改变大小) 解决方案 你放的是什么控件,试试看picturebox或者static.另外你当前选定的是那个按钮,你先要选择图片控件,让它四周出现8个小方块 解决方案二: MFC的控件大小如何随对话框改变MFC控件大小随窗体大小而改变MFC控件大小随窗体大小而改变 解决方案三: 你VC的资源管理器中选中图片控件,然后拖动它的边框到对应的大小 或者你用

Android实现多线程下载图片的方法_Android

很多时候我们需要在Android设备上下载远程服务器上的图片进行显示,今天整理出两种比较好的方法来实现远程图片的下载.  方法一.直接通过Android提供的Http类访问远程服务器,这里AndroidHttpClient是SDK 2.2中新出的方法,API Level为8,大家需要注意下,静态访问可以直接调用,如果SDK版本较低可以考虑Apache的Http库,当然HttpURLConnection 或URLConnection也可以. static Bitmap downloadBitmap

C++ 关于MFC多线程编程的注意事项_C 语言

在多线程编程中,最简单的方法,无非就是利用 AfxBeginThread  来创建一个工作线程,看一下这个函数的说明: 复制代码 代码如下: CWinThread* AFXAPI AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_AT