導航:首頁 > 編程語言 > win32api多線程編程

win32api多線程編程

發布時間:2022-09-27 07:45:08

1. 編寫一個Windows多線程式控制制台程序,求大神們幫幫忙,小弟在此先行謝過了,要求在下面補充

在MFC里直接用AfxBeginThread就可以了啊。
使用CWinThread*聲明一個線程,然後定義一個線程函數,在要開啟線程的地方使用AfxBeginThread這個線程函數就可以了~
例如:
CWinThread* pThreadTest;

UINT _TestThread(LPVOID lparam)
{
...//sth you want to do.

return 0;
}

//在適當地方開啟線程
pThreadTest = ::AfxBeginThread(_TestThread,this);

2. C++ (Win32API) 子窗口消息,線程問題

我說說我知道的,不一定全對,你斟酌的看:
第一:CreateWindow創建多個子窗口(比如按鈕),按鈕是系統自己定義好點處理函數,你插手不進去,你可以自己SendMessage改變其狀態,或者按鈕對於你對他的行為給你的主窗口發送WM_COMMAND消息來通知你發生了什麼事件。

第二:想不影響就CreateThread建一個線程處理子窗口中很復雜的問題,但是你自己通過同步機制讓其能有條理了,事件、互斥、信號量等等都行。

3. 怎麼樣學習熟練win32 api需要掌握哪些知識點、要點

以下是個人見解(一家之言哈):
學習win32編程掌握API不是目的,而是過程。不要單純為了學習API而學習,而是學習應用程序的開發過程中逐漸學習這些函數。不談MFC的話,比如要做win32開發有圖形界面的程序,就要學會創建窗口,彈出窗口,彈出對話框以及對窗口消息獲取,傳遞,處理等等。這些過程就會學到很多API函數。接著如果要學習網路間程序通信,就去學習網路編程里的一系列API函數。如果要學習多線程開發,就去學習創建線程的API,線程同步API等等。總之:學API不是目的,而是過程,學完了API是要為我們的應用程序開發服務的。

4. Win32API函數HeapAlloc為線程參數的數據開辟空間

我們首先用Win32API函數HeapAlloc為線程參數的數據開辟空間,該函數在指定的堆上開辟一塊內存空間。函數HeapAlloc分配的內存要用函數HeapFree來釋放。CRT中的內存管理函數完全可以用Win32API中的內存管理函數所代替。在for循環里創建所有線程後,主線程會繼續執行,由於我們在for後面調用了函數WaitForSingleObject來循環等待每一個線程的結束,因此主線程就一直在這里等待所有子線程運行結束,並且每當一個線程結束,就關閉其線程對象的句柄以釋放資源。函數WaitForSingleObject用了參數INFINITE,表示無限等待的意思,只要子線程不結束,調用(該函數的)線程將一直等待下去。在線程函數ThreadProc中,只是把傳入的線程參數的結構體欄位列印到控制台上。函數StringCchPrintf是sprintf的替代者,StringCchLength是strlen的替代者,CRT中的函數完全可以用Win32API中的字元串處理函數所代替。Win32 API函數GetStdHandle用來獲取標准輸出設備的句柄,最後由WriteConsole代替了CRT庫中的printf函數,來列印輸出到控制台窗口。這兩個函數都是Win32中關於控制台編程的API函數。再次強調,CreateThread創建的線程函數中最好不要使用CRT庫函數,我們完全可以用對應的Win32API函數來替代CRT庫函數。

5. 淺談Windows多線程編程幾個常見問題

