Win32彙編系列八,多執行緒

2021-10-09 11:34:56 字數 4802 閱讀 3982

我對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...