Software/Programming2012. 8. 10. 22:10

제가 프로그램을 짜고있는데 커머파일은 되는데 실행할때 에러가 나서요ㅠㅠ

 

제 프로그램의 내용은 이미지 파일 두개를 연속으로 열고 그 후에 지정된 폴더에 있는 이미지 파일을 연속적으로 여는건데요

 

문제는 이미지 파일 두개를 연속으로 열때는 문제가 없는데 그 후에 지정된 폴더내에 있는 이미지 파일을 연속적으로 열려고 할때 에러가 난다는 겁니다. 에러의 내용은

 

 

 

이거구요ㅠㅠ

 

그림 맨위에 gray in light.bmp 파일이 첫번째로 open한 파일의 이름입니다.

 

이미지 파일 두개를 오픈하는 소스는 다음과 같구요

 

BOOL CWinColorDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
 if (!CDocument::OnOpenDocument(lpszPathName))
  return FALSE;
 //1번째 이미지 파일
 // TODO: Add your specialized creation code here
 CFile hFile;
 hFile.Open(lpszPathName,CFile::modeRead | CFile::typeBinary);
 hFile.Read(&dibHf,sizeof(BITMAPFILEHEADER)); // 파일 헤드를 읽음
 if(dibHf.bfType!=0x4D42)
 {
  AfxMessageBox("Not BMP file!!");
  return FALSE;
 } //이 파일이 BMP파일인지 검사. 0x4d42=='BM'
 hFile.Read(&dibHi,sizeof(BITMAPINFOHEADER)); //"영상정보의 Header"를 읽는다. 
 if(dibHi.biBitCount!=8 && dibHi.biBitCount!=24)
 {
  AfxMessageBox("Gray/True Color Possible!!");
  return FALSE;
 }
 if(dibHi.biBitCount==8)
  hFile.Read(palRGB,sizeof(RGBQUAD)*256);

 // 메모리 할당 (바뀐 부분)
 int ImgSize;
 if(dibHi.biBitCount==8) ImgSize = hFile.GetLength()-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER)-256*sizeof(RGBQUAD);
 else if(dibHi.biBitCount==24) ImgSize = hFile.GetLength()-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER);
 m_InImg = new unsigned char [ImgSize]; //dibHi.biSizeImage

 m_OutImg = new unsigned char [ImgSize];
 
 hFile.Read(m_InImg, ImgSize);

 height = dibHi.biHeight;
 width = dibHi.biWidth;
 
 if(dibHi.biBitCount==24){} //return TRUE;
 // 영상데이터 대입
 
 int i,j,index;
 int rwsize = WIDTHBYTES(dibHi.biBitCount*width);
 for( i=0; i<height; i++)
 {
  index = i*rwsize;
  for(j=0; j<width; j++)
   m_InImg[index+j] = (unsigned char)palRGB[(int)m_InImg[index+j]].rgbBlue;
 }
   
 
 hFile.Close();
 

 //2번째 이미지 파일
 CFile h1File;
 CFileDialog dlg(TRUE);
 if (dlg.DoModal() == IDOK )
 {
  CString lpszPathName2 = dlg.GetPathName();
  h1File.Open(lpszPathName2,CFile::modeRead | CFile::typeBinary);
  h1File.Read(&dibHf1,sizeof(BITMAPFILEHEADER)); // 파일 헤드를 읽음

  if(dibHf1.bfType!=0x4D42)
  {
   AfxMessageBox("Not BMP file!!"); return FALSE;
  } //이 파일이 BMP파일인지 검사. 0x4d42=='BM'
  h1File.Read(&dibHi1,sizeof(BITMAPINFOHEADER)); //"영상정보의 Header"를 읽는다. 
  if(dibHi1.biBitCount!=8 && dibHi1.biBitCount!=24)
  {
   AfxMessageBox("Gray/True Color Possible!!");
   return FALSE;
  }
  
  if(dibHi1.biBitCount==8)
   h1File.Read(palRGB,sizeof(RGBQUAD)*256);

  // 메모리 할당 (바뀐 부분)
  int ImgSize1;
  if(dibHi1.biBitCount==8) ImgSize1 = h1File.GetLength()-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER)-256*sizeof(RGBQUAD);
  else if(dibHi1.biBitCount==24) ImgSize1 = h1File.GetLength()-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER);
  m_InImg1 = new unsigned char [ImgSize1]; //dibHi1.biSizeImage
  m_OutImg1 = new unsigned char [ImgSize1];


        h1File.Read(m_InImg1, ImgSize1);

  height1 = dibHi1.biHeight;
  width1 = dibHi1.biWidth;

 
  h1File.Close();
 
  //return TRUE;

  // 영상데이터1 대입
  
  int i1,j1,index1;
  int rwsize1 = WIDTHBYTES(dibHi1.biBitCount*width1);
  for(i1=0; i1<height1; i1++)
  {
   index1 = i1*rwsize1;
   for(j1=0; j1<width1; j1++)
    m_InImg1[index1+j1] = (unsigned char)palRGB[(int)m_InImg1[index1+j1]].rgbBlue;
  }

 }
 //if(dibHi1.biBitCount==24) //return TRUE;

 return TRUE;
}

 

폴더내에 있는 이미지 파일을 연속적으로 오픈하는 부분은 다음과 같습니다.

 

