基於VS2010的MFC多線程編程(指針、句柄、整形變量等參數傳遞 )


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,自定義的結構將改變的變量傳遞給線程執行的函數。從而改變進度條的位置。

 

          













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章