На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> POSIX 2 WIN32 again.... , I need urgent help!
    Народ, я выдрал функцию, которая запускает окно, в котором должна выводиться векторная картинка... понятно, что без контекста трудно анализировать... но подскажите, как сделать так, чтобы эта функция запускалась отдельным потоком...желательно НЕ с помощью _beginthread %)

    Маза такая, что гвхопенвиндов, или как ее там, запускается из фортрановского файла CALL GWXOPENWINDOW(параметры *икс....) / запускаться-запускается, а вот ничерта не рисует. Я накопал, что ее нужно запускать отдельным потоком... хелпните, чем можете...

    очень важно то, что она должна запускаться в потоке, и также завершаться (в коде лежит _endthread, который требуется заменить на что-то типа TerminateThread)... иначе вешается основная программа


    void //W32CALL
    GWXWINOPEN(int *xstart, int *ystart, int *xsize, int *ysize)
    {
        HWND winFocus, winFG, win;
    //    HWND winF77; 
        RECT WinRect ,oldrect;
        POINT point;
        int  fontsize;
    //newcode
    wxstart  = *xstart;
        wystart  = *ystart;
        wxsize   = *xsize;
        wysize   = *ysize;
    //endofnewcode

    //    int  lunit;

            printf("\nDIAGNOSTIC MESSAGE : Entering display thread\n");
        /*
         *  Make window large enough to hold a client area compensating for borders
         */
        WinRect.left   = wxstart;
        WinRect.right  = wxstart + wxsize + 2*gwxXmatte;
        WinRect.top    = wystart;
        WinRect.bottom = wystart + wysize + 2*gwxYmatte + gwxYbar;

        /*
        printf("\nwxstart %d wystart %d \n",wxstart,wystart);
        printf("\nwxsize  %d wysize  %d \n",wxsize,wysize);

        printf("\nsetting rectangle left %d right %d \n",WinRect.left,WinRect.right);
        printf("\nsetting rectangle top  %d bot   %d \n",WinRect.top,WinRect.bottom);
        */
       
        winFG    = GetForegroundWindow();
        winFocus = GetActiveWindow();
        GetWindowRect(winFG, &oldrect);
        /*
        printf("Entry conditions:\n foreground %d/n orig focus %d\n",winFG,winFocus);
        printf("\nold rectangle left %d right %d \n",oldrect.left,oldrect.right);
        printf("\nold rectangle top  %d bot   %d \n",oldrect.top,oldrect.bottom);
        */

        /*    lunit = 5;
        winF77 = fgethwndqq(&lunit);
        printf("\nEntry conditions DVF window: %d/n",winF77);
        */

    /* Must use WS_CLIPCHILDREN and WS_CLIPSIBLINGS styles. */

        gwxWin   = CreateWindow( gwxClass, gwxClass,
                   WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
                   WinRect.left, WinRect.top,
                   WinRect.right - WinRect.left, WinRect.bottom - WinRect.top,
                   NULL, NULL, gwxInstance, NULL );

        if (gwxWin == NULL)  {
            fprintf(stderr, "Error: NULL window handle.\n");
            exit(1);
        }

        ShowWindow(gwxWin, SW_SHOWDEFAULT);
        UpdateWindow(gwxWin);

        gwxHDC = GetDC(gwxWin);
        if (gwxHDC == NULL) {
            fprintf(stderr, "Error: NULL window DC.\n");
            exit(1);
        }

        /* Create compatible window bitmap */
        gwxmemHDC = CreateCompatibleDC(gwxHDC);
        gwxBMAP   = CreateCompatibleBitmap(gwxHDC,xrootsize,yrootsize);
        SelectObject(gwxmemHDC, gwxBMAP);

        SelectObject(gwxmemHDC, GetStockObject(ANSI_VAR_FONT));
        SetTextAlign(gwxmemHDC, TA_LEFT | TA_BASELINE | TA_NOUPDATECP);
        SetBkMode(gwxmemHDC, TRANSPARENT);
       
        gwxSize[0] = wxsize;
        gwxSize[1] = wysize;
        gwxSize[2] = wxstart + 2*gwxXmatte;
        gwxSize[3] = wystart + 2*gwxYmatte + gwxYbar;
        gwxSize[4] = 1;
        SetWindowPos(gwxWin, HWND_TOP, gwxSize[2], gwxSize[3],
                               wxsize, wysize, SWP_NOMOVE|SWP_NOZORDER);

        /* SetWindowPos(gwxWin, HWND_TOP, 0,0, 0,0, SWP_NOMOVE | SWP_NOSIZE ); */
        SetForegroundWindow(gwxWin);


        nRGBmap     = 0;
        penwidth    = 0;
        penpattern  = -1;
        ndash    = 0;
        fontsize = 1;

        gwxGC = gwxgc(&gwxWin, &fontsize);
        SelectObject(gwxmemHDC, gwxGC->pen);

        /* initially clear the background bitmap */
        SelectObject(gwxmemHDC, gwxGC->bgbrush);
        PatBlt(gwxmemHDC, 0, 0, xrootsize, yrootsize, PATCOPY);

        SelectObject(gwxmemHDC, gwxGC->fgbrush);

        /* allocate black and white colors */
        /*r = 0;
          g = 0;
          b = 0;
          GWXALLOCRGBCOLOR(&r,&g,&b,&ic);
          r = 0;
          g = 0;
          b = 0;
          GWXALLOCRGBCOLOR(&r,&g,&b,&ic);
    */

        /*    printf("entering message loop\n\n"); */

        initthread = 1;

        /*    while (GetMessage(&Message, NULL, 0, 0)) { */

        /* Custom message loop to check cursor window to do X-style focus */

        while (1) {
          if(PeekMessage(&Message, gwxWin, 0, 0, PM_REMOVE)) {

    if(Message.message==WM_QUIT)
              break;

           TranslateMessage(&Message);
           DispatchMessage(&Message);
           Sleep(1);
          }
          else {
           GetCursorPos(&point);
           win = WindowFromPoint(point);
           /*       printf("pos x %d y %d win %d\n",point.x,point.y,win);  */

           /*       if(win==winF77) {
            SetActiveWindow(win);
            SetFocus(win);
            SetForegroundWindow(win);
           } */
           /*       if(win == winFG) {
      printf("pos x %d y %d win %d winFG %d\n",point.x,point.y,win,winFG);
             SetActiveWindow(winFG);
             SetFocus(winFG);
             SetForegroundWindow(winFG);
           } */
           Sleep(1);
          }
        }

        /*    printf("window thread ending\n"); */
    /*  return Message.wParam;
        exit; */

    //    _endthread();
    //Ivan Teplukhin has remarked

    }

    //////////////////дальше бесполезные комменты
    /* gwxwinopen
       Open window of specified size and position, return size and depth
       Parameters: 
         xstart,ystart          (int*)   upper left corner coordinates in root
         xsize,ysize            (int*)   desired window size
    */

    /*void W32CALL
    GWXWINOPEN (int *xstart, int *ystart, int *xsize, int *ysize)*/
    //{
      /*
        printf("GWXOPEN\nxstart %d\nystart %d\nxsize %d\nysize %d\n",*xstart,*ystart,*xsize,*ysize);
      */ 
    //    wxstart  = *xstart;
    //    wystart  = *ystart;
    //    wxsize   = *xsize;
    //    wysize   = *ysize;

        /* Start the window thread */
    //    initthread = 0;
    //   _beginthread(Thread1,0,NULL);


    //FOR PROPPER WORK THE THREAD MUST BE CREATED!!!

        //    printf("beginthread called\n");

    //    while(!initthread) {
    //      Sleep(5);
    //  printf("error in thread");
    //    }


    //}



    Сообщение отредактировано: windsurfer -
      OpenThreads

      Кросс-платформенная библиотека. Надеюсь поможет!
        В POSIX'е за это отвечает метод pthread_create.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0507 ]   [ 16 queries used ]   [ Generated: 3.05.24, 05:17 GMT ]