void CWinColorDoc::OnBatchAccumhist()
{
 // TODO: Add your command handler code here
/* CFileDialog dlg(TRUE);
 if (dlg.DoModal() == IDOK )
 {
 */
 CFileFind find; //file 검색을 위한 클래스
  CString path1 = "C:\\temp1\\*.bmp"; //원하는 폴더경로 지정
 CString fname;
 CString pname;

 int pWorking = find.FindFile((LPCTSTR)path1);//원하는 폴더 경로에  조건에 맞는 파일이 있으면 1, 없으면 0

  if (pWorking==0) {

   AfxMessageBox("파일이 없습니다.");

  }

  while(pWorking)
  {
   pWorking = find.FindNextFile(); //다음 파일 찾기
   fname = find.GetFileName(); //파일 이름 넘겨주기
   pname = find.GetFilePath(); //파일 경로 넘겨주기


 
   CFile h2File;//원하는 파일이 있을 경우 파일을 읽어들이기 위한 함수

   // CString lpszPathName3 = dlg.GetPathName();

    h2File.Open(pname,CFile::modeRead | CFile::typeBinary);

    h2File.Read(&dibHf2,sizeof(BITMAPFILEHEADER)); // 파일 헤드를 읽음

    h2File.Read(&dibHi2,sizeof(BITMAPINFOHEADER)); //"영상정보의 Header"를 읽는다.
   
     if(dibHi2.biBitCount!=8 && dibHi2.biBitCount!=24)
     {
      AfxMessageBox("Gray/True Color Possible!!");
    
     }

     if(dibHi2.biBitCount==8)

      h2File.Read(palRGB,sizeof(RGBQUAD)*256);


     // 메모리 할당 (바뀐 부분)
     double ImgSize=0.0;

         if(dibHi2.biBitCount==8)
       ImgSize = h2File.GetLength() -sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER)-256*sizeof(RGBQUAD);
      else if(dibHi2.biBitCount==24)
       ImgSize = h2File.GetLength()-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER);
   
      m_InImg2 = new unsigned char [ImgSize]; //dibHi.biSizeImage
    
      h2File.Read(m_InImg2, ImgSize);

      height2 = dibHi2.biHeight;
      width2 = dibHi2.biWidth;
    
      //if(dibHi2.biBitCount==24){} //return TRUE;
   
      // 영상데이터 대입  
   
      int i,j,index;
      int rwsize = WIDTHBYTES(dibHi2.biBitCount*width2);

      for( i=0; i<height2; i++)
      {
       index = i*rwsize;
       for(j=0; j<width2; j++)
        m_InImg2[index+j] = (unsigned char)palRGB[(int)m_InImg2[index+j]].rgbBlue;
      }
   

      OnAccFeatHisto();

      if (find.IsDirectory()) //디렉토리가 있으면
      {
       CString ffilename = pname+"\\";

       AfxMessageBox(ffilename);
       //fileopen. fullfilename
       // fclose
      } else { //디렉토리가 없으면-bmp 파일이면                                                        
       CString ffilename = pname;
       AfxMessageBox(ffilename);
       //fileopen. fullfilename                                                                                                                                                  
       //OnAcchisto();
       // fclose
      } 
   
      h2File.Close();
         delete m_InImg2;   
   }
  
  
// } 
 
}

Posted by 십자성군
Software/Programming2012. 8. 10. 22:08

// 1. 파일에서 비트맵 데이터를 읽어들임

HBITMAP dibLoadFromFile(LPCTSTR lpFileName)
{
    HANDLE hFile = CreateFile(lpFileName, GENERIC_READ, FILE_SHARE_READ,
                        NULL, OPEN_EXISTING, 0, NULL);

    if(hFile == INVALID_HANDLE_VALUE) return NULL;

 

    BITMAPFILEHEADER bmfh;

    DWORD dwRead;
    ReadFile(hFile, &bmfh, sizeof(BITMAPFILEHEADER), &dwRead, NULL);

 

    DWORD dwInfoLength = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);
    LPBITMAPINFO lpbmi = (LPBITMAPINFO)new BYTE[dwInfoLength];
    ReadFile(hFile, lpbmi, dwInfoLength, &dwRead, NULL);

 

    HDC hDC = GetDC(GetDesktopWindow());

 

    LPVOID lpDIBits;
    HBITMAP hDIB = CreateDIBSection(hDC, lpbmi, DIB_RGB_COLORS, &lpDIBits, NULL, 0);

    ReleaseDC(GetDesktopWindow(), hDC);

 

    ReadFile(hFile, lpDIBits, lpbmi->bmiHeader.biSizeImage, &dwRead, NULL);

    CloseHandle(hFile);

 

    delete [] lpbmi;

 

    return hDIB;
}

 

// 2. 비트맵 데이터를 24비트 트루칼라로 바꿈

void dibSetTrueColor(HBITMAP* phDIB)
{
    DIBSECTION ds;
    GetObject(*phDIB, sizeof(DIBSECTION), &ds);

    if(ds.dsBmih.biBitCount == 24) return;

 

    HDC hDC = GetDC(GetDesktopWindow());

    HBITMAP hDDB = CreateCompatibleBitmap(hDC, ds.dsBm.bmWidth, ds.dsBm.bmHeight);
    SetDIBits(hDC, hDDB, 0, ds.dsBm.bmHeight, ds.dsBm.bmBits,

                    (LPBITMAPINFO)&ds.dsBmih, DIB_RGB_COLORS);

 

    BITMAPINFOHEADER bmih;
    ZeroMemory(&bmih, sizeof(BITMAPINFOHEADER));
    bmih.biSize = sizeof(BITMAPINFOHEADER);
    bmih.biWidth = ds.dsBm.bmWidth;
    bmih.biHeight = ds.dsBm.bmHeight;
    bmih.biPlanes = 1;
    bmih.biBitCount = 24;
    bmih.biCompression = BI_RGB;

 

    LPVOID lpDIBits;
    HBITMAP hDIB = CreateDIBSection(hDC, (LPBITMAPINFO)&bmih, DIB_RGB_COLORS,

                    &lpDIBits, NULL, 0);
    GetDIBits(hDC, hDDB, 0, ds.dsBm.bmHeight, lpDIBits, (LPBITMAPINFO)&bmih,

                    DIB_RGB_COLORS);

    ReleaseDC(GetDesktopWindow(), hDC);

 

    DeleteObject(hDDB);
    DeleteObject(*phDIB);

    *phDIB = hDIB;
}

 

// 3. 비트맵의 밝기를 조절

void dibSetBrightness(HBITMAP hDIB, int nLevel)
{
    DIBSECTION ds;
    GetObject(hDIB, sizeof(DIBSECTION), &ds);
    if(ds.dsBmih.biBitCount != 24) return;

 

    for(int y = 0; y < ds.dsBm.bmHeight; y++) {
        RGBTRIPLE* lpLine = (RGBTRIPLE*)ds.dsBm.bmBits + (y * ds.dsBm.bmWidth);
        for(int x = 0; x < ds.dsBm.bmWidth; x++) {
            RGBTRIPLE rgbT = lpLine[x];
            int r = (int)rgbT.rgbtRed + nLevel;
            int g = (int)rgbT.rgbtGreen + nLevel;
            int b = (int)rgbT.rgbtBlue + nLevel;
            rgbT.rgbtRed = (r > 255) ? 255 : ((r < 0) ? 0 : r);
            rgbT.rgbtGreen = (g > 255) ? 255 : ((g < 0) ? 0 : g);
            rgbT.rgbtBlue = (b > 255) ? 255 : ((b < 0) ? 0 : b);
            lpLine[x] = rgbT;

            }
        }
}

 

