windows多線程窗口程序設計


掌握windows基於消息驅動的窗口應用程序設計的基本方法,掌握窗口程序資源的概念與設計,掌握常用的消息的程序處理方法,掌握文字圖形輸出相關函數編程。掌握設計的基本方法(選項),掌握時鍾消息設計動畫程序(選項)

利用windows基於消息驅動的窗口應用程序設計的基本方法,利用常用的消息程序處理方法,設計一個多線程程序,然后用時鍾動畫將各線程的執行過程直觀的表現出來。

操作環境:安裝有Windows操作系統PC機一台,實驗環境為VS(任何版本都行).

 

1.在vs中,生成一個空白的win32項目,了解win32的消息驅動,學習窗口程序資源的概念與設計,並為程序設計一個位圖圖標。

2. 觀察win32程序基本結構,了解常用的消息的程序處理方法,掌握文字圖形輸出相關函數編程,並練習文字與圖形的輸出。

3.設計並構建程序用戶界面

菜單欄

線程設置對話框

菜單與對話框函數如下:

// 分析菜單選擇:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    int wmId, wmEvent;

    PAINTSTRUCT ps;

    HDC hdc;

    int pausecount;

 

    switch (message)

    {

    case WM_COMMAND:

        wmId = LOWORD(wParam);

        wmEvent = HIWORD(wParam);

        // 分析菜單選擇:

        switch (wmId)

        {

        case IDM_ABOUT:

            switch (DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About))

            {

            case IDSTART:

                CreateThreadStart(hWnd);

                //GetSecurityInfo

                break;

 

            case IDPAUSE:

                pausecount=SuspendThread((HANDLE)ThreadId[treatwith]);

                pausecount=SuspendThread(ThreadHandle[treatwith]);

                if(pausecount==-1)

                {

                    pausecount=GetLastError();

                }

                break;

            case IDRESET:

                pausecount=ResumeThread((HANDLE)ThreadId[treatwith]);

                pausecount=ResumeThread(ThreadHandle[treatwith]);

                if(pausecount==-1)

                {

                    pausecount=GetLastError();

                }

                break;

            }

            break;

        

        case IDM_EXIT:

            DestroyWindow(hWnd);

            break;

        default:

            return DefWindowProc(hWnd, message, wParam, lParam);

        }

        break;

    case WM_SIZE:

        wndWidthSize=LOWORD(lParam);

        wndHighSize=HIWORD(lParam);

        break;

    case WM_PAINT:

        hdc = BeginPaint(hWnd, &ps);

        //TextOut(hdc,100,50,_T("SOUTH WEST UNIVERSITY"),wcslen(_T("SOUTH WEST UNIVERSITY")));

        // TODO: 在此添加任意繪圖代碼...

        EndPaint(hWnd, &ps);

        break;

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    default:

        return DefWindowProc(hWnd, message, wParam, lParam);

    }

    return 0;

}

 

// "開始"對話框的消息處理程序。

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

    UNREFERENCED_PARAMETER(lParam);

    switch (message)

    {

    case WM_INITDIALOG:

        return (INT_PTR)TRUE;

 

    case WM_COMMAND:

        if (LOWORD(wParam) == IDCANCEL)

        {

            EndDialog(hDlg, LOWORD(wParam));

            return (INT_PTR)TRUE;

        }

        if (LOWORD(wParam) == IDPAUSE)

        {

            treatwith=GetDlgItemInt(hDlg,IDC_EDIT2,NULL,TRUE);

            EndDialog(hDlg, LOWORD(wParam));

            return (INT_PTR)TRUE;

        }

        if (LOWORD(wParam) == IDRESET)

        {

            treatwith=GetDlgItemInt(hDlg,IDC_EDIT2,NULL,TRUE);

            EndDialog(hDlg, LOWORD(wParam));

            return (INT_PTR)TRUE;

        }

        if (LOWORD(wParam) == IDSTART)

        {

            threadNum=GetDlgItemInt(hDlg,IDC_EDIT1,NULL,TRUE);

            EndDialog(hDlg, LOWORD(wParam));

            return (INT_PTR)TRUE;

        }

        break;

    }

    return (INT_PTR)FALSE;

}

4.編寫多線程創建函數,創建多個線程,編寫動畫繪圖函數繪制圖形,每個線程都調用繪圖函數,在用戶區中繪制動畫,以直觀表現線程的運行。具體代碼如下:

//線程創建

void CreateThreadStart(HWND hWnd)

{

    bool SecurityDescriptorSuc=true;

    threadStruct *pthreadparam;

    UINT threadXuHao=0;

    int i=0;

    HANDLE handleRes;

    while(threadXuHao<threadNum)

    {

        pthreadparam=new threadStruct;//到線程里面去釋放

        pthreadparam->hWnd=hWnd;

        pthreadparam->threadXuHao=threadXuHao;

        if(SecurityDescriptorSuc==false)

        {

            //handleRes=CreateThread(&sa,0,PaintThread,

            //    (LPVOID)pthreadparam,0,&ThreadId[threadXuHao]);

            ThreadHandle[threadXuHao]=handleRes;

        }

        else

        {

            handleRes=CreateThread(NULL,0,PaintThread,

                (LPVOID)pthreadparam,0,&ThreadId[threadXuHao]);

            ThreadHandle[threadXuHao]=handleRes;

        }

        threadXuHao++;

    }

}

 

//繪圖

DWORD WINAPI PaintThread(LPVOID lpParam)

{

    UINT threadXuHao=((threadStruct*)lpParam)->threadXuHao;

    HWND hWnd=((threadStruct*)lpParam)->hWnd;

    delete lpParam;

 

    HDC hdc=GetDC(hWnd);

    /*UINT currentHigh=wndHighSize-1;*/

    wchar_t str[100];

    swprintf(str,_T("this is the %d thread"),threadXuHao);

    TextOut(hdc, 50 * (threadXuHao + 1) - 40 , 50 * (threadXuHao + 1) - 40 + (threadXuHao + 1) * 5, str, wcslen(str));

    

    /*UINT rectWidth;

    rectWidth=wndWidthSize/threadNum;*/

    //HFONT X=CreateHfont

    /*HPEN logicPen=CreatePen(PS_SOLID,3,logicColor[threadXuHao]);*/

    HPEN logicPen = CreatePen(PS_SOLID, 3, RGB(50 * threadXuHao - 80, 20 * threadXuHao, 10*threadXuHao+150));

    HPEN oldPenObj;

    RECT rc;

    GetClientRect(hWnd, &rc);

    int n = 0;

    int x=0;

    int y = 0;

    while (x<wndWidthSize)

    {

        x = 50 * (threadXuHao + 1) -40+150;

        y = 50 * (threadXuHao+1)-40;

            /*if (y > wndHighSize)

                y -= wndHighSize;*/

        int m = 10*(threadXuHao+1);

        

        //MoveToEx(hdc,rectWidth*threadXuHao,currentHigh,NULL);

        oldPenObj=(HPEN)SelectObject(hdc,(HGDIOBJ)logicPen);

        //LineTo(hdc,(rectWidth-30)*(threadXuHao+1),currentHigh);

        Ellipse(hdc, x+n ,y, x + m+n , y+m);

        SelectObject(hdc,(HGDIOBJ)oldPenObj);

        //currentHigh=currentHigh-3;

        n += (threadXuHao + 1) * 5;

        Sleep((threadXuHao+1)*200);

    }

    ReleaseDC(hWnd,hdc);

    return 1;

}

 

五. 實驗結果

程序運行結果如下:

其中,進程3被暫停。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM