;运行效果
;win32汇编环境,对线程的创建与操作示例一
;线程是主进程之外并行运行着的过程,很多的时候,我们需要一些运算保持运行,但又不能影响进程,这个时候就需要线程
;比如,在游戏外挂之中,需要每隔几秒判断角色的状态,需要不断的输出等,这个时候就需要另外开线程运行。如果不另外开线程,它会影响主进程的运行。
;比如,角色回城后,到了NPC面前,需要延时等待一下,这时候相当于暂停状态,又不能影响主进程的线程运行。要是让主进程暂停了,后果可不好。
;比如,在连接网络时,需要时间证明连接上了,但却不知道究竟需要多久,这时候不能让主进程连接,应该让线程连接,否则主进程会一直卡着等待结果。
;比如,在连接网络时,无法判断已经完成接收了数据包,这个时候就需要线程来监听判断,如果用主进程接收,遇到网络延迟严重或其它问题,数据包迟迟无法接收完,会把主进程卡住。
;同时,线程的并行运行,也体现了并行处理的概念,能更充分地利用好系统资源等等。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 自定义函数声明
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
.data
DlgName db "MyDialog",0
szCaption db "提示",0
szCheshi01 db "123",0
.data?
hInstance HINSTANCE ?
hWinMain dd ?
hThreadID01 dd ? ;线程句柄,可用来结束线程,判断线程还在不在等
.const
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 1000 ;图标
IDB01 equ 11 ;按钮控件标识符
IDB02 equ 12
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL
invoke ExitProcess,eax
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;线程函数
_Athread proc ;函数功能:把"123"这个字符串的第1个字母与第3个字母的位置调换来过,显示出"321"
pushad ;运行前建议先保存所有的寄存器值,退出时恢复
mov al,byte ptr [szCheshi01+2]
mov bl,byte ptr [szCheshi01]
mov byte ptr [szCheshi01],al
mov byte ptr [szCheshi01+2],bl
invoke MessageBox,NULL,addr szCheshi01,addr szCaption,MB_OK
popad
ret
_Athread endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.if uMsg == WM_INITDIALOG
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
.elseif uMsg == WM_COMMAND
mov eax,wParam
.if eax == IDB01
invoke CreateThread,NULL,0,offset _Athread,NULL,NULL,addr hThreadID01 ;创建线程
.endif
.elseif uMsg == WM_CLOSE
invoke CloseHandle,hThreadID01 ;退出程序前关闭线程
invoke EndDialog, hWnd,NULL
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
end start
;下面为rc文件内容
#include "resource.h" //提示缺少该文件,可以在资源里下载
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define ICO_MAIN 1000 //图标
#define IDB01 11
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON "Main.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义对话框
MyDialog DIALOG 10, 10, 140, 40
STYLE DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "对话框程序模版"
FONT 11, "宋体"
BEGIN
PUSHBUTTON "启动线程A", IDB01, 10,10,120,14
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>