// 4. 비트맵 데이터를 파일에 저장

BOOL dibSaveToFile(LPCTSTR lpFileName, HBITMAP hDIB)
{
    HANDLE hFile = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,

                        FILE_ATTRIBUTE_NORMAL, NULL);
    if(hFile == INVALID_HANDLE_VALUE) return FALSE;

 

    DIBSECTION ds;
    GetObject(hDIB, sizeof(DIBSECTION), &ds);

 

    int nColors = 0;
    if(ds.dsBmih.biBitCount <= 8)
        nColors = (ds.dsBmih.biClrUsed) ? ds.dsBmih.biClrUsed : (1 << ds.dsBmih.biBitCount);

 

    BITMAPFILEHEADER bmfh;
    bmfh.bfType = 'MB';
    bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)

                            + nColors * sizeof(RGBQUAD);
    bmfh.bfSize = bmfh.bfOffBits + ds.dsBmih.biSizeImage;
    bmfh.bfReserved1 = bmfh.bfReserved2 = 0;

 

    DWORD dwWritten;
    WriteFile(hFile, &bmfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
    WriteFile(hFile, &ds.dsBmih, sizeof(BITMAPINFOHEADER) + nColors * sizeof(RGBQUAD),

                        &dwWritten, NULL);
    WriteFile(hFile, ds.dsBm.bmBits, ds.dsBmih.biSizeImage, &dwWritten, NULL);
    CloseHandle(hFile);


    return TRUE;
}

Posted by 십자성군
Software/Programming2012. 8. 10. 00:31

http://nenunena.tistory.com/66

'Software > Programming' 카테고리의 다른 글

MFC 비트맵 파일처리 3. (수정필요)  (0) 2012.08.10
MFC 비트맵 파일 다루기 1.  (0) 2012.08.10
MFC의 흐름  (0) 2012.08.10
도큐먼트 뷰 객체 설명  (0) 2012.08.10
CFileDialog  (0) 2012.08.10
Posted by 십자성군
Software/Programming2012. 8. 10. 00:30

MFC의 흐름

http://blog.naver.com/gorory?Redirect=Log&logNo=20031488529

Posted by 십자성군
Software/Programming2012. 8. 10. 00:28

Visual C++ 프로그램

    -. 어렵게만 느껴졌던 도큐먼트 뷰구조

    -. 비주얼C++프로그램 쉽게 분석하기

    -. 도큐먼트 뷰 구조 자세히 공부하기

    -. 도대체 애플리케이션 프레임워크가 뭡니까?


  가. 어렵게만 느껴졌던 도큐먼트 뷰구조


    1) 도큐먼트 뷰구조

      ? theApp : 애플리케이션의 수행과 관련된 일

      ② CMainFrame클래스로 동적할당한 객체 : 프레임윈도우와 관련된일

      ③ 도큐먼트 객체 : 파일입출력만 전문적으로 담당

      ④ 뷰 객체 : 화면 출력만 전문적으로 담당


    2) 애플리케이션 유형과 애플리케이션 위저드

      ? 프레임윈도우 객체: 메뉴, 툴바, 상태바

      ② 뷰윈도우 : 프레임윈도우가 둘러싸는 공간. 즉 클라이언트 영역

      ③ 윈도우를 갖지 않는 객체 : theApp(애플리케이션객체)와 도큐먼트 객체

      ④ 도큐먼트와 뷰가 필요없는 경우 =>대화상자(계산기, 전화걸기등)

      ⑤ 도큐먼트가 하나인 경우 =>SDI애플리케이션(워드패트)

      ⑤ 도큐먼트가 여러개인 경우 =>MDI애플리케이션(MS워드)


  나. 비주얼C++프로그램 쉽게 분석하기

     

  // 윈도우 생성

  hwnd = CreateWindow(szAppName)

  "Hello2",

  WS_OVERLAPPENDWINDOW,

  CW_USEDFAULT,

  CW_USEDFAULT,     

  CW_USEDFAULT, 

  CW_USEDFAULT,

  NULL,

  NULL,

  hInstance,

  NULL);

  





      ① WS_OVERLAPPENDWINDOW :두꺼운 프레임과 최소/최대 상자,

                                      그리고 시스템 메뉴가 있는 윈도우 형식

      ② WS_OVERLAPPEND : 윈도우 크기 조절할 수 없다

      ③ ShowWIndow : API프로그램에서 윈도우 표시 최소화/ 최대화


  다. 도큐먼트 뷰구조 자세히 공부하기

    1) 메인프레임 윈도우 객체가 할 수 있는 일들

      ? 윈도우 위치와 크기 지정하기

         - PreCreateWindow함수

            :메인프레임윈도우 객체가 생성된 후 윈도우가 생성되기 바로전에 실행되는 함수      

 // 화면 가운데

        cs.cx=::GetSystemMetrics(SM_CXSCREEN) /2;

        cs.cy=::GetSystemMetrics(SM_CYSCREEN) /2;

        cs.x=((cs.cx*2)-cs.cx)/2;

        cs.y=((cs.cy*2)-cs.cy)/2;

       - ActivateFrame(int nCmdShow)

           : 최대화, 최소화 지정

 cs.style = WS_OVERLAPPED 

          | WS_CAPTION 

          | WS_SYSMENU            // 우위  종료

          | WS_THICKFRAME        // 두께

          | WS_MINIMIZEBOX        // - 박스

          | WS_MAXIMIZEBOX;       // 확대 박스


      ② 오른쪽 마우스 클릭시 종료

void CMainFrame::OnContextMenu(CWnd* pWnd, CPoint point)

