iczelion tut15[3]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 jimgreen 的 blog

                invoke closehandle,eax
            .else
                invoke destroywindow,hwnd
            .endif
        .endif
    .elseif umsg==wm_finish
        invoke messagebox,null,addr successstring,addr appname,mb_ok
    .else
        invoke defwindowproc,hwnd,umsg,wparam,lparam
        ret
    .endif
    xor    eax,eax
    ret
wndproc endp

threadproc proc uses ecx param:dword
        mov  ecx,600000000
loop1:
        add  eax,eax
        dec  ecx
        jz   get_out
        jmp  loop1
get_out:
        invoke postmessage,hwnd,wm_finish,null,null
        ret
threadproc endp

end start
 

分析:

主程序的主线程是一个用户界面线程,它有一个普通窗口。用户选择菜单项"create thread",程序就会产生一个线程:

            .if ax==idm_create_thread
                mov  eax,offset threadproc
                invoke createthread,null,null,eax,\
                                        null,0,\
                                        addr threadid
                invoke closehandle,eax
 
上面的代码段产生一个线程,线程的主体代码是函数threadproc,该函数和主线程并行运行。在调用成功后,createthread函数立即返回,threadproc也开始运行。因为我们不再用线程句柄,我们立即关闭它以避免内存泄漏。我们前面讲过关闭句柄不会终止线程的执行,而只是减少起引用计数。

threadproc proc uses ecx param:dword
        mov  ecx,600000000
loop1:
        add  eax,eax
        dec  ecx
        jz   get_out
        jmp  loop1
get_out:
        invoke postmessage,hwnd,wm_finish,null,null
        ret
threadproc endp

我们看到上面的线程的代码仅仅是做简单的计数工作,因为我们设了一个很大的基数,所以该线程会持续一段您能感觉得到的时间,当结束后它会向主线程发送wm_finish消息。wm_finish消息是我们自己定义的,它的定义如下:

    wm_finish equ wm_user+100h

wm_user消息是我们能够使用的最小消息值。
显然我们一看到wm_finish,就能从字面上理解该消息的意义。主线程接收到该消息后,会弹出一个对话框告诉用户,计算线程已经结束了。
通过线程之间的通讯,用户可以多次选择"create thread",那样就可以运行多个计算线程了。

本文关键:iczelion asm
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top