На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Два потока
    Подскажите как правильно прикрутить к уроку от Nehe второй поток (нужен для опроса ком порта)
    Делал так:
    Прописал main с двумя потоками
    ExpandedWrap disabled
      void main()
      {
          DWORD ThreadId1, ThreadId2; //создаём идентификаторы потока
          HANDLE hThread1 = CreateThread(NULL, 0, func1, 0, 0, &ThreadId1);//создаём потоки
          HANDLE hThread2 = CreateThread(NULL, 0, func2, 0, 0, &ThreadId2);
       
          MSG     msg;                                    
          BOOL    done=FALSE;
       
          while(!done)
          {
              if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
              {
                  if (msg.message==WM_QUIT)
                  {
                      done=TRUE;
                      CloseHandle(hThread1); CloseHandle(hThread2);
                  }
                  else
                  {
                      TranslateMessage(&msg);
                      DispatchMessage(&msg);
                  }
              }
              else
              {
                  if ((active && !DrawGLScene()) || keys[VK_ESCAPE])
                  {
                      done=TRUE;
                      CloseHandle(hThread1); CloseHandle(hThread2); //Закрываем HANDLE
                  }
              }
          }
      }

    Дальше запускаем первый поток, окно графики

    ExpandedWrap disabled
      DWORD WINAPI func1(void* Param)        
      {
          MSG     msg;                                    
          BOOL    done=FALSE;
       
      ... внутренности все от урока ....
      }


    Запускаем второй поток, com порт
    ExpandedWrap disabled
      DWORD WINAPI func2(void* Param)
      {
          while (true)
          {
              COM_PORT_R();
              Sleep(20);
          }
          return 0;
      }


    Проблема: В Visual Studio все компилируется и запускается на отлично... Но если без студии запустить exe, то окно графики просто виснет. Что я не так делаю с вызовом графики, и как правильно его реализовать?

    Эта тема была разделена из темы "вывод текста в OpenGL"
      Возможно, поможет до while'а провести все инициализации и создания GL-окон.
        Отладчик ругается на строку

        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

        Необработанное исключение в "0x698b5b2b" в "Гроза.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000008".

        Хотя, еще раз повторюсь, в Visual Studio он запускает проект без проблем.
          Цитата Seregagad @
          glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);Необработанное исключение в "0x698b5b2b" в "Гроза.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000008".

          Смотри предыдущие вызовы функций. Возможно они портят стек программы.
            Если в
            ExpandedWrap disabled
              int DrawGLScene( GLvoid )
              {
                      glMatrixMode(GL_PROJECTION);
                  glLoadIdentity();
                  glOrtho(0.0f, 1024.0f, 0.0f, 768.0f, -1.0f, 1.0f);
                  glTranslatef(0.0f,0.0f, -1.0f);
                  glColor3f(1, 0, 0);
                  glBegin (GL_LINES);
                       glVertex2f (1024-70, 764-6);              
                       glVertex2f (1024-70-95, 764-6);
                  glEnd();
              }


            отрисовать только линию, при этом закрыв всю графику, то программа не рушиться...

            если попытаться вывести строчку текста, то сразу же происходит падение

            Как в

            HANDLE hThread1 = CreateThread(NULL, 0, func1, 0, 0, &ThreadId1);

            можно поднять объем выделенной памяти? Может из-за нее идет падение.

            :-? Просто с потоками столкнулся впервые, вот и туплю уже столько времени
              Цитата Seregagad @
              при этом закрыв всю графику

              Что это у тебя значит?
                Если закомментировать

                Пример

                ExpandedWrap disabled
                  int DrawGLScene( GLvoid )
                  {
                          glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
                      glMatrixMode(GL_PROJECTION);
                      glLoadIdentity();
                      glOrtho(0.0f, 1024.0f, 0.0f, 768.0f, -1.0f, 1.0f);
                      glTranslatef(0.0f,0.0f, -1.0f);
                      glColor3f(1, 0, 0);
                      glBegin (GL_LINES);
                           glVertex2f (1024-70, 764-6);              
                           glVertex2f (1024-70-95, 764-6);
                      glEnd();
                      return true;
                  }


                Так exe файл запускается без проблем...

                А вот если...
                ExpandedWrap disabled
                  int DrawGLScene( GLvoid )
                  {
                          glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
                      glMatrixMode(GL_PROJECTION);
                      glLoadIdentity();
                      glOrtho(0.0f, 1024.0f, 0.0f, 768.0f, -1.0f, 1.0f);
                      glTranslatef(0.0f,0.0f, -1.0f);
                      glColor3f(1, 0, 0);
                      glRasterPos2f(5, 5);
                      glPrint("Тест");
                      return true;
                  }

                То программа запускается в Visual Studio, а при простом запуске exe, выбивает ршибку
                  Еще такой вопрос. DrawGLScene() у тебя вызывается в цикле обработки сообщений (т.е. в основном потоке). Тогда что у тебя вызывается в первом дочернем потоке func1, (т.е. что у тебя скрывется под фразой "... внутренности все от урока .... "), случайно не снова DrawGLScene()?

                  Цитата Seregagad @
                  Как в

                  HANDLE hThread1 = CreateThread(NULL, 0, func1, 0, 0, &ThreadId1);

                  можно поднять объем выделенной памяти? Может из-за нее идет падение.

                  Второй параметр задает размер стека. А если предпоследним параметром передаш STACK_SIZE_PARAM_IS_A_RESERVATION, то второй параметр будет игнорироваться, и размер стека будет браться из значения основной программы, установленный компановщиком.
                  Вобщем когда будешь экспериментировать поробуй вместо слова вывести одну букву :D
                    Вот урок №13 от Nehe

                    Кто может правильно запустить второй поток, чтобы к примеру он во втором потоке отображал printf("test"), а в первом оставалась все та же графика от урока
                    Прикреплённый файлПрикреплённый файлlesson13.zip (27,27 Кбайт, скачиваний: 122)
                      Уж лучше свой проект выложи, если возможно.
                        Мой сильно большой код...

                        Вот так выглядит мой неправильный вариант, который с ошибкой

                        ExpandedWrap disabled
                          /*
                           *      This Code Was Created By Jeff Molofee 2000
                           *      Modified by Shawn T. to handle (%3.2f, num) parameters.
                           *      A HUGE Thanks To Fredric Echols For Cleaning Up
                           *      And Optimizing The Base Code, Making It More Flexible!
                           *      If You've Found This Code Useful, Please Let Me Know.
                           *      Visit My Site At nehe.gamedev.net
                           */
                           
                          #include <windows.h>        // Header File For Windows
                          #include <math.h>           // Header File For Windows Math Library
                          #include <stdio.h>          // Header File For Standard Input/Output
                          #include <stdarg.h>         // Header File For Variable Argument Routines
                          #include <gl\gl.h>          // Header File For The OpenGL32 Library
                          #include <gl\glu.h>         // Header File For The GLu32 Library
                          #include <gl\glaux.h>       // Header File For The Glaux Library
                           
                          HDC         hDC=NULL;       // Private GDI Device Context
                          HGLRC       hRC=NULL;       // Permanent Rendering Context
                          HWND        hWnd=NULL;      // Holds Our Window Handle
                          HINSTANCE   hInstance;      // Holds The Instance Of The Application
                           
                          GLuint  base;               // Base Display List For The Font Set
                          GLfloat cnt1;               // 1st Counter Used To Move Text & For Coloring
                          GLfloat cnt2;               // 2nd Counter Used To Move Text & For Coloring
                           
                          bool    keys[256];          // Array Used For The Keyboard Routine
                          bool    active=TRUE;        // Window Active Flag Set To TRUE By Default
                          bool    fullscreen=TRUE;    // Fullscreen Flag Set To Fullscreen Mode By Default
                           
                          LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);   // Declaration For WndProc
                           
                          GLvoid BuildFont(GLvoid)                                // Build Our Bitmap Font
                          {
                              HFONT   font;                                       // Windows Font ID
                              HFONT   oldfont;                                    // Used For Good House Keeping
                           
                              base = glGenLists(96);                              // Storage For 96 Characters
                           
                              font = CreateFont(  -24,                            // Height Of Font
                                                  0,                              // Width Of Font
                                                  0,                              // Angle Of Escapement
                                                  0,                              // Orientation Angle
                                                  FW_BOLD,                        // Font Weight
                                                  FALSE,                          // Italic
                                                  FALSE,                          // Underline
                                                  FALSE,                          // Strikeout
                                                  ANSI_CHARSET,                   // Character Set Identifier
                                                  OUT_TT_PRECIS,                  // Output Precision
                                                  CLIP_DEFAULT_PRECIS,            // Clipping Precision
                                                  ANTIALIASED_QUALITY,            // Output Quality
                                                  FF_DONTCARE|DEFAULT_PITCH,      // Family And Pitch
                                                  "Courier New");                 // Font Name
                           
                              oldfont = (HFONT)SelectObject(hDC, font);           // Selects The Font We Want
                              wglUseFontBitmaps(hDC, 32, 96, base);               // Builds 96 Characters Starting At Character 32
                              SelectObject(hDC, oldfont);                         // Selects The Font We Want
                              DeleteObject(font);                                 // Delete The Font
                          }
                           
                          GLvoid KillFont(GLvoid)                                 // Delete The Font List
                          {
                              glDeleteLists(base, 96);                            // Delete All 96 Characters
                          }
                           
                          GLvoid glPrint(const char *fmt, ...)                    // Custom GL "Print" Routine
                          {
                              char        text[256];                              // Holds Our String
                              va_list     ap;                                     // Pointer To List Of Arguments
                           
                              if (fmt == NULL)                                    // If There's No Text
                                  return;                                         // Do Nothing
                           
                              va_start(ap, fmt);                                  // Parses The String For Variables
                                  vsprintf(text, fmt, ap);                        // And Converts Symbols To Actual Numbers
                              va_end(ap);                                         // Results Are Stored In Text
                           
                              glPushAttrib(GL_LIST_BIT);                          // Pushes The Display List Bits
                              glListBase(base - 32);                              // Sets The Base Character to 32
                              glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);  // Draws The Display List Text
                              glPopAttrib();                                      // Pops The Display List Bits
                          }
                           
                          GLvoid ReSizeGLScene(GLsizei width, GLsizei height)     // Resize And Initialize The GL Window
                          {
                              if (height==0)                                      // Prevent A Divide By Zero By
                              {
                                  height=1;                                       // Making Height Equal One
                              }
                           
                              glViewport(0,0,width,height);                       // Reset The Current Viewport
                           
                              glMatrixMode(GL_PROJECTION);                        // Select The Projection Matrix
                              glLoadIdentity();                                   // Reset The Projection Matrix
                           
                              // Calculate The Aspect Ratio Of The Window
                              gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
                           
                              glMatrixMode(GL_MODELVIEW);                         // Select The Modelview Matrix
                              glLoadIdentity();                                   // Reset The Modelview Matrix
                          }
                           
                          int InitGL(GLvoid)                                      // All Setup For OpenGL Goes Here
                          {
                              glShadeModel(GL_SMOOTH);                            // Enable Smooth Shading
                              glClearColor(0.0f, 0.0f, 0.0f, 0.5f);               // Black Background
                              glClearDepth(1.0f);                                 // Depth Buffer Setup
                              glEnable(GL_DEPTH_TEST);                            // Enables Depth Testing
                              glDepthFunc(GL_LEQUAL);                             // The Type Of Depth Testing To Do
                              glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // Really Nice Perspective Calculations
                           
                              BuildFont();                                        // Build The Font
                           
                              return TRUE;                                        // Initialization Went OK
                          }
                           
                          int DrawGLScene(GLvoid)                                 // Here's Where We Do All The Drawing
                          {
                              glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
                              glLoadIdentity();                                   // Reset The Current Modelview Matrix
                              glTranslatef(0.0f,0.0f,-1.0f);                      // Move One Unit Into The Screen
                              // Pulsing Colors Based On Text Position
                              glColor3f(1.0f*float(cos(cnt1)),1.0f*float(sin(cnt2)),1.0f-0.5f*float(cos(cnt1+cnt2)));
                              // Position The Text On The Screen
                              glRasterPos2f(-0.45f+0.05f*float(cos(cnt1)), 0.32f*float(sin(cnt2)));
                              glPrint("Active OpenGL Text With NeHe - %7.2f", cnt1);  // Print GL Text To The Screen
                              cnt1+=0.051f;                                       // Increase The First Counter
                              cnt2+=0.005f;                                       // Increase The First Counter
                              return TRUE;                                        // Everything Went OK
                          }
                           
                          GLvoid KillGLWindow(GLvoid)                             // Properly Kill The Window
                          {
                              if (fullscreen)                                     // Are We In Fullscreen Mode?
                              {
                                  ChangeDisplaySettings(NULL,0);                  // If So Switch Back To The Desktop
                                  ShowCursor(TRUE);                               // Show Mouse Pointer
                              }
                           
                              if (hRC)                                            // Do We Have A Rendering Context?
                              {
                                  if (!wglMakeCurrent(NULL,NULL))                 // Are We Able To Release The DC And RC Contexts?
                                  {
                                      MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                                  }
                           
                                  if (!wglDeleteContext(hRC))                     // Are We Able To Delete The RC?
                                  {
                                      MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                                  }
                                  hRC=NULL;                                       // Set RC To NULL
                              }
                           
                              if (hDC && !ReleaseDC(hWnd,hDC))                    // Are We Able To Release The DC
                              {
                                  MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                                  hDC=NULL;                                       // Set DC To NULL
                              }
                           
                              if (hWnd && !DestroyWindow(hWnd))                   // Are We Able To Destroy The Window?
                              {
                                  MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                                  hWnd=NULL;                                      // Set hWnd To NULL
                              }
                           
                              if (!UnregisterClass("OpenGL",hInstance))           // Are We Able To Unregister Class
                              {
                                  MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                                  hInstance=NULL;                                 // Set hInstance To NULL
                              }
                           
                              KillFont();
                          }
                           
                          /*  This Code Creates Our OpenGL Window.  Parameters Are:                   *
                           *  title           - Title To Appear At The Top Of The Window              *
                           *  width           - Width Of The GL Window Or Fullscreen Mode             *
                           *  height          - Height Of The GL Window Or Fullscreen Mode            *
                           *  bits            - Number Of Bits To Use For Color (8/16/24/32)          *
                           *  fullscreenflag  - Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE)   */
                           
                          BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
                          {
                              GLuint      PixelFormat;            // Holds The Results After Searching For A Match
                              WNDCLASS    wc;                     // Windows Class Structure
                              DWORD       dwExStyle;              // Window Extended Style
                              DWORD       dwStyle;                // Window Style
                              RECT        WindowRect;             // Grabs Rectangle Upper Left / Lower Right Values
                              WindowRect.left=(long)0;            // Set Left Value To 0
                              WindowRect.right=(long)width;       // Set Right Value To Requested Width
                              WindowRect.top=(long)0;             // Set Top Value To 0
                              WindowRect.bottom=(long)height;     // Set Bottom Value To Requested Height
                           
                              fullscreen=fullscreenflag;          // Set The Global Fullscreen Flag
                           
                              hInstance           = GetModuleHandle(NULL);                // Grab An Instance For Our Window
                              wc.style            = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;   // Redraw On Size, And Own DC For Window.
                              wc.lpfnWndProc      = (WNDPROC) WndProc;                    // WndProc Handles Messages
                              wc.cbClsExtra       = 0;                                    // No Extra Window Data
                              wc.cbWndExtra       = 0;                                    // No Extra Window Data
                              wc.hInstance        = hInstance;                            // Set The Instance
                              wc.hIcon            = LoadIcon(NULL, IDI_WINLOGO);          // Load The Default Icon
                              wc.hCursor          = LoadCursor(NULL, IDC_ARROW);          // Load The Arrow Pointer
                              wc.hbrBackground    = NULL;                                 // No Background Required For GL
                              wc.lpszMenuName     = NULL;                                 // We Don't Want A Menu
                              wc.lpszClassName    = "OpenGL";                             // Set The Class Name
                           
                              if (!RegisterClass(&wc))                                    // Attempt To Register The Window Class
                              {
                                  MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                  return FALSE;                                           // Return FALSE
                              }
                              
                              if (fullscreen)                                             // Attempt Fullscreen Mode?
                              {
                                  DEVMODE dmScreenSettings;                               // Device Mode
                                  memset(&dmScreenSettings,0,sizeof(dmScreenSettings));   // Makes Sure Memory's Cleared
                                  dmScreenSettings.dmSize=sizeof(dmScreenSettings);       // Size Of The Devmode Structure
                                  dmScreenSettings.dmPelsWidth    = width;                // Selected Screen Width
                                  dmScreenSettings.dmPelsHeight   = height;               // Selected Screen Height
                                  dmScreenSettings.dmBitsPerPel   = bits;                 // Selected Bits Per Pixel
                                  dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
                           
                                  // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
                                  if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
                                  {
                                      // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
                                      if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
                                      {
                                          fullscreen=FALSE;       // Windowed Mode Selected.  Fullscreen = FALSE
                                      }
                                      else
                                      {
                                          // Pop Up A Message Box Letting User Know The Program Is Closing.
                                          MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
                                          return FALSE;                                   // Return FALSE
                                      }
                                  }
                              }
                           
                              if (fullscreen)                                             // Are We Still In Fullscreen Mode?
                              {
                                  dwExStyle=WS_EX_APPWINDOW;                              // Window Extended Style
                                  dwStyle=WS_POPUP;                                       // Windows Style
                                  ShowCursor(FALSE);                                      // Hide Mouse Pointer
                              }
                              else
                              {
                                  dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;           // Window Extended Style
                                  dwStyle=WS_OVERLAPPEDWINDOW;                            // Windows Style
                              }
                           
                              AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);     // Adjust Window To True Requested Size
                           
                              // Create The Window
                              if (!(hWnd=CreateWindowEx(  dwExStyle,                          // Extended Style For The Window
                                                          "OpenGL",                           // Class Name
                                                          title,                              // Window Title
                                                          dwStyle |                           // Defined Window Style
                                                          WS_CLIPSIBLINGS |                   // Required Window Style
                                                          WS_CLIPCHILDREN,                    // Required Window Style
                                                          0, 0,                               // Window Position
                                                          WindowRect.right-WindowRect.left,   // Calculate Window Width
                                                          WindowRect.bottom-WindowRect.top,   // Calculate Window Height
                                                          NULL,                               // No Parent Window
                                                          NULL,                               // No Menu
                                                          hInstance,                          // Instance
                                                          NULL)))                             // Dont Pass Anything To WM_CREATE
                              {
                                  KillGLWindow();                             // Reset The Display
                                  MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                  return FALSE;                               // Return FALSE
                              }
                           
                              static  PIXELFORMATDESCRIPTOR pfd=              // pfd Tells Windows How We Want Things To Be
                              {
                                  sizeof(PIXELFORMATDESCRIPTOR),              // Size Of This Pixel Format Descriptor
                                  1,                                          // Version Number
                                  PFD_DRAW_TO_WINDOW |                        // Format Must Support Window
                                  PFD_SUPPORT_OPENGL |                        // Format Must Support OpenGL
                                  PFD_DOUBLEBUFFER,                           // Must Support Double Buffering
                                  PFD_TYPE_RGBA,                              // Request An RGBA Format
                                  bits,                                       // Select Our Color Depth
                                  0, 0, 0, 0, 0, 0,                           // Color Bits Ignored
                                  0,                                          // No Alpha Buffer
                                  0,                                          // Shift Bit Ignored
                                  0,                                          // No Accumulation Buffer
                                  0, 0, 0, 0,                                 // Accumulation Bits Ignored
                                  16,                                         // 16Bit Z-Buffer (Depth Buffer)  
                                  0,                                          // No Stencil Buffer
                                  0,                                          // No Auxiliary Buffer
                                  PFD_MAIN_PLANE,                             // Main Drawing Layer
                                  0,                                          // Reserved
                                  0, 0, 0                                     // Layer Masks Ignored
                              };
                              
                              if (!(hDC=GetDC(hWnd)))                         // Did We Get A Device Context?
                              {
                                  KillGLWindow();                             // Reset The Display
                                  MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                  return FALSE;                               // Return FALSE
                              }
                           
                              if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Did Windows Find A Matching Pixel Format?
                              {
                                  KillGLWindow();                             // Reset The Display
                                  MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                  return FALSE;                               // Return FALSE
                              }
                           
                              if(!SetPixelFormat(hDC,PixelFormat,&pfd))       // Are We Able To Set The Pixel Format?
                              {
                                  KillGLWindow();                             // Reset The Display
                                  MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                  return FALSE;                               // Return FALSE
                              }
                           
                              if (!(hRC=wglCreateContext(hDC)))               // Are We Able To Get A Rendering Context?
                              {
                                  KillGLWindow();                             // Reset The Display
                                  MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                  return FALSE;                               // Return FALSE
                              }
                           
                              if(!wglMakeCurrent(hDC,hRC))                    // Try To Activate The Rendering Context
                              {
                                  KillGLWindow();                             // Reset The Display
                                  MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                  return FALSE;                               // Return FALSE
                              }
                           
                              ShowWindow(hWnd,SW_SHOW);                       // Show The Window
                              SetForegroundWindow(hWnd);                      // Slightly Higher Priority
                              SetFocus(hWnd);                                 // Sets Keyboard Focus To The Window
                              ReSizeGLScene(width, height);                   // Set Up Our Perspective GL Screen
                           
                              if (!InitGL())                                  // Initialize Our Newly Created GL Window
                              {
                                  KillGLWindow();                             // Reset The Display
                                  MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                  return FALSE;                               // Return FALSE
                              }
                           
                              return TRUE;                                    // Success
                          }
                           
                          LRESULT CALLBACK WndProc(   HWND    hWnd,           // Handle For This Window
                                                      UINT    uMsg,           // Message For This Window
                                                      WPARAM  wParam,         // Additional Message Information
                                                      LPARAM  lParam)         // Additional Message Information
                          {
                              switch (uMsg)                                   // Check For Windows Messages
                              {
                                  case WM_ACTIVATE:                           // Watch For Window Activate Message
                                  {
                                      if (!HIWORD(wParam))                    // Check Minimization State
                                      {
                                          active=TRUE;                        // Program Is Active
                                      }
                                      else
                                      {
                                          active=FALSE;                       // Program Is No Longer Active
                                      }
                           
                                      return 0;                               // Return To The Message Loop
                                  }
                           
                                  case WM_SYSCOMMAND:                         // Intercept System Commands
                                  {
                                      switch (wParam)                         // Check System Calls
                                      {
                                          case SC_SCREENSAVE:                 // Screensaver Trying To Start?
                                          case SC_MONITORPOWER:               // Monitor Trying To Enter Powersave?
                                          return 0;                           // Prevent From Happening
                                      }
                                      break;                                  // Exit
                                  }
                           
                                  case WM_CLOSE:                              // Did We Receive A Close Message?
                                  {
                                      PostQuitMessage(0);                     // Send A Quit Message
                                      return 0;                               // Jump Back
                                  }
                           
                                  case WM_KEYDOWN:                            // Is A Key Being Held Down?
                                  {
                                      keys[wParam] = TRUE;                    // If So, Mark It As TRUE
                                      return 0;                               // Jump Back
                                  }
                           
                                  case WM_KEYUP:                              // Has A Key Been Released?
                                  {
                                      keys[wParam] = FALSE;                   // If So, Mark It As FALSE
                                      return 0;                               // Jump Back
                                  }
                           
                                  case WM_SIZE:                               // Resize The OpenGL Window
                                  {
                                      ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));  // LoWord=Width, HiWord=Height
                                      return 0;                               // Jump Back
                                  }
                              }
                           
                              // Pass All Unhandled Messages To DefWindowProc
                              return DefWindowProc(hWnd,uMsg,wParam,lParam);
                          }
                           
                          DWORD WINAPI func1(void* Param)
                           
                          //int WINAPI WinMain(   HINSTANCE   hInstance,          // Instance
                          //                  HINSTANCE   hPrevInstance,      // Previous Instance
                          //                  LPSTR       lpCmdLine,          // Command Line Parameters
                          //                  int         nCmdShow)           // Window Show State
                          {
                              MSG     msg;                                    // Windows Message Structure
                              BOOL    done=FALSE;                             // Bool Variable To Exit Loop
                           
                              // Ask The User Which Screen Mode They Prefer
                              if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
                              {
                                  fullscreen=FALSE;                           // Windowed Mode
                              }
                           
                              // Create Our OpenGL Window
                              if (!CreateGLWindow("NeHe's Bitmap Font Tutorial",640,480,16,fullscreen))
                              {
                                  return 0;                                   // Quit If Window Was Not Created
                              }
                           
                              while(!done)                                    // Loop That Runs While done=FALSE
                              {
                                  if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))   // Is There A Message Waiting?
                                  {
                                      if (msg.message==WM_QUIT)               // Have We Received A Quit Message?
                                      {
                                          done=TRUE;                          // If So done=TRUE
                                      }
                                      else                                    // If Not, Deal With Window Messages
                                      {
                                          TranslateMessage(&msg);             // Translate The Message
                                          DispatchMessage(&msg);              // Dispatch The Message
                                      }
                                  }
                                  else                                        // If There Are No Messages
                                  {
                                      // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
                                      if ((active && !DrawGLScene()) || keys[VK_ESCAPE])  // Active?  Was There A Quit Received?
                                      {
                                          done=TRUE;                          // ESC or DrawGLScene Signalled A Quit
                                      }
                                      else                                    // Not Time To Quit, Update Screen
                                      {
                                          SwapBuffers(hDC);                   // Swap Buffers (Double Buffering)
                                      }
                           
                                      if (keys[VK_F1])                        // Is F1 Being Pressed?
                                      {
                                          keys[VK_F1]=FALSE;                  // If So Make Key FALSE
                                          KillGLWindow();                     // Kill Our Current Window
                                          fullscreen=!fullscreen;             // Toggle Fullscreen / Windowed Mode
                                          // Recreate Our OpenGL Window
                                          if (!CreateGLWindow("NeHe's Bitmap Font Tutorial",640,480,16,fullscreen))
                                          {
                                              return 0;                       // Quit If Window Was Not Created
                                          }
                                      }
                                  }
                              }
                           
                              // Shutdown
                              KillGLWindow();                                 // Kill The Window
                              return (msg.wParam);                            // Exit The Program
                          }
                           
                           
                          DWORD WINAPI func2(void* Param)
                          {
                              while (true)
                              {
                                  printf("Test");
                                  Sleep(10000);
                              }
                              return 0;
                          }
                           
                           
                          void main()
                          {
                              DWORD ThreadId1, ThreadId2; //создаём идентификаторы потока
                              HANDLE hThread1 = CreateThread(NULL, 0, func1, 0, 0, &ThreadId1);//создаём потоки
                              HANDLE hThread2 = CreateThread(NULL, 0, func2, 0, 0, &ThreadId2);
                           
                              MSG     msg;                                    
                              BOOL    done=FALSE;
                           
                              while(!done)
                              {
                                  if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                                  {
                                      if (msg.message==WM_QUIT)
                                      {
                                          done=TRUE;
                                          CloseHandle(hThread1); CloseHandle(hThread2);
                                      }
                                      else
                                      {
                                          TranslateMessage(&msg);
                                          DispatchMessage(&msg);
                                      }
                                  }
                                  else
                                  {
                                      if ((active && !DrawGLScene()) || keys[VK_ESCAPE])
                                      {
                                          done=TRUE;
                                          CloseHandle(hThread1); CloseHandle(hThread2); //Закрываем HANDLE
                                      }
                                  }
                              }
                              
                          }


                        Все без изменения за исключением концовки
                          Цитата Seregagad @
                          Мой сильно большой код...

                          Вот так выглядит мой неправильный вариант, который с ошибкой

                          ExpandedWrap disabled
                            /*
                             *      This Code Was Created By Jeff Molofee 2000
                             *      Modified by Shawn T. to handle (%3.2f, num) parameters.
                             *      A HUGE Thanks To Fredric Echols For Cleaning Up
                             *      And Optimizing The Base Code, Making It More Flexible!
                             *      If You've Found This Code Useful, Please Let Me Know.
                             *      Visit My Site At nehe.gamedev.net
                             */
                             
                            #include <windows.h>        // Header File For Windows
                            #include <math.h>           // Header File For Windows Math Library
                            #include <stdio.h>          // Header File For Standard Input/Output
                            #include <stdarg.h>         // Header File For Variable Argument Routines
                            #include <gl\gl.h>          // Header File For The OpenGL32 Library
                            #include <gl\glu.h>         // Header File For The GLu32 Library
                            #include <gl\glaux.h>       // Header File For The Glaux Library
                             
                            HDC         hDC=NULL;       // Private GDI Device Context
                            HGLRC       hRC=NULL;       // Permanent Rendering Context
                            HWND        hWnd=NULL;      // Holds Our Window Handle
                            HINSTANCE   hInstance;      // Holds The Instance Of The Application
                             
                            GLuint  base;               // Base Display List For The Font Set
                            GLfloat cnt1;               // 1st Counter Used To Move Text & For Coloring
                            GLfloat cnt2;               // 2nd Counter Used To Move Text & For Coloring
                             
                            bool    keys[256];          // Array Used For The Keyboard Routine
                            bool    active=TRUE;        // Window Active Flag Set To TRUE By Default
                            bool    fullscreen=TRUE;    // Fullscreen Flag Set To Fullscreen Mode By Default
                             
                            LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);   // Declaration For WndProc
                             
                            GLvoid BuildFont(GLvoid)                                // Build Our Bitmap Font
                            {
                                HFONT   font;                                       // Windows Font ID
                                HFONT   oldfont;                                    // Used For Good House Keeping
                             
                                base = glGenLists(96);                              // Storage For 96 Characters
                             
                                font = CreateFont(  -24,                            // Height Of Font
                                                    0,                              // Width Of Font
                                                    0,                              // Angle Of Escapement
                                                    0,                              // Orientation Angle
                                                    FW_BOLD,                        // Font Weight
                                                    FALSE,                          // Italic
                                                    FALSE,                          // Underline
                                                    FALSE,                          // Strikeout
                                                    ANSI_CHARSET,                   // Character Set Identifier
                                                    OUT_TT_PRECIS,                  // Output Precision
                                                    CLIP_DEFAULT_PRECIS,            // Clipping Precision
                                                    ANTIALIASED_QUALITY,            // Output Quality
                                                    FF_DONTCARE|DEFAULT_PITCH,      // Family And Pitch
                                                    "Courier New");                 // Font Name
                             
                                oldfont = (HFONT)SelectObject(hDC, font);           // Selects The Font We Want
                                wglUseFontBitmaps(hDC, 32, 96, base);               // Builds 96 Characters Starting At Character 32
                                SelectObject(hDC, oldfont);                         // Selects The Font We Want
                                DeleteObject(font);                                 // Delete The Font
                            }
                             
                            GLvoid KillFont(GLvoid)                                 // Delete The Font List
                            {
                                glDeleteLists(base, 96);                            // Delete All 96 Characters
                            }
                             
                            GLvoid glPrint(const char *fmt, ...)                    // Custom GL "Print" Routine
                            {
                                char        text[256];                              // Holds Our String
                                va_list     ap;                                     // Pointer To List Of Arguments
                             
                                if (fmt == NULL)                                    // If There's No Text
                                    return;                                         // Do Nothing
                             
                                va_start(ap, fmt);                                  // Parses The String For Variables
                                    vsprintf(text, fmt, ap);                        // And Converts Symbols To Actual Numbers
                                va_end(ap);                                         // Results Are Stored In Text
                             
                                glPushAttrib(GL_LIST_BIT);                          // Pushes The Display List Bits
                                glListBase(base - 32);                              // Sets The Base Character to 32
                                glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);  // Draws The Display List Text
                                glPopAttrib();                                      // Pops The Display List Bits
                            }
                             
                            GLvoid ReSizeGLScene(GLsizei width, GLsizei height)     // Resize And Initialize The GL Window
                            {
                                if (height==0)                                      // Prevent A Divide By Zero By
                                {
                                    height=1;                                       // Making Height Equal One
                                }
                             
                                glViewport(0,0,width,height);                       // Reset The Current Viewport
                             
                                glMatrixMode(GL_PROJECTION);                        // Select The Projection Matrix
                                glLoadIdentity();                                   // Reset The Projection Matrix
                             
                                // Calculate The Aspect Ratio Of The Window
                                gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
                             
                                glMatrixMode(GL_MODELVIEW);                         // Select The Modelview Matrix
                                glLoadIdentity();                                   // Reset The Modelview Matrix
                            }
                             
                            int InitGL(GLvoid)                                      // All Setup For OpenGL Goes Here
                            {
                                glShadeModel(GL_SMOOTH);                            // Enable Smooth Shading
                                glClearColor(0.0f, 0.0f, 0.0f, 0.5f);               // Black Background
                                glClearDepth(1.0f);                                 // Depth Buffer Setup
                                glEnable(GL_DEPTH_TEST);                            // Enables Depth Testing
                                glDepthFunc(GL_LEQUAL);                             // The Type Of Depth Testing To Do
                                glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // Really Nice Perspective Calculations
                             
                                BuildFont();                                        // Build The Font
                             
                                return TRUE;                                        // Initialization Went OK
                            }
                             
                            int DrawGLScene(GLvoid)                                 // Here's Where We Do All The Drawing
                            {
                                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
                                glLoadIdentity();                                   // Reset The Current Modelview Matrix
                                glTranslatef(0.0f,0.0f,-1.0f);                      // Move One Unit Into The Screen
                                // Pulsing Colors Based On Text Position
                                glColor3f(1.0f*float(cos(cnt1)),1.0f*float(sin(cnt2)),1.0f-0.5f*float(cos(cnt1+cnt2)));
                                // Position The Text On The Screen
                                glRasterPos2f(-0.45f+0.05f*float(cos(cnt1)), 0.32f*float(sin(cnt2)));
                                glPrint("Active OpenGL Text With NeHe - %7.2f", cnt1);  // Print GL Text To The Screen
                                cnt1+=0.051f;                                       // Increase The First Counter
                                cnt2+=0.005f;                                       // Increase The First Counter
                                return TRUE;                                        // Everything Went OK
                            }
                             
                            GLvoid KillGLWindow(GLvoid)                             // Properly Kill The Window
                            {
                                if (fullscreen)                                     // Are We In Fullscreen Mode?
                                {
                                    ChangeDisplaySettings(NULL,0);                  // If So Switch Back To The Desktop
                                    ShowCursor(TRUE);                               // Show Mouse Pointer
                                }
                             
                                if (hRC)                                            // Do We Have A Rendering Context?
                                {
                                    if (!wglMakeCurrent(NULL,NULL))                 // Are We Able To Release The DC And RC Contexts?
                                    {
                                        MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                                    }
                             
                                    if (!wglDeleteContext(hRC))                     // Are We Able To Delete The RC?
                                    {
                                        MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                                    }
                                    hRC=NULL;                                       // Set RC To NULL
                                }
                             
                                if (hDC && !ReleaseDC(hWnd,hDC))                    // Are We Able To Release The DC
                                {
                                    MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                                    hDC=NULL;                                       // Set DC To NULL
                                }
                             
                                if (hWnd && !DestroyWindow(hWnd))                   // Are We Able To Destroy The Window?
                                {
                                    MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                                    hWnd=NULL;                                      // Set hWnd To NULL
                                }
                             
                                if (!UnregisterClass("OpenGL",hInstance))           // Are We Able To Unregister Class
                                {
                                    MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                                    hInstance=NULL;                                 // Set hInstance To NULL
                                }
                             
                                KillFont();
                            }
                             
                            /*  This Code Creates Our OpenGL Window.  Parameters Are:                   *
                             *  title           - Title To Appear At The Top Of The Window              *
                             *  width           - Width Of The GL Window Or Fullscreen Mode             *
                             *  height          - Height Of The GL Window Or Fullscreen Mode            *
                             *  bits            - Number Of Bits To Use For Color (8/16/24/32)          *
                             *  fullscreenflag  - Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE)   */
                             
                            BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
                            {
                                GLuint      PixelFormat;            // Holds The Results After Searching For A Match
                                WNDCLASS    wc;                     // Windows Class Structure
                                DWORD       dwExStyle;              // Window Extended Style
                                DWORD       dwStyle;                // Window Style
                                RECT        WindowRect;             // Grabs Rectangle Upper Left / Lower Right Values
                                WindowRect.left=(long)0;            // Set Left Value To 0
                                WindowRect.right=(long)width;       // Set Right Value To Requested Width
                                WindowRect.top=(long)0;             // Set Top Value To 0
                                WindowRect.bottom=(long)height;     // Set Bottom Value To Requested Height
                             
                                fullscreen=fullscreenflag;          // Set The Global Fullscreen Flag
                             
                                hInstance           = GetModuleHandle(NULL);                // Grab An Instance For Our Window
                                wc.style            = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;   // Redraw On Size, And Own DC For Window.
                                wc.lpfnWndProc      = (WNDPROC) WndProc;                    // WndProc Handles Messages
                                wc.cbClsExtra       = 0;                                    // No Extra Window Data
                                wc.cbWndExtra       = 0;                                    // No Extra Window Data
                                wc.hInstance        = hInstance;                            // Set The Instance
                                wc.hIcon            = LoadIcon(NULL, IDI_WINLOGO);          // Load The Default Icon
                                wc.hCursor          = LoadCursor(NULL, IDC_ARROW);          // Load The Arrow Pointer
                                wc.hbrBackground    = NULL;                                 // No Background Required For GL
                                wc.lpszMenuName     = NULL;                                 // We Don't Want A Menu
                                wc.lpszClassName    = "OpenGL";                             // Set The Class Name
                             
                                if (!RegisterClass(&wc))                                    // Attempt To Register The Window Class
                                {
                                    MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                    return FALSE;                                           // Return FALSE
                                }
                                
                                if (fullscreen)                                             // Attempt Fullscreen Mode?
                                {
                                    DEVMODE dmScreenSettings;                               // Device Mode
                                    memset(&dmScreenSettings,0,sizeof(dmScreenSettings));   // Makes Sure Memory's Cleared
                                    dmScreenSettings.dmSize=sizeof(dmScreenSettings);       // Size Of The Devmode Structure
                                    dmScreenSettings.dmPelsWidth    = width;                // Selected Screen Width
                                    dmScreenSettings.dmPelsHeight   = height;               // Selected Screen Height
                                    dmScreenSettings.dmBitsPerPel   = bits;                 // Selected Bits Per Pixel
                                    dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
                             
                                    // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
                                    if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
                                    {
                                        // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
                                        if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
                                        {
                                            fullscreen=FALSE;       // Windowed Mode Selected.  Fullscreen = FALSE
                                        }
                                        else
                                        {
                                            // Pop Up A Message Box Letting User Know The Program Is Closing.
                                            MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
                                            return FALSE;                                   // Return FALSE
                                        }
                                    }
                                }
                             
                                if (fullscreen)                                             // Are We Still In Fullscreen Mode?
                                {
                                    dwExStyle=WS_EX_APPWINDOW;                              // Window Extended Style
                                    dwStyle=WS_POPUP;                                       // Windows Style
                                    ShowCursor(FALSE);                                      // Hide Mouse Pointer
                                }
                                else
                                {
                                    dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;           // Window Extended Style
                                    dwStyle=WS_OVERLAPPEDWINDOW;                            // Windows Style
                                }
                             
                                AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);     // Adjust Window To True Requested Size
                             
                                // Create The Window
                                if (!(hWnd=CreateWindowEx(  dwExStyle,                          // Extended Style For The Window
                                                            "OpenGL",                           // Class Name
                                                            title,                              // Window Title
                                                            dwStyle |                           // Defined Window Style
                                                            WS_CLIPSIBLINGS |                   // Required Window Style
                                                            WS_CLIPCHILDREN,                    // Required Window Style
                                                            0, 0,                               // Window Position
                                                            WindowRect.right-WindowRect.left,   // Calculate Window Width
                                                            WindowRect.bottom-WindowRect.top,   // Calculate Window Height
                                                            NULL,                               // No Parent Window
                                                            NULL,                               // No Menu
                                                            hInstance,                          // Instance
                                                            NULL)))                             // Dont Pass Anything To WM_CREATE
                                {
                                    KillGLWindow();                             // Reset The Display
                                    MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                    return FALSE;                               // Return FALSE
                                }
                             
                                static  PIXELFORMATDESCRIPTOR pfd=              // pfd Tells Windows How We Want Things To Be
                                {
                                    sizeof(PIXELFORMATDESCRIPTOR),              // Size Of This Pixel Format Descriptor
                                    1,                                          // Version Number
                                    PFD_DRAW_TO_WINDOW |                        // Format Must Support Window
                                    PFD_SUPPORT_OPENGL |                        // Format Must Support OpenGL
                                    PFD_DOUBLEBUFFER,                           // Must Support Double Buffering
                                    PFD_TYPE_RGBA,                              // Request An RGBA Format
                                    bits,                                       // Select Our Color Depth
                                    0, 0, 0, 0, 0, 0,                           // Color Bits Ignored
                                    0,                                          // No Alpha Buffer
                                    0,                                          // Shift Bit Ignored
                                    0,                                          // No Accumulation Buffer
                                    0, 0, 0, 0,                                 // Accumulation Bits Ignored
                                    16,                                         // 16Bit Z-Buffer (Depth Buffer)  
                                    0,                                          // No Stencil Buffer
                                    0,                                          // No Auxiliary Buffer
                                    PFD_MAIN_PLANE,                             // Main Drawing Layer
                                    0,                                          // Reserved
                                    0, 0, 0                                     // Layer Masks Ignored
                                };
                                
                                if (!(hDC=GetDC(hWnd)))                         // Did We Get A Device Context?
                                {
                                    KillGLWindow();                             // Reset The Display
                                    MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                    return FALSE;                               // Return FALSE
                                }
                             
                                if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Did Windows Find A Matching Pixel Format?
                                {
                                    KillGLWindow();                             // Reset The Display
                                    MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                    return FALSE;                               // Return FALSE
                                }
                             
                                if(!SetPixelFormat(hDC,PixelFormat,&pfd))       // Are We Able To Set The Pixel Format?
                                {
                                    KillGLWindow();                             // Reset The Display
                                    MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                    return FALSE;                               // Return FALSE
                                }
                             
                                if (!(hRC=wglCreateContext(hDC)))               // Are We Able To Get A Rendering Context?
                                {
                                    KillGLWindow();                             // Reset The Display
                                    MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                    return FALSE;                               // Return FALSE
                                }
                             
                                if(!wglMakeCurrent(hDC,hRC))                    // Try To Activate The Rendering Context
                                {
                                    KillGLWindow();                             // Reset The Display
                                    MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                    return FALSE;                               // Return FALSE
                                }
                             
                                ShowWindow(hWnd,SW_SHOW);                       // Show The Window
                                SetForegroundWindow(hWnd);                      // Slightly Higher Priority
                                SetFocus(hWnd);                                 // Sets Keyboard Focus To The Window
                                ReSizeGLScene(width, height);                   // Set Up Our Perspective GL Screen
                             
                                if (!InitGL())                                  // Initialize Our Newly Created GL Window
                                {
                                    KillGLWindow();                             // Reset The Display
                                    MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                                    return FALSE;                               // Return FALSE
                                }
                             
                                return TRUE;                                    // Success
                            }
                             
                            LRESULT CALLBACK WndProc(   HWND    hWnd,           // Handle For This Window
                                                        UINT    uMsg,           // Message For This Window
                                                        WPARAM  wParam,         // Additional Message Information
                                                        LPARAM  lParam)         // Additional Message Information
                            {
                                switch (uMsg)                                   // Check For Windows Messages
                                {
                                    case WM_ACTIVATE:                           // Watch For Window Activate Message
                                    {
                                        if (!HIWORD(wParam))                    // Check Minimization State
                                        {
                                            active=TRUE;                        // Program Is Active
                                        }
                                        else
                                        {
                                            active=FALSE;                       // Program Is No Longer Active
                                        }
                             
                                        return 0;                               // Return To The Message Loop
                                    }
                             
                                    case WM_SYSCOMMAND:                         // Intercept System Commands
                                    {
                                        switch (wParam)                         // Check System Calls
                                        {
                                            case SC_SCREENSAVE:                 // Screensaver Trying To Start?
                                            case SC_MONITORPOWER:               // Monitor Trying To Enter Powersave?
                                            return 0;                           // Prevent From Happening
                                        }
                                        break;                                  // Exit
                                    }
                             
                                    case WM_CLOSE:                              // Did We Receive A Close Message?
                                    {
                                        PostQuitMessage(0);                     // Send A Quit Message
                                        return 0;                               // Jump Back
                                    }
                             
                                    case WM_KEYDOWN:                            // Is A Key Being Held Down?
                                    {
                                        keys[wParam] = TRUE;                    // If So, Mark It As TRUE
                                        return 0;                               // Jump Back
                                    }
                             
                                    case WM_KEYUP:                              // Has A Key Been Released?
                                    {
                                        keys[wParam] = FALSE;                   // If So, Mark It As FALSE
                                        return 0;                               // Jump Back
                                    }
                             
                                    case WM_SIZE:                               // Resize The OpenGL Window
                                    {
                                        ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));  // LoWord=Width, HiWord=Height
                                        return 0;                               // Jump Back
                                    }
                                }
                             
                                // Pass All Unhandled Messages To DefWindowProc
                                return DefWindowProc(hWnd,uMsg,wParam,lParam);
                            }
                             
                            DWORD WINAPI func1(void* Param)
                             
                            //int WINAPI WinMain(   HINSTANCE   hInstance,          // Instance
                            //                  HINSTANCE   hPrevInstance,      // Previous Instance
                            //                  LPSTR       lpCmdLine,          // Command Line Parameters
                            //                  int         nCmdShow)           // Window Show State
                            {
                                MSG     msg;                                    // Windows Message Structure
                                BOOL    done=FALSE;                             // Bool Variable To Exit Loop
                             
                                // Ask The User Which Screen Mode They Prefer
                                if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
                                {
                                    fullscreen=FALSE;                           // Windowed Mode
                                }
                             
                                // Create Our OpenGL Window
                                if (!CreateGLWindow("NeHe's Bitmap Font Tutorial",640,480,16,fullscreen))
                                {
                                    return 0;                                   // Quit If Window Was Not Created
                                }
                             
                                while(!done)                                    // Loop That Runs While done=FALSE
                                {
                                    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))   // Is There A Message Waiting?
                                    {
                                        if (msg.message==WM_QUIT)               // Have We Received A Quit Message?
                                        {
                                            done=TRUE;                          // If So done=TRUE
                                        }
                                        else                                    // If Not, Deal With Window Messages
                                        {
                                            TranslateMessage(&msg);             // Translate The Message
                                            DispatchMessage(&msg);              // Dispatch The Message
                                        }
                                    }
                                    else                                        // If There Are No Messages
                                    {
                                        // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
                                        if ((active && !DrawGLScene()) || keys[VK_ESCAPE])  // Active?  Was There A Quit Received?
                                        {
                                            done=TRUE;                          // ESC or DrawGLScene Signalled A Quit
                                        }
                                        else                                    // Not Time To Quit, Update Screen
                                        {
                                            SwapBuffers(hDC);                   // Swap Buffers (Double Buffering)
                                        }
                             
                                        if (keys[VK_F1])                        // Is F1 Being Pressed?
                                        {
                                            keys[VK_F1]=FALSE;                  // If So Make Key FALSE
                                            KillGLWindow();                     // Kill Our Current Window
                                            fullscreen=!fullscreen;             // Toggle Fullscreen / Windowed Mode
                                            // Recreate Our OpenGL Window
                                            if (!CreateGLWindow("NeHe's Bitmap Font Tutorial",640,480,16,fullscreen))
                                            {
                                                return 0;                       // Quit If Window Was Not Created
                                            }
                                        }
                                    }
                                }
                             
                                // Shutdown
                                KillGLWindow();                                 // Kill The Window
                                return (msg.wParam);                            // Exit The Program
                            }
                             
                             
                            DWORD WINAPI func2(void* Param)
                            {
                                while (true)
                                {
                                    printf("Test");
                                    Sleep(10000);
                                }
                                return 0;
                            }
                             
                             
                            void main()
                            {
                                DWORD ThreadId1, ThreadId2; //создаём идентификаторы потока
                                HANDLE hThread1 = CreateThread(NULL, 0, func1, 0, 0, &ThreadId1);//создаём потоки
                                HANDLE hThread2 = CreateThread(NULL, 0, func2, 0, 0, &ThreadId2);
                             
                                MSG     msg;                                    
                                BOOL    done=FALSE;
                             
                                while(!done)
                                {
                                    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                                    {
                                        if (msg.message==WM_QUIT)
                                        {
                                            done=TRUE;
                                            CloseHandle(hThread1); CloseHandle(hThread2);
                                        }
                                        else
                                        {
                                            TranslateMessage(&msg);
                                            DispatchMessage(&msg);
                                        }
                                    }
                                    else
                                    {
                                        if ((active && !DrawGLScene()) || keys[VK_ESCAPE])
                                        {
                                            done=TRUE;
                                            CloseHandle(hThread1); CloseHandle(hThread2); //Закрываем HANDLE
                                        }
                                    }
                                }
                                
                            }


                          Все без изменения за исключением концовки

                          Собрал я твой код. Ехе вне среды запускается нормально.
                          Прикреплённый файлПрикреплённый файлTest.zip (6,36 Кбайт, скачиваний: 150)
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0765 ]   [ 19 queries used ]   [ Generated: 28.03.24, 23:48 GMT ]