{

        // TODO: Add your message handler code here

        PostQuitMessage(0);

}


      ③ 툴바 상태바 제어하기: 툴바 왼쪽에 붙이기

 DockControlBar(&m_wndToolBar, AFX_IDW_DOCKBAR_LEFT);


    2) 애플리케이션객체가 할 수 있는 일들(즉 theApp)

      ① 윈도우 클래스정의, 생성, 표시 그리고 메시지루프

           - InitApplication멤버함수

           - InitInstance멤버함수

           - Run멤버함수

           - ExitInstance멤버함수: 프로그램 종료

           중요: 멤버함수가 가상함수일 경우 상속받은 함수가 아닌 해당클래스에서

                 정의됨 함수가 호출됨.

         

      ② 도큐먼트객체와 메인프레임윈도우객체, 뷰객체 생성

        // Dispatch commands specified on the command line

        if (!ProcessShellCommand(cmdInfo))

                return FALSE;

        OnFileNew();

        pDocTemplate->OpenDocumentFile(NULL);

          - 3가지 모두 동일한 결과

          - OpenDocumentFile를 호출해도 됨(우선 도큐먼트객체 정의)

            

      ③ 도큐먼트 템플리트객체

        CSingleDocTemplate* pDocTemplate;

        pDocTemplate = new CSingleDocTemplate(

                IDR_MAINFRAME,

                RUNTIME_CLASS(CMyDoc),

                RUNTIME_CLASS(CMainFrame),     // SDI frame window

                RUNTIME_CLASS(CMyView));

        AddDocTemplate(pDocTemplate);

          - CMyDoc클래스, CMainFrame클래스, CMyView클래스이용

            세 개의 객체들 동적으로 할당한 후 객체들을 적절히 연결.

      ④ 윈도우 최대화/최소화

        m_pMainWnd->ShowWindow(SW_SHOW);

          - 메인프레임윈도우 객체의 AcrivateFrame에서 구현

          - InitInstance멤버함수에서도 수행함.


    3) 뷰 객체가 할 수 있는 일들

      ① 그리기

          - 메인프레임윈도우의 클라이언트영역 뷰가 덮어 버림

          - 예제로 왼쪽마우스로 문자열 출력시 뷰클래스멤버로 정의해야함.

void CMyView::OnLButtonDown(UINT nFlags, CPoint point)

{

        CClientDC dc(this);

        dc.TextOut(0,0, "왼쪽 마우스 버튼 누름");

        CView::OnLButtonDown(nFlags, point);

}

         (문제) 화면크기를 변경하면 사라짐

void CMyView::OnPaint()

{

        CPaintDC dc(this); // device context for painting

        dc.TextOut(0,0,"안녕 페이트");

}

         (문제) 인쇄미리보기 안나타남


void CMyView::OnDraw(CDC* pDC)

{

        CMyDoc* pDoc = GetDocument();

        ASSERT_VALID(pDoc);

        pDC->TextOut(0,0,"안녕 페이트");

}

         (문제) 미리보기에는 나타나는 데 화면과 불일치

               => 클래스위저드로 OnPaint멤버함수 삭제


      ② 도큐먼트주소 알아내기

         - 뷰가 도큐먼트에 있는 데이터를 출력 하기위해서 도큐먼트 주소를 알아야 함.

           (즉, GetDocument()멤버함수 호출

void CMyView::OnLButtonDown(UINT nFlags, CPoint point)

{

        CString szStr;

        szStr.Format("도큐먼트객체번지: %p.", GetDocument());

        MessageBox(szStr);

        

        CView::OnLButtonDown(nFlags, point);

}


    3) 도큐먼트 객체가 할 수 있는 일들

      ① 직렬화

         - 도큐먼트존재: 동적으로 할당되어 메모리 어딘가에존재함

         - 도큐먼트위치: 프레임윈도우클라이언트영역, 뷰윈도우 바로 아래

         - 도큐먼트객체: 파일로 저장하고 읽어오기

         - 직렬화(serialization) : 도큐먼트객체 멤버변수에 저장되어 있는 자료를

                                 일렬로 저장하거나 읽어오기(즉 파일입출력을 말함)

// 도큐먼트 멤버변수 정의

   CString m_szData;

// 도큐먼트초기화

BOOL CMyDoc::OnNewDocument()

{

   ...

   m_szData = "";

   return true;

}

// 직렬화 수행

void CMyDoc::Serialize(CArchive& ar)

{

        if (ar.IsStoring())

        {

                // 파일 저장하기

                ar << m_szData;

        }

        else

        {

                // 파일 불러오기

                ar >> m_szData;

        }

}

// 뷰화면에 표현

void CMyView::OnLButtonDown(UINT nFlags, CPoint point)

{       

     CString szCoord;

     szCoord.Format("마우스를 좌표:(%d, %d)", point.x, point.y);

        GetDocument()->m_szData=szCoord;

        Invalidate();   // 강제로 WM_PAINT메시지 발생  

        CView::OnLButtonDown(nFlags, point);

}

// 저장자료로 표시

void CMyView::OnDraw(CDC* pDC)

{

        CMyDoc* pDoc = GetDocument();

        ASSERT_VALID(pDoc);

        pDC->TextOut(0,0,GetDocument()->m_szData);

}


  라. 도대체 애플리케이션 프레임워크가 뭡니까?

    1) 도큐먼트 뷰 구조 및 애플리케이션 프레임워크

      ① 정의

         - 애플리케이션 객체(theApp)와 메인프레임윈도우 객체, 도큐먼트객체와

           뷰객체로 이루어진 애플리케이션을 말함

      ② 도큐먼트 뷰구조 목적

         - 역할 분담을 위함, 자료를 유지관리 역할을 하는 도큐먼트객체와

            자료를 표시하는 뷰객체를 둠

      ③ 각각의 객체가 특정 작업만을 수행=>모듈성 강화


    2) 애플리케이션프레임워크 안

      ① 디버깅 : Debug-Step Into , F11키누름

                  F10: 한줄씩 통째로

                  F11: 함수가 있을 경우 안으로 들어감

         - 애플리케이션 프레임워크 코드

             :tWinMain함수를 시작으로 일정한 순서대로 실행

         - 애플리케이셔 프레임워크 추적

             :F10키와 F11키를 번갈아 눌러서 처음부터 추적

      ② CTRL+F5: 운영체제는 tWinMain 함수를 가장 먼저 실행

      ③ AfxWinMain함수

         - 이함수 직접작성한 WinMain함수에 해당

         - theApp객체의 InitApplication멤버함수호출(정의,등록,생성,실행)


      ④ CAfxApp theApp

         - 반드시 하나만 존재 변경도 안됩니다

         - 두 개 입력시 에러(Debug Assertion Failed)


      ④ InitAppication 멤버함수

         - CAfxApp의 멤버로 정의하며 CWinApp로부터 상속

         - theApp의 객체는 두 개의 InitAppication멤버함수를 가지는데

           CAfxApp::InitAppication가 실행 됩니다.

           (이유 가상함수이기때문, 가상함수가 아니면 상속받은 멤버함수가 실행)

