你問題中函數(shù)_beginthread是windows下創(chuàng)建線程并立即執(zhí)行的函數(shù):
嘉峪關(guān)網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)公司2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
一、直接運行至程序結(jié)束或調(diào)用_endthread函數(shù)結(jié)束進程。
二、三個參數(shù)分別是執(zhí)行的函數(shù)、新線程堆棧大?。ㄒ话銈?)、傳遞給新線程的參數(shù)列表(不需要就傳NULL)。
三、該函數(shù)需要頭文件process.h。
四、調(diào)用函數(shù)mousemove寫在main下面,要先申明。
五、main是主線程,在創(chuàng)建進程之后應(yīng)使用循環(huán)、輸入或其他函數(shù)確保主線程運行。否則像你上面這樣寫,創(chuàng)建子線程后,主線程就運行結(jié)束了。
六、子線程函數(shù)死循環(huán)定位鼠標,至少給個結(jié)束方式吧。
下面是按你代碼寫的演示,按任意鍵結(jié)束程序:
#includestdio.h
#includewindows.h
#includeprocess.h
#includeconio.h
void mousemove();
int main()
{
_beginthread(mousemove,0,NULL);
getch();
printf("主進程結(jié)束\n");
return 0;
}
void mousemove()
{
while(1) {
? SetCursorPos(800,600);
? printf("子線程執(zhí)行中\(zhòng)n");
}
}
可以不用。用C語言的計數(shù)器就好,不過比較麻煩。。。
如果用多線程,你首先需要了解線程的含義,另外編譯的時候需要加參數(shù),
編程的部分比較簡單,頭文件需要:
#include process.h
然后創(chuàng)建線程使用函數(shù):
_beginthread()
銷毀線程函數(shù):
_endthread()
TC3.0也就是增加了個鼠標,修改了一些bug,更新了一下界面而已,編譯器是和2.0一樣的。
1、添加線程相關(guān)的頭文件:#includepthread.h
2、線程創(chuàng)建函數(shù)是pthread_create()函數(shù),該函數(shù)的原型為:
int?pthread_create(pthread_t?*thread,pthread_attr_t?*attr,void*?(*start_routine)(void*),void?*arg);
3、線程退出函數(shù)是pthread_exit()函數(shù),該函數(shù)的原型為:
void?pthread_exit(void?*retval);
創(chuàng)建線程的示例程序如下:
/*
**程序說明:創(chuàng)建線程函數(shù)pthread_create()函數(shù)的使用。
*/
#include?stdio.h
#include?pthread.h
#include?unistd.h
#include?stdlib.h
#include?string.h
//打印標識符的函數(shù)
void?print_ids(const?char?*str)
{
pid_t?pid; //進程標識符
pthread_t?tid; //線程標識符
pid=getpid(); //獲得進程號
tid=pthread_self(); //獲得線程號
printf("%s?pid:%u?tid:%u?(0x%x)\n",
str,(unsigned?int)pid,(unsigned?int)tid,(unsigned?int)tid);?//打印進程號和線程號
}
//線程函數(shù)
void*?pthread_func(void?*arg)
{
print_ids("new?thread:"); //打印新建線程號
return?((void*)0);
}
//主函數(shù)
int?main()
{
int?err;
pthread_t?ntid; //線程號
err=pthread_create(ntid,NULL,pthread_func,NULL); //創(chuàng)建一個線程
if(err?!=?0)
{
printf("create?thread?failed:%s\n",strerror(err));
exit(-1);
}
print_ids("main?thread:"); //打印主線程號
sleep(2);
return?0;
}
是線程
多線程概述
進程和線程都是操作系統(tǒng)的概念。進程是應(yīng)用程序的執(zhí)行實例,每個進程是由私有的虛擬地址空間、代碼、數(shù)據(jù)和其它各種系統(tǒng)資源組成,進程在運行過程中創(chuàng)建的資源隨著進程的終止而被銷毀,所使用的系統(tǒng)資源在進程終止時被釋放或關(guān)閉。
線程是進程內(nèi)部的一個執(zhí)行單元。系統(tǒng)創(chuàng)建好進程后,實際上就啟動執(zhí)行了該進程的主執(zhí)行線程,主執(zhí)行線程以函數(shù)地址形式,比如說main或WinMain函數(shù),將程序的啟動點提供給Windows系統(tǒng)。主執(zhí)行線程終止了,進程也就隨之終止。
每一個進程至少有一個主執(zhí)行線程,它無需由用戶去主動創(chuàng)建,是由系統(tǒng)自動創(chuàng)建的。用戶根據(jù)需要在應(yīng)用程序中創(chuàng)建其它線程,多個線程并發(fā)地運行于同一個進程中。一個進程中的所有線程都在該進程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變量和系統(tǒng)資源,所以線程間的通訊非常方便,多線程技術(shù)的應(yīng)用也較為廣泛。
多線程可以實現(xiàn)并行處理,避免了某項任務(wù)長時間占用CPU時間。要說明的一點是,目前大多數(shù)的計算機都是單處理器(CPU)的,為了運行所有這些線程,操作系統(tǒng)為每個獨立線程安排一些CPU時間,操作系統(tǒng)以輪換方式向線程提供時間片,這就給人一種假象,好象這些線程都在同時運行。由此可見,如果兩個非常活躍的線程為了搶奪對CPU的控制權(quán),在線程切換時會消耗很多的CPU資源,反而會降低系統(tǒng)的性能。這一點在多線程編程時應(yīng)該注意。
Win32 SDK函數(shù)支持進行多線程的程序設(shè)計,并提供了操作系統(tǒng)原理中的各種同步、互斥和臨界區(qū)等操作。Visual C++ 6.0中,使用MFC類庫也實現(xiàn)了多線程的程序設(shè)計,使得多線程編程更加方便。
三、Win32 API對多線程編程的支持
Win32 提供了一系列的API函數(shù)來完成線程的創(chuàng)建、掛起、恢復、終結(jié)以及通信等工作。下面將選取其中的一些重要函數(shù)進行說明。
1、HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);
該函數(shù)在其調(diào)用進程的進程空間里創(chuàng)建一個新的線程,并返回已建線程的句柄,其中各參數(shù)說明如下:
lpThreadAttributes:指向一個 SECURITY_ATTRIBUTES 結(jié)構(gòu)的指針,該結(jié)構(gòu)決定了線程的安全屬性,一般置為 NULL;
dwStackSize:指定了線程的堆棧深度,一般都設(shè)置為0;
lpStartAddress:表示新線程開始執(zhí)行時代碼所在函數(shù)的地址,即線程的起始地址。一般情況為(LPTHREAD_START_ROUTINE)ThreadFunc,ThreadFunc 是線程函數(shù)名;
lpParameter:指定了線程執(zhí)行時傳送給線程的32位參數(shù),即線程函數(shù)的參數(shù);
dwCreationFlags:控制線程創(chuàng)建的附加標志,可以取兩種值。如果該參數(shù)為0,線程在被創(chuàng)建后就會立即開始執(zhí)行;如果該參數(shù)為CREATE_SUSPENDED,則系統(tǒng)產(chǎn)生線程后,該線程處于掛起狀態(tài),并不馬上執(zhí)行,直至函數(shù)ResumeThread被調(diào)用;
lpThreadId:該參數(shù)返回所創(chuàng)建線程的ID;如果創(chuàng)建成功則返回線程的句柄,否則返回NULL。
2、DWORD SuspendThread(HANDLE hThread);
該函數(shù)用于掛起指定的線程,如果函數(shù)執(zhí)行成功,則線程的執(zhí)行被終止。
3、DWORD ResumeThread(HANDLE hThread);
該函數(shù)用于結(jié)束線程的掛起狀態(tài),執(zhí)行線程。
4、VOID ExitThread(DWORD dwExitCode);
該函數(shù)用于線程終結(jié)自身的執(zhí)行,主要在線程的執(zhí)行函數(shù)中被調(diào)用。其中參數(shù)dwExitCode用來設(shè)置線程的退出碼。
5、BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
一般情況下,線程運行結(jié)束之后,線程函數(shù)正常返回,但是應(yīng)用程序可以調(diào)用TerminateThread強行終止某一線程的執(zhí)行。各參數(shù)含義如下:
hThread:將被終結(jié)的線程的句柄;
dwExitCode:用于指定線程的退出碼。
使用TerminateThread()終止某個線程的執(zhí)行是不安全的,可能會引起系統(tǒng)不穩(wěn)定;雖然該函數(shù)立即終止線程的執(zhí)行,但并不釋放線程所占用的資源。因此,一般不建議使用該函數(shù)。
6、BOOL PostThreadMessage(DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam);
該函數(shù)將一條消息放入到指定線程的消息隊列中,并且不等到消息被該線程處理時便返回。
idThread:將接收消息的線程的ID;
Msg:指定用來發(fā)送的消息;
wParam:同消息有關(guān)的字參數(shù);
lParam:同消息有關(guān)的長參數(shù);
調(diào)用該函數(shù)時,如果即將接收消息的線程沒有創(chuàng)建消息循環(huán),則該函數(shù)執(zhí)行失敗。
通常使用CreateThread函數(shù)來創(chuàng)建新的線程.(Unix下使用pthread_create函數(shù))
首先指出,線程與線程之間,是并列關(guān)系,不會存在"父子線程"的概念.
在Windows平臺下,CreateThread函數(shù)包含在 Windows.h 文件內(nèi),包含此文件即可正常使用.
以下為CreateThread函數(shù)的聲明:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//指向安全性屬性描述結(jié)構(gòu)體的
//指針,通??梢院雎缘?
SIZE_T dwStackSize,//指定新線程初始的棧大小,若不關(guān)心,可以用0填充,來要求使用
//默認值
LPTHREAD_START_ROUTINE lpStartAddress,//用來充當線程的函數(shù)的指針.
LPVOID lpParameter,//要傳遞給函數(shù)的參數(shù),這個值本身就是那個參數(shù),而不是參數(shù)的地址
DWORD dwCreationFlags,//創(chuàng)建的方式,0表示正常,創(chuàng)建后立即開始運行
LPDWORD lpThreadId//用來接受函數(shù)反饋的線程ID的指針.
);
用來充當新的線程的函數(shù)格式:
DWORD WINAPI ThreadProc(LPVOID);
CreateThread函數(shù)若成功了,返回新線程的句柄,若失敗了,則返回NULL.
若用CREATE_SUSPENDED填充dwCreation Flags則創(chuàng)建的線程先掛起來,并不直接開始運行,要用ResumeThread函數(shù)恢復線程,才能繼續(xù)運行.
當前題目:c語言thread函數(shù) Thread函數(shù)
網(wǎng)站網(wǎng)址:http://muchs.cn/article16/docdsgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、全網(wǎng)營銷推廣、品牌網(wǎng)站設(shè)計、營銷型網(wǎng)站建設(shè)、網(wǎng)站制作、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)