Visual C++ 에서 문제입니다.

feelpassion의 이미지

학교 공학제에 낼 작품을 만들고 있습니다.microrobot.co.kr에서 판매하는 MYvision 프레임 그래버를 두대 사용해서 손가락의 움직임을 3차원 좌표로 받아 스크린에 글씨를 쓰는 작품을 만들려고 합니다. 각설하고...

문제는 Visual C++ 프로그램을 만드는 도중에 중간 중간 코딩을 해서 넣어보고 실행해보고를 반복하다보니까 어느 순간엔가 모르게 workspace가 열리지 않았습니다(확장자 .dsw) 열면 아무것도 보이지 않더군요. 그래서 프로젝트 파일을 열려고하니( 확장자 .dsp) 이상한 메세지가 뜨고 메모리가 부족하다고 하더군요... (컴터 실행하자마자 했는데 안됩니다. 다른 예제프로그램들은 잘만 돌아가는데...ㅠㅠ)
그 다음 다시 .dsw파일을 열면 workspace에 프로젝트가 하나 이상들어가 있다 새로운 workspace를 만들고 거기다 프로젝트를 넣어라라는 메세지가 뜹니다.(해봐도 안되던데...ㅠㅠ) 메세지를읽고나서 엔터키를 치면 아무일도 없던것처럼 창에 정상적인 클래스들과 Resource들... File구조가 뜹니다. 정상적인 것처럼 보이는 것이더군요... 그러나 ctrl+W키로 class wizard를 실행시킬 수 없습니다. 그러니까 새로운 텍스트 입력창 등을 넣을 수 없다는 얘기죠.
F5번을 눌러 실행을 시킨 후, 실행을 종료시키면 어떤 때는 윈도우즈의 고질적인 문제인 '파란화면'이 뜹니다. 어떤 때는 그냥 debug모드로 들어가구요. 파란화면에 나오는 에러메세지는 DRIVER_CORRUPTED_MMPOOL입니다.

아래는 소스코드입니다. HBUF m_hBUF 는 프레임 그레버에서 영상을 받아오는 버퍼이고 m_hDig는 프레임그레버 자체를 나타냅니다. 소스코드가 그 회사 라이브러리를 사용해서 이해하시는데 불편하실 것같네요^^;; 저 이상한 증상을이 왜 일어나는지 알고싶고 고칠려면 어떻게 해야하는지 알고싶습니다

참고로 제 시스템 사양은...
celeron 2.4GHz, 512MB, 120GB, Trident Video Accelerator(32M)
Windows 2003 Sever Enterprise
입니다.

고수님들의 도움부탁드립니다~

// RobotArmDlg.cpp : implementation file
//

#include "stdafx.h"
#include "RobotArm.h"
#include "RobotArmDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define WIDTH	320
#define HEIGHT	240
#define INPUTSERIALBUF 100  //시리얼 포트의 input/output 버퍼의 크기
#define OUTPUTSERIALBUF 100

#define BAUDRATE 19200 //전송속도

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRobotArmDlg dialog

CRobotArmDlg::CRobotArmDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CRobotArmDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CRobotArmDlg)
		// NOTE: the ClassWizard will add member initialization here

	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	m_hBufFirst = NULL;
	m_hBufSecond = NULL;
	m_hDigFirst = NULL;
	m_hDigSecond = NULL;
	m_hDispFirst = NULL;
	m_hDispSecond = NULL;
	m_hBufOutput= NULL;

	m_bProcess = FALSE;
	
	m_Rect.SetRect(320, 240, 320, 240);

}

void CRobotArmDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CRobotArmDlg)
	DDX_Control(pDX, IDC_STATIC_SCREEN2, m_staticImageSecond);
	DDX_Control(pDX, IDC_STATIC_SCREEN1, m_staticImageFirst);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CRobotArmDlg, CDialog)
	//{{AFX_MSG_MAP(CRobotArmDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDCAPTURE, OnCapture)
	ON_BN_CLICKED(IDEXIT, OnExit)
	ON_BN_CLICKED(IDSHOW, OnShow)
	ON_BN_CLICKED(IDSTOP, OnStop)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRobotArmDlg message handlers

BOOL CRobotArmDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	char * szDrvVer = sysGetDrvVer();
	if(!szDrvVer)
	{
		AfxMessageBox("설치된 Image Grabber가 없습니다.");
		PostQuitMessage(WM_QUIT);

		return FALSE;
	}

	m_hBufFirst = bufAlloc(WIDTH, HEIGHT,MV_RGB15 | MV_DOUBLE);
	if (!m_hBufFirst) 
		MessageBox("Can't Alloc Buffer");

	m_hBufSecond = bufAlloc(WIDTH, HEIGHT, MV_RGB15 | MV_DOUBLE);
	if(!m_hBufSecond)
		MessageBox("Can't Alloc BufferSecond");

	m_hBufOutput = bufAlloc(WIDTH, HEIGHT, MV_RGB15);
	if(!m_hBufOutput)
		MessageBox("Can't Alloc BufferOutput");

	m_hDigFirst = digAlloc(MV_DEV0);
	if (!m_hDigFirst) 
		MessageBox("Can't Alloc First Digitizer");

	m_hDigSecond = digAlloc(MV_DEV1);	
	if (!m_hDigSecond)
		MessageBox( "Cand't Alloc Second Digitizer");

	m_hDispFirst = dispAlloc(m_staticImageFirst.m_hWnd);
	if (!m_hDispFirst) 
		MessageBox("Can't Alloc Display");
		
	m_hDispSecond = dispAlloc(m_staticImageSecond.m_hWnd);
	if (!m_hDispSecond) 
		MessageBox("Can't Alloc Display");
	

	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CRobotArmDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CRobotArmDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CRobotArmDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CRobotArmDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	if(m_hBufFirst)
		bufFree(m_hBufFirst);
	if(m_hBufSecond)
		bufFree(m_hBufSecond);
	if(m_hBufOutput)
		bufFree(m_hBufOutput);
	if(m_hDispFirst)
		dispFree(m_hDispFirst);
	if(m_hDispSecond)
		dispFree(m_hDispSecond);
	if(m_hDigFirst)
		digFree(m_hDigFirst);
	if(m_hDigSecond)
		digFree(m_hDigSecond);
	
}

