GUI接口的制作-控制台接口的关闭

当你在做GUI接口的时候,会有黑底白字的命令及提示字符出现真的很讨厌,明明已经是窗口接口了,为什么还需要有黑框跑出来,这个问题在OpenCV的程 序里都是这样执行的,也许久而久之就习惯了,不过,OpenCV还是可以做得到纯GUI接口,需要用到的是"wincon.h"(Windows Console)控制台控制接口的函数库,它包在"windows.h"里,而实际上"highgui.h"就有包含"windows.h"的函数库,直 接用"highgui.h"就好了,而要关闭黑底白字的控制台接口其实很简单,就只要用到FreeConsole()这个函数就好了,但是,控制台接口还 是必要的,因为OpenCV窗口接口少了很多窗口接口该有的功能,如Label,Button,Eidt,Memo等文字输入/显示的设计,如果真的需要 看到文字显示信息,或是输入数据,控制台的存在是不可或缺的.当关闭控制台接口时,如果说遇到要暂时输入文字信息则在用AllocConsole()再度 打开控制台吧.

Webcam关闭控制台程序
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <windows.h>


int main()
{
    FreeConsole();

    CvCapture *capture;
    IplImage *frame;

    capture =cvCaptureFromCAM(0) ;

    cvNamedWindow("Webcam",0);
    while(true)
    {
        frame = cvQueryFrame(capture);

        cvShowImage("Webcam",frame);

        if(cvWaitKey(10)>=0)
        {
            break;
        }

    }
    cvReleaseCapture(&capture);
    cvDestroyWindow("Webcam");

}
执行结果:


这 里实际上存在一个很严重的问题,当把控制台接口关闭的时候,虽然只会出现图像接口,但是,控制台的操控是在背景作业的,而打开的窗口接口是一个执行绪,想 了解执行绪是什么则要去看操作系统原理等相关书籍,所以在这边,如果是用cvWaitKey()的方法按键盘任意键结束窗口接口是不会有什么问题的,可是 如果是按GUI接口上右上角的关闭窗口,就会造成GUI接口这个执行绪被关闭,而实际上,背景作业的进程(process)仍在继续执行,如果说是用图片 档实例是没什么太大的问题,可是如果是用视频播放程序的话,即使把GUI接口关闭,但是它装置还是在继续播放的.它仍然在跑while循环,仍然在不停的 读图片,而这时的cvWaitKey()也失去作用了,因为cvWaitKey()是等待GUI接口上键盘事件的发生,而GUI接口这个执行绪被关闭了, 就会变成只会卡內存(约8MB以上),每秒不断造成分页错误的程序了.

产生问题:每秒产生988个分页错误(分页错误差异),卡死內存8700KB(8MB)


要解决这样的问题就要多加一个判断,当窗口接口的执行绪被关闭的时候就要顺便把进程也关闭,程序代码如下

Webcam关闭控制台程序2
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <windows.h>

int main()
{
    FreeConsole();

    CvCapture *capture;
    IplImage *frame;

    capture =cvCaptureFromCAM(0) ;

    cvNamedWindow("Webcam",0);
    while(true)
    {
        frame = cvQueryFrame(capture);

        cvShowImage("Webcam",frame);

        if(cvWaitKey(10)>=0)
        {
            break;
        }
        if(!cvGetWindowHandle("Webcam"))
        {
            break;
        }
    }
    cvReleaseCapture(&capture);
    cvDestroyWindow("Webcam");

}

这边的判断就只是多做了一个侦测"Webcam"这个窗口的HWND是否存在,如果不存在的话就跳出while循环,而程序才会继续跳出while的下一步释放內存并关闭这个程序的进程.

FreeConsole()
控制台接口背景作业

AllocConsole()
重新打开控制台接口