<변영철 비주얼C++ 참조>

Posted by 십자성군
Software/Programming2012. 8. 10. 00:00

관련글 :

■ MFC CFileDialog - 파일선택 다이얼로그

□ 디렉토리 및 파일 선택하기 - GetOpenFileName, CFileDialog, SHBrowseForFolder

□ SHELL 프로그램 - 디렉토리의 위치를 얻기위한 프로그램

 

 

파일 선택을 위한 클래스가  CFileDialog 이다.

 

 

한개의 파일만 선택할 경우

char szFilter[] = "Image (*.BMP, *.GIF, *.JPG) | *.BMP;*.GIF;*.JPG | All Files(*.*)|*.*||";

CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter);

if(IDOK == dlg.DoModal()) {

        CString strPathName = dlg.GetPathName();

}

 

 

여러개의 파일을 복수 선택할 경우

 

dwFlag에 OFN_ALLOWMULTISELECT 설정한다.

        선택된 여러 파일 리스트가 저장될 버퍼가 제공되야 한다.

        만일 기본 버퍼 이상의 파일을 선택해 확인 버튼을 누른다면,

        DoModal을 실행시켰을 때, IDCANCEL이 리턴되고, 파일 리스트가 넘어오지 않을 것이다.

 

char szFilter[] = "All Files(*.*) | *.* ||";
CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, szFiilter);

dlg.m_ofn.lpstrInitialDir = _T("D:/"); // 오픈할때 초기 경로 지정
// 여기서 버퍼 크기 늘려줘야 함.

char    strFile[4096] = { 0, };               CString fileName;
dlg.m_ofn.lpstrFile = strFile;                 dlg.m_ofn.lpstrFile = fileName.GetBuffer( 4096 );
dlg.m_ofn.nMaxFile = sizeof(strFile);      dlg.m_ofn.nMaxFile = 4096

if (IDOK == dlg.DoModal()) { 
   for (POSITION pos=dlg.GetStartPosition(); pos != NULL;) 
       CString strPathName =
 dlg.GetNextPathName(pos);
}

 

파일 선택 필터

static TCHAR BASED_CODE szFilter[] = 
_T("Chart Files (*.xlc)|*.xlc|") _T("Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|")
_T("*.xlc; *.xls|All Files (*.*)|*.*||");

 

 

예제

void CMyClass::OnFileOpen() 
{
// szFilters is a text string that includes two file name filters:
// "*.my" for "MyType Files" and "*.*' for "All Files."
TCHAR szFilters[]= _T("MyType Files (*.my)|*.my|All Files (*.*)|*.*||");

// Create an Open dialog; the default file name extension is ".my".
CFileDialog fileDlg(TRUE, _T("my"), _T("*.my"),
OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters);

// Display the file dialog. When user clicks OK,

fileDlg.DoModal()

// returns IDOK.
if (fileDlg.DoModal() == IDOK)
{
CString pathName = fileDlg.GetPathName();

// Implement opening and reading file in here.
// Change the window's title to the opened file's title.

CString fileName = fileDlg.GetFileTitle();
SetWindowText(fileName);
}
}

============================================================================

 

CFileDialog dlgFile(TRUE);


CString fileName;
const int c_cMaxFiles = 100;
const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;


dlgFile.GetOFN().lpstrFile = fileName.GetBuffer(c_cbBuffSize);
dlgFile.GetOFN().nMaxFile = c_cMaxFiles;

 

dlgFile.DoModal();


fileName.ReleaseBuffer();

 

 

============================================================================

 

 

CFileDialog::CFileDialog

 

 

explicit CFileDialog( BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL,
DWORD dwSize = 0,
BOOL bVistaStyle = TRUE );

 

BOOL bOpenFileDialog
       생성하는 다이얼로그 박스 타입을 지정해 주는 매개변수
       TRUE => 파일열기 다이얼로그 박스 
       FALSE => 파일 저장 다이얼로그 박스

LPCTSTR lpszDefExt
      기본 파일 확장자명(저장할 경우 사용)
       만약 유저가 파일이름 상자 안에 확장자를 포함하지 않는 경우
       lpszDefExt의 파일 확장자명을 자동으로 지정 함
       NULL => 확장자명을 추가하지 않음

lpszFileName
       시작할 때 파일이름 상자에 나타낼 이름 지정
        NULL => 시작할 때 파일이름을 나타내지 않음


dwFlags
       하나이상의 플래그를 사용하여 사용자가 원하는 다이얼로그 박스로 조합

        많이 사용되는 플래그 
        OFN_ALLOWMULTISELECT        한번에 여러개의 파일들을 선택 가능하게 함
        OFN_CREATEPROMPT              존재하지 않는 파일명을 입력했을 경우 새로 생성하겠냐는 대화상자 표시
        OFN_EXPLOPER                       열기나 저장하기를 윈도우 탐색기 스타일로 출력
        OFN_FILEMUSTEXIST               기존에 존재하는 파일 이름만 입력할 수 있도록 함
        OFN_HIDEREADONLY                읽기전용 파일은 출력하지 않음
        OFN_LONGNAMES                   긴 파일 이름을 사용할 수 있도록 함
        OFN_OVERWRITEPROMPT        저장할려고 하는 파일명이 존재할 경우 덮어쓰겠냐는 대화 상자 표시
        OFN_PATHMUSTEXIST             오직 유효한 경로나 파일명만을 입력(아님 경고 메세지 출력)

        추가 플래그 참조 : 
http://msdn.microsoft.com/ko-kr/library/ms646839(en-us,VS.85).aspx


