728x90
자료출처 : http://blog.naver.com/ansysda

동일한 프로그램을 한번만 실행할 수 있도록 합니다.

static void Main()
{
   System.Diagnostics.Process[] myProc = System.Diagnostics.Process.GetProcessesByName("WindowsApplication10");  
   // 여기서 Mulpumi는 프로젝트 속성의 프로젝트 이름
           
   if(myProc.Length < 2)
   {
       Application.Run(new Form1());        
   }
   else
   {
       MessageBox.Show("이미 실행중입니다.");
       Application.Exit();      
   }
}

또 다른 방법

프로세스간 동기화 개체인Mutex 클래스를 이용하면 현재의 프로세스가 최초 실행된 프로세스인지를 판별할 수 있습니다. Mutex 객체를 생성시 초기 소유권을 부여 하도록 하며 3번째 아웃풋 파라미터의 값으로 소유권이 부여되었는지를 판단합니다. 메인 메서드에 대한 소스는 아래와 같습니다.

/// <summary>

/// 해당 응용 프로그램의 주 진입점입니다.

/// </summary>

[STAThread]

static void Main()

{

      bool createdNew;

      Mutex mutex = new Mutex(true, Application.ProductName, out createdNew);

      if (createdNew)

      {

              Application.Run( new Form1());

      }

}

프로그램을 실행할 때 이미 실행되어 있는 프로그램이면 활성화를 시켜주어야 할 때가 있습니다. 해당 프로세스의 윈도우를 활성화시켜주는 방법이 닷넷 프레임워크에는 존재하지 않습니다. Win32 API 함수를 플랫폼 호출하여야 합니다. 아래의 소스처럼 inner class로 만듭니다.

internal class NativeMethods

{

      /// <summary>

      /// The SetForegroundWindow function puts the thread that created the specified window

      /// into the foreground and activates the window. Keyboard input is directed to the window,

      /// and various visual cues are changed for the user. The system assigns a slightly higher

      /// priority to the thread that created the foreground window than it does to other threads.

      /// </summary>

      [DllImport("user32.dll")]

      internal static extern

              bool SetForegroundWindow(IntPtr hWnd);

      /// <summary>

      /// The ShowWindowAsync function sets the show state of a window created by a different thread.

      /// </summary>

      [DllImport("user32.dll")]

      internal static extern

              bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);

      /// <summary>

      /// The IsIconic function determines whether the specified window is minimized (iconic).

      /// </summary>

      [DllImport("user32.dll")]

      internal static extern

              bool IsIconic(IntPtr hWnd);

      // Activates and displays the window. If the window is minimized or maximized, the system

      // restores it to its original size and position. An application should specify this flag

      // when restoring a minimized window.

      internal static int SW_RESTORE = 9;

}

메인 메서드를 아래와 같이 수정합니다. 두 번째 인스턴스가 실행되는 시점에서 해당 프로그램 명에 대한 프로세스는 2개가 있으며, 그 중 현재의 프로세스 아이디와 같지 않은 프로세스가 최초 실행된 프로세스입니다. 그 프로세스가 아이콘화(최소화) 되어 있는지를 검사(IsIconic 메서드)해서 아이콘화 되어 있으면 비동기로 해당 윈도우를 활성화(ShowWindowAsync 메서드)시켜야 합니다. 그리고 z order의 맨 앞으로 보내도록(SetForegroundWindow 메서드) 합니다.

/// <summary>

/// 해당 응용 프로그램의 주 진입점입니다.

/// </summary>

[STAThread]

static void Main()

{

      bool createdNew;

      Mutex mutex = new Mutex(true, Application.ProductName, out createdNew);

      if (createdNew)

      {

              Application.Run( new Form1());

      }

      else

      {

              Process[] viewProcesses =

                      Process.GetProcessesByName(Application.ProductName);

              if (viewProcesses != null && viewProcesses.Length == 2)

              {

                      Process view = viewProcesses[0].Id == Process.GetCurrentProcess().Id ?

                            viewProcesses[1] : viewProcesses[0];

                      IntPtr hWnd = view.MainWindowHandle;

                      if (NativeMethods.IsIconic(hWnd))

                      {

                            NativeMethods.ShowWindowAsync(hWnd, NativeMethods.SW_RESTORE);

                      }

                      NativeMethods.SetForegroundWindow(hWnd);

              }

      }

}

이상으로 Mutex 클래스와 Process 클래스, 그리고 몇몇 API 함수를 이용해서 하나의 인스턴스만 실행되도록 하고 두 번째 실행 시에는 해당 프로그램이 활성화되도록 하는 방법을 살펴보았습니다.

- taihikim


728x90