void CRobotArmDlg::OnCapture() 
{
	// TODO: Add your control notification handler code here
	digGrab(m_hDigFirst, m_hBufFirst);
	dispDisplay(m_hDispFirst, m_hBufFirst);
	digGrab(m_hDigSecond, m_hBufSecond);
	dispDisplay(m_hDispSecond, m_hBufSecond);
	
}

void CRobotArmDlg::OnExit() 
{
	// TODO: Add your control notification handler code here
	m_bProcess = FALSE;

	CDialog::OnOK();	
}

void CRobotArmDlg::OnShow() 
{
	// TODO: Add your control notification handler code here
		// 종료 버튼 Disable
	(CWnd*)GetDlgItem(IDEXIT)->EnableWindow(FALSE);	

	//capture 버튼 Disable
	(CWnd*)GetDlgItem(IDCAPTURE)->EnableWindow(FALSE);
	
	// Close 버튼 Diable
	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		pSysMenu->EnableMenuItem(SC_CLOSE,MF_BYCOMMAND | MF_DISABLED);
	}

	digGrabContinuous(m_hDigFirst, m_hBufFirst);
	digGrabContinuous(m_hDigSecond, m_hBufSecond);
	m_bProcess = TRUE;

	while (m_bProcess) {
		digGrabWait(m_hDigFirst, MV_FIELD_EVEN);
		dispDisplay(m_hDispFirst, m_hBufFirst);
		digGrabWait(m_hDigSecond, MV_FIELD_EVEN);
		dispDisplay(m_hDispSecond, m_hBufSecond);
	}

	
}

void CRobotArmDlg::OnStop() 
{
	// TODO: Add your control notification handler code here
	m_bProcess = FALSE;
//	m_bSearch = FALSE;
	//종료 버튼 Enable
	(CWnd*)GetDlgItem(IDEXIT)->EnableWindow(TRUE);

	//capture 버튼 Enable
	(CWnd*)GetDlgItem(IDCAPTURE)->EnableWindow(TRUE);
	
	//Close 버튼 Enable
	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if(pSysMenu != NULL)
	{
		pSysMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_ENABLED);
	}	
	
}
freezm7의 이미지

Devpia 에 물어보시는게 나을 듯...

즐겁게 살아 볼까나~*

feelpassion의 이미지

거긴 좀 거시기하더군요... 얼마나 산만한지...-.-
해결했습니다^^ Windog 내부 Thread문제더군요

남으로 창을 내겠소.
밭이 한참갈이 괭이로 파고 호미론 김을 메지요.
구름이 꼬인다 갈리있소. 새들의 노래는 공으로 들으랴오.
강냉이가 익거든 와자셔도 좋소.
왜 사냐건 웃지요.

ktd2004의 이미지

VC++에서 그런 문제가 좀 있는 것으로 압니다.
VC.NET에서는 좀 해결되었다고 하더군요.
그런데 VC.NET은 너무 무거운 느낌이 들더군요.
ClassWizard가 열리지 않을 때는 clw 파일을 삭제하고
다시 ClassWizard를 열면 새롭게 생성됩니다.
그리고 WorkSpace(dsw)나 Project(dsp)파일이 날라간 경우는
Empty 프로젝트를 생성한 후에 다시 소스파일들을 추가하면 될 것 같습니다.

feelpassion의 이미지

감사합니다^^ 그래도 다시는 쓰기싫더군요...-.-;; 작품전 일주일남았는데 다시 첨부터 새로 만들었습니다.
Qt가 비슷하다던데 Visual Studio만큼 쓰기 편한가요? 편한거 하나만큼은 인정입니다...ㅎㅎ

남으로 창을 내겠소.
밭이 한참갈이 괭이로 파고 호미론 김을 메지요.
구름이 꼬인다 갈리있소. 새들의 노래는 공으로 들으랴오.
강냉이가 익거든 와자셔도 좋소.
왜 사냐건 웃지요.

익명 사용자의 이미지

다시 로드해보시지요.. :idea:

익명 사용자의 이미지

ncb파일을 삭제하시고요 -.-;;

익명 사용자의 이미지

아참, 프로그램을 산만하게 작성하면 ^^;
그런 증상이 자주 나타납니다.

clw파일을 삭제했다가 새로 만들어야 할 때는, 어떤 클래스를 생성했다 다시 삭제하고 다시 만들었을 때 다시 만든 클래스가 클래스 위저드에 안 나올때 삭제하시면 좋고 말씀하신 증상은 ncb 파일을 삭제하시면 없어질 것입니다.

그리고 한가지 더, 저는 VC++6의 IDE를 그리 신뢰하지 않습니다.

feelpassion의 이미지

저도 역시나 였다는걸 알았습니다... 그런데 어쩌겠습니까? 벌써 새로 만들어버렸는데....ㅠㅠ

남으로 창을 내겠소.
밭이 한참갈이 괭이로 파고 호미론 김을 메지요.
구름이 꼬인다 갈리있소. 새들의 노래는 공으로 들으랴오.
강냉이가 익거든 와자셔도 좋소.
왜 사냐건 웃지요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.