lpszFilter
    사용할 파일들이 걸러지도록 파일명들을 연속으로 나열 함

pParentWnd
    부모나 소유자 윈도우의 파일 다이얼로그 박스의 포인터

dwSize
    OPENFILENAME 구조체의 크기

Posted by 십자성군
Software/Programming2012. 8. 9. 19:08

1. 여러개의 파일을 여는 함수를 만들 때 CFileDialog에서 문자관련 문제발생


void CWinTestApp::OnFileOpen()

{

// TODO: 여기에 명령 처리기 코드를 추가합니다.

//다중 열기 처리

char filter[] = "Raw files (*.raw)|*.raw||";

CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, filter);

if(dlg.DoModal() ==IDOK){

for(POSITION pos = dlg.GetStartPosition(); pos !=NULL;)

OpenDocumentFile(dlg.GetNextPathName(pos));

}


}

여기서 CFileDialog에서 TRUE를 인수로 못받아 들인다.


2. raw 파일을 열때 대화상자 문자관련 문제 발생

void CWinTestDoc::Serialize(CArchive& ar)

{

if (ar.IsStoring())

{

// TODO: 여기에 저장 코드를 추가합니다.

ar.Write(m_OutImg,256*256);

}

else

{

// TODO: 여기에 로딩 코드를 추가합니다.

CFile *infile = ar.GetFile();

if(infile->GetLength() != 256*256)

{

AfxMessageBox("파일 크기가 256x256 사이즈가 아닙니다.");

return;

}

ar.Read(m_InImg,infile->GetLength());

}

}


AfxMessageBox에서 표현을 못한단다.


해결

Alt+f7로 들어가서 구성속성->일반->프로젝트 기본값->문자집합을 멀티바이트 문자 집합 사용으로

'Software > Programming' 카테고리의 다른 글

MFC의 흐름  (0) 2012.08.10
도큐먼트 뷰 객체 설명  (0) 2012.08.10
CFileDialog  (0) 2012.08.10
[MFC] OnFileOpen 함수 재정의 해서 사용하기.  (0) 2012.08.09
게시판 프로그램  (0) 2011.10.11
Posted by 십자성군
Software/Programming2012. 8. 9. 16:47

SDI나 MDI 구조의 경우 문서 열기를 재정의 해서 사용해야 할 때가 있다.

이럴때는...

1. XXXXAPP.cpp 파일을 열어서

코드의 가장 위에 있는 메시지를 아래와 같이 다시 정의한다.

  1. BEGIN_MESSAGE_MAP(CCudaTestApp, CWinAppEx)    
  2. ON_COMMAND(ID_APP_ABOUT, &CCudaTestApp::OnAppAbout)   
  3. // 표준 파일을 기초로 하는 문서 명령입니다.    
  4. ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew)        
  5. //기존의 OnFileOpen 임.   
  6. //ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen)    
  7. //OnOpenDocument 함수를 호출할 때, 자신이 만든 함수를 호출하도록      
  8. //ID_FILE_OPEN를 사용자 임의로 재정의 한다.   
  9. ON_COMMAND(ID_FILE_OPEN, &CCudaTestApp::OnFileOpen)           
  10. // 표준 인쇄 설정 명령입니다.    
  11. ON_COMMAND(ID_FILE_PRINT_SETUP, &CWinAppEx::OnFilePrintSetup)     
  12. ON_COMMAND(ID_FILE_OPEN, &CCudaTestApp::OnFileOpen)  
  13. END_MESSAGE_MAP()  


2. 클래스 위자드나 이벤트 재정의에서 다음과 같이 OnFileOpen 함수를 추가해 준다.



3. OnFileOpen함수 내부를 아래와 같이 작성. (원하는 파일 다이얼로그를 만들기 위한 코드를 여기에 작성한다)

  1. void CCudaTestApp::OnFileOpen(){      
  2. // TODO: 여기에 명령 처리기 코드를 추가합니다.    
  3. char filter[] = "Raw files (*.raw)|*.raw||";      
  4. CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, filter);      
  5.    if(dlg.DoModal() == IDOK){         
  6.      for(POSITION pos = dlg.GetStartPosition(); pos !=NULL;)              
  7.           OpenDocumentFile(dlg.GetNextPathName(pos));     
  8.    }  
  9. }  


현재 코드는 여러 파일을 동시에 읽어들일 수 있도록 해놓은 상태이다.

4. 컴파일 후 실행하면 원하는 파일 다이얼로그를 볼 수 있다.

'Software > Programming' 카테고리의 다른 글

MFC의 흐름  (0) 2012.08.10
도큐먼트 뷰 객체 설명  (0) 2012.08.10
CFileDialog  (0) 2012.08.10
MFC에서 유니코드 관련해서 문제가 생겼다.  (1) 2012.08.09
게시판 프로그램  (0) 2011.10.11
Posted by 십자성군

운영체제가 관리하는 최소 단위의 작업

프로세스(Process)는 일반적으로 프로세서(처리기, CPU)에 의해 처리되는 사용자 프로그램, 시스템 프로그램, 즉 실행중인 프로그램을 의미하며, 운영체제가 관리하는 최소 단위의 작업(Job), 태스크(Task)이다.

쉽게 말해서 운영체제가 관리하는 가장 작은 단위의 작업

 프로세스는 다양하게 정의 될 수 있으며 아래와 같다.

- PCB를 가진 프로그램
- 실기억장치에 저장된 프로그램
- 프로세서가 할당되는 실체 
- 프로시저[각주:1]가 활동중인 것 
- 비동기적 행위[각주:2]를 일으키는 주체
- 목적 또는 결과에 따라 발생되는 사건들의 과정


위의 정의에서 PCB는 무엇일까??

PCB(Process Control Block, 프로세스 제어 블록)는 운영체제가 프로세스에 대한 중요한 정보를 저장해 놓는 곳으로, Task Control Block 또는 Job Control Block이라고도 한다.  쉽게 말해서 프로세스 관련 자료가 있는 장소이다.

각 프로세스가 생성될 때마다 고유의 PCB가 생성되고, 프로세스가 완료되면 PCB는 제거된다.
PCB에 있는 정보는 다음과 같다.

 저장 정보설 명 
 프로세스의 현재 상태준비, 대기, 실행 등의 프로세스 상태
