detach調(diào)用之后,目標(biāo)線程就成為了守護(hù)線程,駐留后臺(tái)運(yùn)行,與之關(guān)聯(lián)的std::thread對(duì)象失去對(duì)目標(biāo)線程的關(guān)聯(lián),無(wú)法再通過(guò)std::thread對(duì)象取得該線程的控制權(quán)。當(dāng)線程主函數(shù)執(zhí)行完之后,線程就結(jié)束了,運(yùn)行時(shí)庫(kù)負(fù)責(zé)清理與該線程相關(guān)的資源。
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的豐城網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
當(dāng)一個(gè)thread對(duì)象到達(dá)生命期終點(diǎn)而關(guān)聯(lián)線程還沒有結(jié)束時(shí),則thread對(duì)象取消與線程之間的關(guān)聯(lián),目標(biāo)線程線程則變?yōu)榉蛛x線程繼續(xù)運(yùn)行。
當(dāng)調(diào)用join函數(shù)時(shí),調(diào)用線程阻塞等待目標(biāo)線程終止,然后回收目標(biāo)線程的資源。
C語(yǔ)言中,函數(shù)調(diào)用的一般形式為:
函數(shù)名(實(shí)際參數(shù)表)
對(duì)無(wú)參函數(shù)調(diào)用時(shí)則無(wú)實(shí)際參數(shù)表。實(shí)際參數(shù)表中的參數(shù)可以是常數(shù)、變量或其它構(gòu)造類型數(shù)據(jù)及表達(dá)式。各實(shí)參之間用逗號(hào)分隔。
#includestdio.h
int?fun(int?x,?int?y);?//?函數(shù)聲明,如果函數(shù)寫在被調(diào)用處之前,可以不用聲明
void?main()
{
int?a=1,?b=2,?c;
c?=?fun(a,?b);?//?函數(shù)的調(diào)用,調(diào)用自定義函數(shù)fun,其中a,b為實(shí)際參數(shù),傳遞給被調(diào)用函數(shù)的輸入值
}
//?自定義函數(shù)fun
int?fun(int?x,?int?y)??//?函數(shù)首部
{??//?{}中的語(yǔ)言為函數(shù)體
return?xy???x?:?y;??//?返回x和y中較大的一個(gè)數(shù)
}
擴(kuò)展資料
C語(yǔ)言中不允許作嵌套的函數(shù)定義。因此各函數(shù)之間是平行的,不存在上一級(jí)函數(shù)和下一級(jí)函數(shù)的問(wèn)題。但是C語(yǔ)言允許在一個(gè)函數(shù)的定義中出現(xiàn)對(duì)另一個(gè)函數(shù)的調(diào)用。
這樣就出現(xiàn)了函數(shù)的嵌套調(diào)用。即在被調(diào)函數(shù)中又調(diào)用其它函數(shù)。這與其它語(yǔ)言的子程序嵌套的情形是類似的。其關(guān)系可表示如圖。
圖表示了兩層嵌套的情形。其執(zhí)行過(guò)程是:執(zhí)行main函數(shù)中調(diào)用a函數(shù)的語(yǔ)句時(shí),即轉(zhuǎn)去執(zhí)行a函數(shù),在a函數(shù)中調(diào)用b 函數(shù)時(shí),又轉(zhuǎn)去執(zhí)行b函數(shù),b函數(shù)執(zhí)行完畢返回a函數(shù)的斷點(diǎn)繼續(xù)執(zhí)行,a函數(shù)執(zhí)行完畢返回main函數(shù)的斷點(diǎn)繼續(xù)執(zhí)行。
參考資料:函數(shù)調(diào)用_百度百科
你在開了線程后,馬上調(diào)用一個(gè)waitforsingleobject,具體用法網(wǎng)上查,大概就是等待線程執(zhí)行完,由于不能單步調(diào)試進(jìn)入線程函數(shù),所以就只有在線程函數(shù)中用printf輸出相關(guān)信息來(lái)達(dá)到調(diào)試的目的。
·線程創(chuàng)建
函數(shù)原型:int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void),void *restrict arg);
返回值:若是成功建立線程返回0,否則返回錯(cuò)誤的編號(hào)。
形式參數(shù):pthread_t *restrict tidp要?jiǎng)?chuàng)建的線程的線程id指針;
const pthread_attr_t *restrict attr創(chuàng)建線程時(shí)的線程屬性;
void* (start_rtn)(void)返回值是void類型的指針函數(shù);
void *restrict arg start_rtn的形參。 =====這個(gè)地方就可以傳參數(shù),
注意,這個(gè)地方是個(gè)指針,要想傳多個(gè)參數(shù),可以定義一個(gè)結(jié)構(gòu)體,把要傳的參數(shù)包起來(lái),傳結(jié)構(gòu)體的地址就ok
this.Invoke((EventHandler)(delegate
{
READ1();
}));
this.Invoke((EventHandler)(delegate
{
READ2();
}));
函數(shù)內(nèi)部調(diào)用:HANDLE hThread1=CreateThread(NULL,0,Fun1Proc,(LPVOID)this,0,NULL);
HANDLE hThread0=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread,m_prog,0,NULL);
CloseHandle(hThread0);
CloseHandle(hThread1);)
Sleep(100);
}
DWORD WINAPI ListenThreadFunc(LPVOID lpParameter)
{
CTestDlg *pDlg=(CTestDlg *)lpParameter;//把傳過(guò)來(lái)的參數(shù)再?gòu)?qiáng)制轉(zhuǎn)換回CTestDlg *類型
pDlg-GetDlgItem(IDC_EDIT1)-SetWindowText("abc");//就可以了
}
thread(CProgressCtrl *pro)//更新進(jìn)度條
{
int i=0;
for(;i100;)
{
pro-SetPos(i);
Sleep(200);
i=i+5;
if(i94)
i=1;
else
;
if(stopmark==1)
{
pro-SetPos(0);
break;
}
}
return 0;
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)//調(diào)用程序
{
CCOTSDlg *pDlg=(CCOTSDlg *)lpParameter;//把傳過(guò)來(lái)的參數(shù)再?gòu)?qiáng)制轉(zhuǎn)換回CTestDlg *類型
pDlg-Modeprocess();//就可以了
return 0;
}
控制多線程,開啟、暫停、繼續(xù)、終止(實(shí)例)
我們這些文盲以前一聽到多線程這么幾個(gè)字,以為非常的高級(jí),難搞??!昨天翻閱了一下MSDN,發(fā)現(xiàn),其實(shí)也沒那么難,關(guān)鍵在于全面的理解,也許是用多了API了,慢慢的會(huì)看懂了一些?。?!
我總結(jié)了幾個(gè)易于理解的出來(lái),一起共享!
我們先不講如何使用線程過(guò)程中的參數(shù);先來(lái)個(gè)簡(jiǎn)單的;下篇文章我們?cè)谥v如何使用線程過(guò)程的參數(shù)來(lái)實(shí)現(xiàn)交互!
AfxBeginThread 創(chuàng)建線程
函數(shù)原型:
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
該函數(shù)用于創(chuàng)建線程;返回值類型為:CWinThread*,一個(gè)指向新線程的線程對(duì)象
參數(shù):
pfnThreadProc
線程的入口函數(shù),聲明一定要如下: UINT MyThreadFunction( LPVOID pParam );
pParam :
傳遞入線程的參數(shù),注意它的類型為:LPVOID,所以我們可以傳遞一個(gè)結(jié)構(gòu)體入線程.
nPriority :
線程的優(yōu)先級(jí),一般設(shè)置為 0 .讓它和主線程具有共同的優(yōu)先級(jí).
nStackSize :
指定新創(chuàng)建的線程的棧的大小.如果為 0,新創(chuàng)建的線程具有和主線程一樣的大小的棧
dwCreateFlags :
指定創(chuàng)建線程以后,線程有怎么樣的標(biāo)志.可以指定兩個(gè)值:
CREATE_SUSPENDED :
線程創(chuàng)建以后,會(huì)處于掛起狀態(tài),直到調(diào)用:ResumeThread
0 :
創(chuàng)建線程后就開始運(yùn)行.
lpSecurityAttrs :
指向一個(gè) SECURITY_ATTRIBUTES 的結(jié)構(gòu)體,用它來(lái)標(biāo)志新創(chuàng)建線程的安全性.如果為 NULL ,
那么新創(chuàng)建的線程就具有和主線程一樣的安全性.
如果要在線程內(nèi)結(jié)束線程,可以在線程內(nèi)調(diào)用 AfxEndThread.
結(jié)束線程的兩種方式
當(dāng)你在后臺(tái)用線程來(lái)打印一些圖形時(shí).有時(shí)在打印一部分后,你希望可以停下來(lái),那么此如何讓線程停止呢.下
面會(huì)詳細(xì)的向你解釋要結(jié)束線程的兩種方式
1 : 這是最簡(jiǎn)單的方式,也就是讓線程函數(shù)執(zhí)行完成,此時(shí)線程正常結(jié)束.它會(huì)返回一個(gè)值,一般0是成功結(jié)束,
當(dāng)然你可以定義自己的認(rèn)為合適的值來(lái)代表線程成功執(zhí)行.在線程內(nèi)調(diào)用AfxEndThread將會(huì)直接結(jié)束線程,此時(shí)線
程的一切資源都會(huì)被回收.
2 : 如果你想讓別一個(gè)線程B來(lái)結(jié)束線程A,那么,你就需要在這兩個(gè)線程中傳遞信息.
不管是工作者線程還是界面線程,如果你想在線程結(jié)束后得到它的確結(jié)果,那么你可以調(diào)用:
::GetExitCodeThread函數(shù)
------------------------------------------------------------------------------------------------------------------------
SuspendThread 掛起(暫停)線程
函數(shù)原型:
DWORD SuspendThread(
HANDLE hThread //指定線程的句柄
);
這個(gè)函數(shù)的返回值:DWORD類型,如果這個(gè)函數(shù)成功,返回值是線程的前停止計(jì)數(shù),否則,它(表示)- 1。
-------------------------------------------------------------------------------------------------------------------------------
ResumeThread 繼續(xù)執(zhí)行線程
函數(shù)原型:
DWORD ResumeThread(
HANDLE hThread //指定線程的句柄
);
這個(gè)函數(shù)的返回值:DWORD類型,如果這個(gè)函數(shù)成功,返回值是線程的前停止計(jì)數(shù),否則,它(表示)- 1。
----------------------------------------------------------------------------------------------------------------------------------
WaitForSingleObject 終止線程
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
參數(shù)
hHandle
是一個(gè)事件的句柄
dwMilliseconds
在指定暫停區(qū)間,在毫秒。這個(gè)函數(shù)將返回如果區(qū)間流逝,即使該對(duì)象的狀態(tài)是nonsignaled。如果dwMilliseconds是零,功能測(cè)試對(duì)象的狀態(tài)和回報(bào)。如果dwMilliseconds是INFINITE的,這個(gè)函數(shù)的暫停區(qū)間從不流逝。