파일 읽기는 자주 사용하실 것인데..
CFile::Read를 사용하여도 되지만 속도 문제때문에
메모리 맵 파일을 이용한 파일 읽기 방법을 올려 들립니다..
 
  1. BOOL OpenFiles(LPCSTR lpszPathName)   
  2. {   
  3. DWORD dwFileSize;   
  4. HANDLE hFile, hFileMap;   
  5. LPVOID lpvFile;   
  6.   
  7. hFile = ::CreateFile(lpszPathName, GENERIC_READ , 0, NULL   
  8. OPEN_EXISTING, FILE_ATTRIBUTTE_NORMAL, NULL);   
  9. if(hFile == INVALID_HANDLE_VALUE) {   
  10. //여기에서 에러 메세지 처리..   
  11. }   
  12. dwFileSize = ::GetFileSize(hFile, NULL);   
  13.   
  14. hFileMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0,   
  15. dwFileSize, NULL);   
  16.   
  17. if(hFileMap == NULL) {   
  18. CloseHandle(hFile);   
  19. //여기에서 에러 메세지 처리..   
  20. }   
  21.   
  22. lpFile = MapViewOfFile(hFileMap, FILE_MAP_COPY, 0,0,0);   
  23.   
  24. if(lpFile == NULL) {   
  25. CloseHandle(hFile);   
  26. CloseHandle(hFileMap);   
  27. //여기에서 에러 처리   
  28. }   
  29. }   


이렇게 하면.. 대용량의 파일을 빠르게 읽을 수 있습니다..


위의 예제는 메모리 맵파일을 이용한건데 좀 복잡해 보이나요 ??
이번에는 메모리 맵파일을 이용한 방법외에 간단한 방법이 있어서 올려봅니다.

그냥 도스용 시절에 사용했던 fread함수를 사용한 것입니다.
물론 fread대신 다른 파일 읽기 함수를 사용해도 됩니다.

 
  1. char *ReadFile( char *FileName )   
  2. {   
  3. FILE *fp;   
  4. int FileSize;   
  5. char *buffer;   
  6.   
  7. try {   
  8. fp = fopen( FileName, "rb" );   
  9. if( !fp ) throw "File Not Found!";   
  10.   
  11. FileSize = filelength( fileno(fp) );   
  12. buffer = new char [FileSize+1];   
  13. fread( buffer, FileSize, 1, fp );   
  14. *(buffer + FileSize) = 0;   
  15. fclose( fp );   
  16. return buffer;    
  17. }   
  18. catchchar *msg ) {   
  19. printf( msg );   
  20. return NULL;   
  21. }   
  22. }   

    출처 : http://webdizen.new21.net
728x90

클래스 참조하여 사용을 할때 클래스에 대한 설명이 다음과 같이 나온다.

 

위와 같이 필요한 설명은

클래스의 메서드 부분에 주석 처리를 하면 된다.

 

summary 주석 처리는 슬래시(/) 키를 세번 누르면 자동으로 생긴다.

 

/// <summary>
///
/// </summary>
/// <param name="e"></param>

 

■ 예제

 Class1.cs

     /// <summary>
    /// 주어진 스트링을 주어진 길이만큼만 잘라서 돌려줌.
    /// </summary>
    /// <param name="strCut">잘라낼 원본 문자열</param>
    /// <param name="intChar">제한할 글자 수</param>
    /// <returns>제한된 문자열</returns>
    public static string CutString(string strCut, int intChar)
    {
        if (strCut.Length > intChar - 3)
        {
            string strTemp = "";
            strTemp = strCut.Substring(0, intChar - 3);
            strTemp += "...";

            return strTemp;
        }
        else
        {
            return strCut;
        }
    }

 

 

■ 메서드 요약설명

      /// <summary>
    /// 주어진 스트링을 주어진 길이만큼만 잘라서 돌려줌.
    /// </summary>
 

 

■ 첫번째 인자값 설명

 /// <param name="strCut">잘라낼 원본 문자열</param>
 

 

■ 두번째 인자값 설명

 /// <param name="intChar">제한할 글자 수</param>
 

 

[ XML 주석 레퍼런스]

<summary>

데이터 형식이나 멤버에 대한 짤막한 요약을 제공한다.

<param>

메소드 인수를 표시한다.

<returns>

메소드의 반환값을 설명한다.

<example>

설명하고 있는 항목에 대한 코드 예제를 나타냄

<code>

여러줄을 코드로 표시하는데 사용

<remarks>

클래스나 다른 형식에 대한 개요를 지정할 있는 태그입니다

<exception>

함수내에서 발생할 있는 에러정보를 나타냄


출처 : http://blog.naver.com/whwlfnsl/70025332256

+ Recent posts