포인터
- 부모 프로세스에 대한 포인터 :  부모 프로세스의 주소 기억
- 자식 프로세스에 대한 포인터 : 자식 프로세스의 주소 기억
- 프로세스가 위치한 메모리에 대한 포인터 : 현재 프로세스가 위치한 주소 기억
- 할당된 자원에 대한 포인터 : 프로세스에 할당된 각 자원에 대한 주소 기억   
프로세스 고유 식별자  프로세스를 구분할 수 있는 고유의 번호 
스케줄링 및 프로세스의 우선순위  스케줄링 정보 및 프로세스가 실행될 우선순위     
CPU 레지스터 정보Accumulator, Index Register, 범용 레지스터, PC등에 대한 정보 
 주기억장치 관리 정보

Base Register[각주:3] , Page Table에 대한 정보

 입,출력 상태 정보입,출력장치, 개방된 파일 목록 
 계정 정보CPU 사용 시간, 실제 사용 시간, 한정된 시간 



이젠 프로세스 상태 전이에 대해서 살펴보자.

 프로세스 상태 전이는 프로세스가 시스템 내에 존재하는 동안 프로세스의 상태가 변하는 것을 의미하며, 프로세스의 상태를 다음과 같이 상태 전이도로 표시할 수 있다.  



프로세스 상태

프로세스의 상태는 제출, 접수, 준비, 실행, 대기(보류) 상태로 나눌 수 있으며, 이 중 주요 세 가지 상태는 준비, 실행, 대기 상태이다.
1)제출(Submit): 작업을 처리하기 위해 사용자가 작업을 시스템에 제출한 상태
2)접수(Hold): 제출된 작업이 스풀 공간인 디스크의 할당 위치에 저장된 상태
3)준비(Ready): 프로세스가 프로세서를 할당받기 위해 기다리고 있는 상태
 
       ※ 프로세스는 준비상태 큐[각주:4]에서 실행을 준비하고 있다.
           접수 상태에서 준비 상태로의 전이는 Job 스케줄러에 의해 수행된다.
           준비 리스트에 있는 프로세스는 각각 우선순위가 주어진다.

4)실행(Run): 준비상태 큐에 있는 프로세스가 프로세서를 할당받아 실행되는 상태
      
      ※ 프로세스 수행이 완료되기 전에 프로세스에게 주어진 프로세서 할당 시간[각주:5]이 종료되면 프로세스는 준비 상태로 전이된다. 
          실행중인 프로세스에 입출력 처리가 필요하면 실행중인 프로세스는 대기중인 상태로 전이된다.
          준비 상태에서 실행 상태로의 전이는  CPU스케줄러에 의해 수행된다.

5)대기(Wait), 보류, 블록(Block): 프로세스에 입,출력 처리가 필요하면 현재 실행 중인 프로세스가 중단되고, 입,출력 처리가 완료될 때까지 대기하고 있는 상태

     ※ 대기 리스트에 있는 프로세스는 우선순위가 주어지지 않는다.

6)완료(Complete): 프로세서를 할당받아 주어진 시간 안에 수행을 완료한 상태 


  


이렇게 프로세스의 상태가 제출 단계에서부터 완료 단계까지 진행되어 가는 과정을 알아보았다.

-------------------------------------------------------------------------------------------------------------
참고로 실행 중지(Suspend)에 관하여 잠시 설명해보면 다음과 같다.
- 하나의 프로세스가 입,출력 이외의 다른 이유에 의해 실행되지 못하는 상태
- 실행 중지된 프로세스는 다른 프로세스도 다시 시작하기 전까지는 실행될 수 없다.
- 프로세스의 실행 중지 요인:
 1) 시스템에 이상이 있거나 부하가 많을 경우 운영체제의 필요에 의해 중지시킨다.
 2) 프로세스의 이상 유무를 확인하기 위해 해당 프로세스를 완전히 종료시키지 않고 중지시킨다. 

------------------------------------------------------------------------------------------------------------ 

 다음으로 프로세스 상태 전이 관련 용어에 대하여 설명해 보겠다.

※  Dispatch: 준비 상태에서 대기하고 있는 프로세스 중 하나가 프로세서를 할당받아 실행 상태로 전이되는 과정을 말한다.
     Wake Up: 입,출력 작업이 완료되어 프로세스가 대기 상태에서 준비 상태로 전이되는 과정
     Traffic Controller(교통량 제어기): 프로세스의 상태에 대한 조사와 통보 담당 


지금까지 프로세스에 대해서 설명해 보았고 이제는 스레드(Thread)에 대해서 설명해본다

스레드(Thread)는 프로세스 내에서의 작업 단위로서 시스템의 여러 자원을 할당받아 실행하는 프로그램의 단위이다.
  



어떤 자료들을 보기 전에 하나의 운영체제엔 여러가지 프로그램이 존재할것이다. 프로그램은 단일 프로세스로 존재할 수도 있고 여러개의 프로세스로 존재 할 수도 있다. 그리고 그 프로세스 내에는 여러개의 스레드가 존재할 수도 있다.

운영체제 - 프로세스 - 스레드 이렇게 상위 개념과 하위 개념으로 이해할 수 있는데, 위로 올라갈 수록 보안 장벽이 높다. 그래서 특정 기술들을 사용해야 서로간의 접근이 허용된다.  

다시 스레드로 넘어가보면 스레드를 아래와 같이 설명할 수 있다.

1) 하나의 프로세스에 하나의 스레드가 존재하는 경우에는 단일 스레드, 하나 이상의 스레드가 존재하는 경우에는 다중 스레드라고 해.  
2) 프로세스의 일부 특성을 갖고 있기 때문에 경량(Light Weight) 프로세스라고도 한다.
3) 자신만의 스택(Stack)과 레지스터(Register)를 갖으며 독립된 제어 흐름을 갖는다.
4) 스레드의 분류

 사용자 수준의 스레드
사용자가 만든 라이브러리를 사용하여 스레드를 운용한다.
속도는 빠르지만 구현이 어렵다. 
 커널 수준의 스레드
운영체제의 커널에 의해 스레드를 운용한다.
구현이 쉽지만 속도가 느리다. 

