我對windows執行緒api有一種恐怖的感覺,那是因為在以前第一次接觸它的時候是通過vb,好吧,就是vb,在他的開發環境中做子類化或者多執行緒程式設計時,ide總會莫名其妙經常崩潰,以至於後面繼續是哪怕改了乙個字元,執行時都要先儲存一下,因為這個ide可沒有自動儲存功能。
但說回來,並不是api恐怖,而是ide恐怖。
見名知意,這是建立執行緒的函式,如果函式成功,則返回新執行緒的控制代碼。
handle createthread
( lpsecurity_attributes lpthreadattributes,
size_t dwstacksize,
lpthread_start_routine lpstartaddress,
__drv_aliasesmem lpvoid lpparameter,
dword dwcreationflags,
lpdword lpthreadid
);
引數介紹:
lpthreadattributes
指向security_attributes 結構,表示執行緒核心物件的安全屬性,一般傳入null就行,表示使用預設設定。
dwstacksize
執行緒棧空間大小。傳入0表示使用預設大小。
lpstartaddress
執行緒執行的函式位址,就是執行緒跑的**段在哪個函式中。
lpparameter
執行緒函式的引數
dwcreationflags
這個引數為0表示執行緒建立後馬上就可以進行排程,如果為create_suspended則表示執行緒建立後暫停執行,直到呼叫resumethread()。
lpthreadid
用於獲取返回的執行緒的id,傳入null表示不需要返回該執行緒id號。
還有兩個建立執行緒的函式是_beginthread()或_beginthreadex(),自行了解一下。
我們知道在做乙個耗時較長的任務時,需要開啟新執行緒,否則會阻塞後面**執行,引起介面未響應。
下面簡單做乙個示例,開啟乙個執行緒,這個執行緒每隔1秒列印一次,一共列印5次。
.386
.model flat,stdcall
option casemap:none
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
includelib c:\masm32\lib\user32.lib
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\kernel32.lib
include c:\masm32\include\msvcrt.inc
includelib c:\masm32\lib\msvcrt.lib
winmain proto :dword
.data
classname db "mywindowclass",0
buttonclassname db "button",0
buttontitle db "開啟執行緒",0
hellogui db "hellogui",0
message db "完成",0
messagetitle db "提示",0
outmessage db "第%d次"
.data?
hinstance hinstance ?
hwindowhdc hdc ?
hbutton hwnd ?
hwindow hwnd ?
threadid dword ?
.const
buttonid equ 1
.code
start:
invoke getmodulehandle, null
mov hinstance,eax
invoke winmain, hinstance
invoke exitprocess, eax
winmain proc hinst:hinstance
local wc:wndclas***
local msg:msg
mov wc.cbsize,sizeof wndclas***
mov wc.style, cs_hredraw or cs_vredraw
mov wc.lpfnwndproc, offset wndproc
mov wc.cbcl***tra,null
mov wc.cbwndextra,null
push hinstance
pop wc.hinstance
mov wc.hbrbackground,color_window+1
mov wc.lpszmenuname,null
mov wc.lpszclassname,offset classname
mov wc.hicon,eax
mov wc.hiconsm,eax
invoke loadcursor,null,idc_arrow
mov wc.hcursor,eax
invoke registerclas***, addr wc
invoke createwindowex,null,\
addr classname,\
0,\
0,\
300,\
300,\
null,\
null,\
hinst,\
null
mov hwindow,eax
invoke createwindowex,null,addr buttonclassname,addr buttontitle, ws_tabstop or ws_visible or ws_child or bs_defpushbutton ,\
0,0,100,100,hwindow,buttonid,null,null
mov hbutton,eax
invoke getdc,eax
mov hwindowhdc,eax
invoke showwindow, hwindow,sw_showdefault
invoke updatewindow, hwindow
.while true
invoke getmessage, addr msg,null,0,0
.break .if (!eax)
invoke translatemessage, addr msg
invoke dispatchmessage, addr msg
.endw
mov eax,msg.wparam
ret
winmain endp
printthread proc num:dword
invoke crt_printf, addr outmessage,num
.while num>0
sub num,1
invoke sleep,1000
invoke crt_printf, addr outmessage,num
.endw
invoke messagebox,null,addr message,addr messagetitle,mb_ok
retprintthread endp
wndproc proc hwnd:hwnd, umsg:uint, wparam:wparam, lparam:lparam
local strrect:rect
.if umsg == wm_lbuttondown
mov strrect.right,100
mov strrect.bottom,100
mov strrect.left,0
mov strrect.top,0
invoke drawtext,hwindowhdc, addr hellogui,8,addr strrect,dt_vcenter
.elseif umsg ==wm_command
mov eax,wparam
.if ax == buttonid
mov eax,offset printthread
invoke createthread,null,null,eax,5,0,addr threadid
invoke closehandle,eax
.endif
.else
invoke defwindowproc,hwnd,umsg,wparam,lparam
ret.endif
ret
wndproc endp
end start
如果在主線程開啟迴圈列印的話,視窗就會無法拖動,但如果在新執行緒執行的話,視窗就可以拖動了。
WIN32多執行緒
win32多執行緒學習 1.執行緒建立 handle createthread lpsecurity attributes lpthreadattributes,dword dwstacksize,lpthread start routine lpstartaddress,lpvoid lppara...
Win32建立多執行緒
win32建立多執行緒,貼下 define win32 lean and mean include include include include include include include include include define max threads 3 dword winapi pr...
win32多執行緒程式設計
使用3個執行緒完成6個任務,工作的執行是靠呼叫sleep 來模擬,時間長度是隨機給予的,只要乙個執行緒結束,就會有另乙個執行緒被產生。taskques.cpp 定義控制台應用程式的入口點。include stdafx.h include include include define win32 le...