linux下線程的實現,linux的線程編程有兩個庫pthread和pth,對於pthread的實現是內核方式的實現,每個線程在kernel中都有task結構與之對應,也就是說用ps命令行是可以看見多個線程,線程的調度也是由內核中的schele進行的。
再來看看Windows的多線程,Windows NT和Windows95是一個搶先型多任務、多線程操作系統。因為它使用搶先型的多任務,所以它擁有與UNIX同樣平滑的處理和進程獨立。多線程就更進一步。一個獨立的程序默認是使用一個線程,不過它可以將自己分解為幾個獨立的線程來執行,例如,其中的一個線程可以發送一個文件到列印機,而另一個可以響應用戶的輸入。這個簡單的程序設計修改可以明顯減少用戶等待的時間,讓用戶無需擔心長時間的計算、重繪屏幕、文件讀寫等帶來的不便。
多線程還可以讓你從許多高端的多處理器NT機器中得到好處。例如,你購買了一個高級的RISC機器,可以使用多達10個CPU晶元,但在開始的時候你只購買了一個CPU。你寫了一個簡單的Mandelbrot set程序,你發現需要15秒的時間來重新繪制Mandelbrot set的畫面。
那麼,Windows平台的線程和類Unix平台(包括Linux)的進程的區別是什麼呢?
熟悉WIN32編程的人一定知道,WIN32的進程管理方式與UNIX上有著很大區別,在UNIX里,只有進程的概念,但在WIN32里卻還有一個「線程」的概念,那麼UNIX和WIN32在這里究竟有著什麼區別呢?
UNIX里的fork是七十年代UNIX早期的開發者經過長期在理論和實踐上的艱苦探索後取得的成果,一方面,它使操作系統在進程管理上付出了最小的代價,另一方面,又為程序員提供了一個簡潔明了的多進程方法。
WIN32里的進程/線程是繼承自OS/2的。在WIN32里,「進程」是指一個程序,而「線程」是一個「進程」里的一個執行「線索」。從核心上講,WIN32的多進程與UNIX並無多大的區別,在WIN32里的線程才相當於UNIX的進程,是一個實際正在執行的代碼。但是,WIN32里同一個進程里各個線程之間是共享數據段的。這才是與UNIX的進程最大的不同。
對於多任務系統,共享數據區是必要的,但也是一個容易引起混亂的問題,在WIN32下,一個程序員很容易忘記線程之間的數據是共享的這一情況,一個線程修改過一個變數後,另一個線程卻又修改了它,結果引起程序出問題。但在UNIX下,由於變數本來並不共享,而由程序員來顯式地指定要共享的數據,使程序變得更清晰與安全。

6. 關於線程問題

多線程概述
進程和線程都是操作系統的概念。進程是應用程序的執行實例,每個進程是由私有的虛擬地址空間、代碼、數據和其它各種系統資源組成,進程在運行過程中創建的資源隨著進程的終止而被銷毀,所使用的系統資源在進程終止時被釋放或關閉。
線程是進程內部的一個執行單元。系統創建好進程後,實際上就啟動執行了該進程的主執行線程,主執行線程以函數地址形式,比如說main或WinMain函數,將程序的啟動點提供給Windows系統。主執行線程終止了,進程也就隨之終止。
每一個進程至少有一個主執行線程,它無需由用戶去主動創建,是由系統自動創建的。用戶根據需要在應用程序中創建其它線程,多個線程並發地運行於同一個進程中。一個進程中的所有線程都在該進程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變數和系統資源,所以線程間的通訊非常方便,多線程技術的應用也較為廣泛。
多線程可以實現並行處理,避免了某項任務長時間佔用CPU時間。要說明的一點是,目前大多數的計算機都是單處理器(CPU)的,為了運行所有這些線程,操作系統為每個獨立線程安排一些CPU時間,操作系統以輪換方式向線程提供時間片,這就給人一種假象,好象這些線程都在同時運行。由此可見,如果兩個非常活躍的線程為了搶奪對CPU的控制權,在線程切換時會消耗很多的CPU資源,反而會降低系統的性能。這一點在多線程編程時應該注意。
Win32 SDK函數支持進行多線程的程序設計,並提供了操作系統原理中的各種同步、互斥和臨界區等操作。Visual C++ 6.0中,使用MFC類庫也實現了多線程的程序設計,使得多線程編程更加方便。
Win32 API對多線程編程的支持