5) 스레드 사용의 장점
 
 - 하나의 프로세스를 여러 개의 스레드로 생성하여 병행성을 증진시킬 수 있다.
 - 하드웨어, 운영체제의 성능과 응용 프로그램의 처리율을 향상시킬 수 있다.
 - 응용 프로그램의 응답 시간(Response Time)을 단축시킬 수 있다.
 - 실행 환경을 공유시켜 기억장소의 낭비가 줄어든다.
 - 프로세스들 간의 통신이 향상된다. 

  1. 프로시저:한 프로그램은 여러 개의 작은 프로그램으로때 분활된 작은 프로그램을 의미하며, 부프로그램이라고도 한다. [본문으로]
  2. 다수의 프로세스가 서로 규칙적이거나 연속적이지 ㅇ낳고 독립적으로 실행되는 것. [본문으로]
  3. 기준레지스터 : 주기억장치가 분할된 영역으로 나뉘어 관리될 때, 프로그램이 한 영역에서 다른 영역으로 옮겨지더라도 명령의 주소 부분을 바꾸지 않고 정상적으로 수행될 수 있도록 하기 위한 레지스터 [본문으로]
  4. 스케줄링 큐 : 여러 프로세스가 프로세서를 할당받기 위해 기다리는 장소 [본문으로]
  5. Timer Run Out [본문으로]

'중도연재종료 > 임베디드' 카테고리의 다른 글

[용어] 운영체제(추가)  (0) 2012.07.01
[용어] 운영체제  (0) 2012.07.01
[용어] Firmware, RTOS, Non-RTOS  (0) 2012.07.01
[용어] 실시간 시스템  (0) 2012.07.01
MPU와 MCU  (0) 2012.07.01
Posted by 십자성군

출처:http://wingsofgod.tistory.com

운영체제는 작업 수행방식에 따라 일괄 처리 시스템, 다중 프로그래밍 시스템, 다중 처리 시스템, 다중 시분할 시스템, 실시간 처리 시스템, 분산 처리 시스템 등으로 나눌 수 있다.

1. 일괄 처리 시스템(Batch Processing System)

.일괄적으로 처리하는 시스템
.초기의 컴퓨터 시스템에서 사용된 형태

-일정량 또는 일정 기간 동안 데이터를 모아서 한꺼번에 처리하는 방식

.이러한 일괄 처리를 위해서는 적절한 작업 제어 언어를 제공할 필요가 있다.
.컴퓨터 시스템을 효율적으로 사용할 수 있다.
.한꺼번에 많은 양을 처리한다->반환시간(Turn Around TIme)이 늦다.

.하나의 작업이 모든 자원을 독점한다.->CPU 유휴 시간이 줄어든다. (CPU가 동작하지 않고 쉬는 시간)
-급여계산, 지불 계산, 연말 결산 등의 업무등에 사용.

2. 다중 프로그래밍 시스템(Multi-Programming System)

-하나의 CPU와 주기억장치를 이용하여 여러 개의 프로그램을 동시에 처리하는 방식
.CPU + 주기억장치 를 이용
.하나의 주기억장치에 두 개 이상의 프로그램을 기억시켜 놓고, 하나의 CPU와 대화하면서 동시에 처리하는 방식
->CPU의 사용률과 처리량이 증가

3. 시분할 시스템(Time Sharing System)

.여러 명의 사용자가 사용하는 (하나의)시스템에서---

.컴퓨터가 사용자들의 프로그램을 번갈아가며 처리한다->각 사용자에게 독립된 컴퓨터를 사용하는 느낌을 준다 


.라운드 로빈(Round Robin)방식이라고도 한다

.여러 사용자가 각자의 단말장치를 통하여 동시에 운영체제와 대화하면서 각자의 프로그램을 실행
.하나의 CPU는 같은 시점에서 여러 개의 작업을 동시에 수행할 수 없기 때문에

->CPU의 전체 사용 시간을 작은 작업 시간량(Time Slice)으로 나누어

->그 시간량 동안만 번갈아가면서 CPU를 할당하여 각 작업을 처리하는 원리
만약 이러한 시스템에 다중 프로그래밍 방식이 결합된다면 모든 작업이 동시에 진행되는 것처럼 대화식 처리가 가능하겠지??
.시스템의 전체 효율은 좋아지겠으나 개인별 사용자 입장에서는 반응 속도 느려질 수 있다.(응답 시간이 길어진다)

4. 다중 처리 시스템(Multi-Processing System) 

여러개의 CPU와 하나의 주기억장치를 이용하여 여러 프로그램을 동시에 처리하는 방식
.하나의 CPU가 고장나더라도 다른 CPU를 이용하여 업무처리가 가능

->그래서 시스템의 신뢰성과 안전성이 높아.
.여러 CPU는 하나의 메모리를 공유하며 단일 운영체제에 의해 관리
->프로그램의 처리 속도가 빠르다기억장치, 입출력장치 등의 자원 공유에 대한 문제점을 고려해야함


5. 실시간 처리 시스템(Real Time Processing System)

데이터 발생 즉시, 또는 데이터 처리 요구가 있는 즉시 처리하여 결과를 산출하는 방식
.처리 시간이 단축되고, 처리 비용이 절감
.우주선 운행이나, 레이저 추적기, 핵물리학 실험 및 데이터 수집, 전화교환장치의 제어, 은행의 온라인 업무 등 시간에 제한을 두고 수행되어야 하는 작업에 사용된다.


6. 다중 모드 처리(Multi-Mode Processing)

일괄 처리 시스템, 시분할 시스템, 다중 처리 시스템, 실시간 처리 시스템을 한 시스템에서 모두 제공하는 방식

7. 분산 처리 시스템(Distributed Processing System)

여러 개의 컴퓨터(프로세서)를 통신 회선으로 연결하여 하나의 작업을 처리하는 방식
->단말장치나 각 컴퓨터 시스템은 고유의 운영체제와 CPU, 메모리를 가지고 있다. 시분할 시스템과 대비


'중도연재종료 > 임베디드' 카테고리의 다른 글

프로세스의 개요+스레드  (0) 2012.07.01
[용어] 운영체제  (0) 2012.07.01
[용어] Firmware, RTOS, Non-RTOS  (0) 2012.07.01
[용어] 실시간 시스템  (0) 2012.07.01
MPU와 MCU  (0) 2012.07.01
Posted by 십자성군