1)在VS開發環境,基於MFC創建一個名爲ThreadProcess的工程,自動生成窗口類CThreadProcessDlg,一個ThreadProcessDlg.cpp和ThreadProcessDlg.h文件
2)在工具欄拉出一個Progress Control控件,默認ID:IDC_PROGRESS1,添加控件變量,設置其變量名爲m_speed,
在該窗口類的頭文件中的public中自動生成CProgressCtrl m_speed;
3)添加3個按鈕控件h和一個Edit Control控件(給其添加int型變量:m_Var1).窗口布局如下圖:
4)在ThreadProcess.h文件中的private中添加全局變量
private:
HANDLE m_ThreadSpeed; //聲明這個句柄是用於接受創建線程時返回的句柄,可以使用這個句柄對線程控制
5)自己新建.h文件,在該文件中自定義一個結構體,用於傳遞參數到多線程函數中去。新建.h文件方法:在解決方案中選擇 “頭文件” -》右鍵 -》添加 -》新建項 ,選擇頭文件-》輸入名稱。我這裏的名稱爲“ThreadFuantion.h”。下面是我新建的頭文件中添加的內容。主要是建立了一個結構體,用於存儲需要傳遞到多線程程序中的各種類型的變量
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <process.h>
typedef struct tag_Param
{
HANDLE hMutex;
int thread_id;
int var1;
int var2;
CWnd* kk;
bool bStop;
}TESTPARAM;
6)在ThreadProcessDlg.h文件中申明一個結構體。
private:
TESTPARAM TestParam;
7)雙擊窗體中的【開始】按鈕 在其響應函數中創建一個線程:
//開始
void CThreadProcessDlg::OnBnClickedButton1()
{
m_ThreadSpeed = CreateThread(\
0, //lpThreadAttributes:指向SECURITY_ATTRIBUTES型態的結構的指針。
0, //dwStackSize, 設置初始棧的大小,以字節爲單位,如果爲0,那麼默認將使用與調用該函數的線程相同的棧空間大小
ThreadSpeed, //lpStartAddress,指向線程函數的指針,形式:@函數名,函數名稱沒有限制,
//但是必須以下列形式聲明:DWORD WINAPI 函數名 (LPVOID lpParam) ,格式不正確將無法調用成功。
reinterpret_cast<LPVOID *>(&TestParam),//向線程函數傳遞的參數,是一個指向結構的指針,不需傳遞參數時,爲NULL。
0, //線程標誌,可取值如下 a) CREATE_SUSPENDED(0x00000004):創建一個掛起的線程, b) 0:表示創建後立即激活。c)...
0); //保存新線程的id。
// CloseHandle(m_ThreadSpeed); //一般創建後馬上關閉線程句柄,因爲主線程不關係創建的新線程。如果創建新線程後馬上註銷的話,
//不能再對線程進行 掛起 喚醒等操作
}
注意:對結構體類型的強制轉換,非常必要!!!
8)雙擊【+1】添加如下代碼 每按一次【+1】按鈕變量m_Var1自增10;
void CThreadProcessDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知處理程序代碼 m_Var1+=10; TestParam.kk = this; TestParam.var1=m_Var1; UpdateData(false);
}
9)8)雙擊【-1】添加如下代碼 每按一次【-1】按鈕變量m_Var1自減10;
void CThreadProcessDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知處理程序代碼
m_Var1-=10;
TestParam.kk = this;
TestParam.var1=m_Var1;
TestParam.var2=m_Var1;
UpdateData(false);
}
10)同樣在ThreadProcessDlg.cpp文件中添加開闢新線程的執行函數
//線程函數的實現
DWORD WINAPI CThreadProcessDlg::ThreadSpeed(LPVOID lpParameter)
{
int Count;
TESTPARAM *ptr=reinterpret_cast<TESTPARAM *>(lpParameter); //lpParameter參數帶來了豐富的信息,具體自己可以在結構體中定義
CThreadProcessDlg *Dlg=(CThreadProcessDlg *)ptr->kk; //TestParam.kk = this;將主窗口的指針帶回,方便獲取其中變量和資源
CWnd * pwnd = Dlg->GetDlgItem(IDC_PROGRESS1); //通過窗體指針,獲取進度條的句柄
CProgressCtrl *Speed = (CProgressCtrl*)pwnd; //獲取進度條的指針,從而方便在新開闢的線程中對其操作
Speed->SetRange(0,100); //設置進度條的範圍
while(1) //while(1)循環,只要主線程中的m_Var1改變,我們就能在進度條上反映出來
{
Speed->SetPos(Dlg->m_Var1);
_sleep(200);
}
return 0;
}
最終實現:按下【開始】開闢新線程, 按下【+1】或【-10】改變m_Var1,自定義的結構將改變的變量傳遞給線程執行的函數。從而改變進度條的位置。