Win32 提供了一系列的API函數來完成線程的創建、掛起、恢復、終結以及通信等工作。下面將選取其中的一些重要函數進行說明。

1、HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);

該函數在其調用進程的進程空間里創建一個新的線程,並返回已建線程的句柄,其中各參數說明如下:
lpThreadAttributes:指向一個 SECURITY_ATTRIBUTES 結構的指針,該結構決定了線程的安全屬性,一般置為 NULL;
dwStackSize:指定了線程的堆棧深度,一般都設置為0;
lpStartAddress:表示新線程開始執行時代碼所在函數的地址,即線程的起始地址。一般情況為(LPTHREAD_START_ROUTINE)ThreadFunc,ThreadFunc 是線程函數名;
lpParameter:指定了線程執行時傳送給線程的32位參數,即線程函數的參數;
dwCreationFlags:控制線程創建的附加標志,可以取兩種值。如果該參數為0,線程在被創建後就會立即開始執行;如果該參數為CREATE_SUSPENDED,則系統產生線程後,該線程處於掛起狀態,並不馬上執行,直至函數ResumeThread被調用;
lpThreadId:該參數返回所創建線程的ID;如果創建成功則返回線程的句柄,否則返回NULL。

2、DWORD SuspendThread(HANDLE hThread);
該函數用於掛起指定的線程,如果函數執行成功,則線程的執行被終止。

3、DWORD ResumeThread(HANDLE hThread);
該函數用於結束線程的掛起狀態,執行線程。

4、VOID ExitThread(DWORD dwExitCode);
該函數用於線程終結自身的執行,主要在線程的執行函數中被調用。其中參數dwExitCode用來設置線程的退出碼。

5、BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
一般情況下,線程運行結束之後,線程函數正常返回,但是應用程序可以調用TerminateThread強行終止某一線程的執行。各參數含義如下:
hThread:將被終結的線程的句柄;
dwExitCode:用於指定線程的退出碼。
使用TerminateThread()終止某個線程的執行是不安全的,可能會引起系統不穩定;雖然該函數立即終止線程的執行,但並不釋放線程所佔用的資源。因此,一般不建議使用該函數。

6、BOOL PostThreadMessage(DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam);
該函數將一條消息放入到指定線程的消息隊列中,並且不等到消息被該線程處理時便返回。
idThread:將接收消息的線程的ID;
Msg:指定用來發送的消息;
wParam:同消息有關的字參數;
lParam:同消息有關的長參數;
調用該函數時,如果即將接收消息的線程沒有創建消息循環,則該函數執行失敗。

7. 求win32 多線程生產者和消費者程序

進程是應用程序的執行實例,每個進程是由私有的虛擬地址空間、代碼、數據和其它各種系統資源組成,進程在運行過程中創建的資源隨著進程的終止而被銷毀,所使用的系統資源在進程終止時被釋放或關閉。
線程是進程內部的一個執行單元。系統創建好進程後,實際上就啟動執行了該進程的主執行線程,主執行線程以函數地址形式,比如說main或WinMain函數,將程序的啟動點提供給Windows系統。主執行線程終止了,進程也就隨之終止。
每一個進程至少有一個主執行線程,它無需由用戶去主動創建,是由系統自動創建的。用戶根據需要在應用程序中創建其它線程,多個線程並發地運行於同一個進程中。一個進程中的所有線程都在該進程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變數和系統資源,所以線程間的通訊非常方便,多線程技術的應用也較為廣泛。
多線程可以實現並行處理,避免了某項任務長時間佔用CPU時間。要說明的一點是,目前大多數的計算機都是單處理器(CPU)的,為了運行所有這些線程,操作系統為每個獨立線程安排一些CPU時間,操作系統以輪換方式向線程提供時間片,這就給人一種假象,好象這些線程都在同時運行。由此可見,如果兩個非常活躍的線程為了搶奪對CPU的控制權,在線程切換時會消耗很多的CPU資源,反而會降低系統的性能。這一點在多線程編程時應該注意。
Win32 SDK函數支持進行多線程的程序設計,並提供了操作系統原理中的各種同步、互斥和臨界區等操作。Visual C++ 6.0中,使用MFC類庫也實現了多線程的程序設計,使得多線程編程更加方便。
Win32 API對多線程編程的支持

