C++中線程使用與參數傳遞


C++中線程的使用:線程的使用有多種方法,最常用的方法為CreateThread,CreateThrea的的參數詳解如下:

HANDLE WINAPI CreateThread(

  __in_opt   LPSECURITY_ATTRIBUTES lpThreadAttributes, // 指向SECURITY_ATTRIBUTES 的指針,為新線程指定安全描述

  __in       SIZE_T dwStackSize, // 初始化線程堆棧尺寸

  __in       LPTHREAD_START_ROUTINE lpStartAddress, //線程函數所指向的地址 起始函數

  __in_opt   LPVOID lpParameter, // 給線程函數傳遞的參數

  __in       DWORD dwCreationFlags, // 有關線程的標志

  __out_opt  LPDWORD lpThreadId //系統分配給線程的ID

);

 ----第一個參數是安全屬性,一般設為nil,使用缺省的安全屬性。當我們想此線程有另外的子進程時,可改變它的屬性。

----第二個參數是線程堆棧尺寸,一般設為0,表示與此應用的堆棧尺寸相同,即主線程與創建的線程一樣長度的堆棧。並且其長度會根據需要自動變長。

----第三個參數,也是最重要的一個,是一個指向函數名的指針,但傳遞時很簡單,只需在線程函數名前加上@就可以了。

----第四個參數是你需要向線程函數傳遞的參數,一般是一個指向結構的指針。不需傳遞參數時,則這個參數設為nil。

----第五個參數,傳入與線程有關的一些標志,如果是CREATE_SUSPENDED,則創建一個掛起的線程,即這個線程本身已創建,它的堆棧也已創建。但這個線程不會被分配給CPU時間,只有當ResumeThread函數被調用后才能執行;當然,也可以調用SuspendThread函數再次掛起線程。要是標志為0,那么一旦建立線程,線程函數就被立即調用。一般傳為0即可。

----第六個參數是系統分配給這個線程的唯一的ID標志

 

 

一般的,參數傳遞可以通過建立一個結構體,從而利用第四個參數,將所有要用到的參數傳遞給線程函數,代碼實例如下:

  1、定義結構體

     

1 struct  THreadTest
2     {
3         int a;
4         int b;
5     };

2、聲明線程執行函數

     

static DWORD WINAPI Thread1(LPVOID lpParameter);

  以上兩步在頭文件中進行,接下來,編寫創建線程函數和完成線程函數體

3、聲明線程

  

View Code
1 THreadTest *mythreadTest=new THreadTest();
2     mythreadTest->a=5;//給參數賦值
3     mythreadTest->b=6;
4      m_thread=CreateThread(NULL,0,Thread1,mythreadTest,0,NULL);//創建線程

4、編寫線程函數體,取出需要用到的參數進行計算

   

DWORD WINAPI CTestThreadDlg::Thread1(LPVOID lpParameter)
{
	THreadTest* mythread=(THreadTest*)lpParameter;//獲取參數結構體
	CString print;
	print.Format("%d",mythread->a);
	mythread->a;
	//m_btn.SetWindowText("test");
	AfxMessageBox(print);
	return 0;
}

  

  


免責聲明!

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



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