Win32 提供了一系列的API函數來完成線程的創建、掛起、恢復、終結以及通信等工作。下面將選取其中的一些重要函數進行說明。

1、HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);

該函數在其調用進程的進程空間里創建一個新的線程,並返回已建線程的句柄,其中各參數說明如下:
lpThreadAttributes:指向一個 SECURITY_ATTRIBUTES 結構的指針,該結構決定了線程的安全屬性,一般置為 NULL;
dwStackSize:指定了線程的堆棧深度,一般都設置為0;
lpStartAddress:表示新線程開始執行時代碼所在函數的地址,即線程的起始地址。一般情況為(LPTHREAD_START_ROUTINE)ThreadFunc,ThreadFunc 是線程函數名;
lpParameter:指定了線程執行時傳送給線程的32位參數,即線程函數的參數;
dwCreationFlags:控制線程創建的附加標志,可以取兩種值。如果該參數為0,線程在被創建後就會立即開始執行;如果該參數為CREATE_SUSPENDED,則系統產生線程後,該線程處於掛起狀態,並不馬上執行,直至函數ResumeThread被調用;
lpThreadId:該參數返回所創建線程的ID;如果創建成功則返回線程的句柄,否則返回NULL。

2、DWORD SuspendThread(HANDLE hThread);
該函數用於掛起指定的線程,如果函數執行成功,則線程的執行被終止。

3、DWORD ResumeThread(HANDLE hThread);
該函數用於結束線程的掛起狀態,執行線程。

4、VOID ExitThread(DWORD dwExitCode);
該函數用於線程終結自身的執行,主要在線程的執行函數中被調用。其中參數dwExitCode用來設置線程的退出碼。

5、BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
一般情況下,線程運行結束之後,線程函數正常返回,但是應用程序可以調用TerminateThread強行終止某一線程的執行。各參數含義如下:
hThread:將被終結的線程的句柄;
dwExitCode:用於指定線程的退出碼。
使用TerminateThread()終止某個線程的執行是不安全的,可能會引起系統不穩定;雖然該函數立即終止線程的執行,但並不釋放線程所佔用的資源。因此,一般不建議使用該函數。

6、BOOL PostThreadMessage(DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam);
該函數將一條消息放入到指定線程的消息隊列中,並且不等到消息被該線程處理時便返回。
idThread:將接收消息的線程的ID;
Msg:指定用來發送的消息;
wParam:同消息有關的字參數;
lParam:同消息有關的長參數;
調用該函數時,如果即將接收消息的線程沒有創建消息循環,則該函數執行失敗。
另外,站長團上有產品團購,便宜有保證

閱讀全文

與win32api多線程編程相關的資料

熱點內容
壓縮因子定義 瀏覽:968
cd命令進不了c盤怎麼辦 瀏覽:214
葯業公司招程序員嗎 瀏覽:974
毛選pdf 瀏覽:659
linuxexecl函數 瀏覽:727
程序員異地戀結果 瀏覽:374
剖切的命令 瀏覽:228
干什麼可以賺錢開我的世界伺服器 瀏覽:290
php備案號 瀏覽:990
php視頻水印 瀏覽:167
怎麼追程序員的女生 瀏覽:487
空調外壓縮機電容 瀏覽:79
怎麼將安卓變成win 瀏覽:459
手機文件管理在哪兒新建文件夾 瀏覽:724
加密ts視頻怎麼合並 瀏覽:775
php如何寫app介面 瀏覽:804
宇宙的琴弦pdf 瀏覽:396
js項目提成計算器程序員 瀏覽:944
pdf光子 瀏覽:834
自拍軟體文件夾名稱大全 瀏覽:328