iczelion tut16[3]

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

本文简介:选择自 jimgreen 的 blog

                        dec  ecx
                .else
                        invoke messagebox,hwnd,addr stopstring,addr appname,mb_ok
                        mov  eventstop,false
                        jmp threadproc
                .endif
        .endw
        invoke postmessage,hwnd,wm_finish,null,null
        invoke enablemenuitem,hmenu,idm_start_thread,mf_enabled
        invoke enablemenuitem,hmenu,idm_stop_thread,mf_grayed
        jmp   threadproc
        ret
threadproc endp
end start

分析:

本例中,我们演示另一种技巧:

    .if umsg==wm_create
        invoke createevent,null,false,false,null
        mov  heventstart,eax
        mov  eax,offset threadproc
        invoke createthread,null,null,eax,\
                             null,0,\
                             addr threadid
        invoke closehandle,eax

在wm_create 消息的处理中我们生成事件同步对象并创建线程。我们设置了相关的值让同步对象生成时处于”无信号”状态而且在调用了waitforsingleobject后可以自动把事件对象的状态设为”无信号”。然后我们创建线程。 线程的代码开始执行后立即被阻塞:

threadproc proc uses ecx param:dword
        invoke waitforsingleobject,heventstart,infinite
        mov  ecx,600000000

您可以看到线程的执行体的第一条代码就是调用waitforsingleobject函数,该函数使得线程阻塞并且一直处于等待事件对象变成”有信号”。这也就是说,我们以开始就让该线程进入了睡眠状态。 当用户选择了菜单项”run thread”后,我们把事件对象得状态变成”有信号”:

            .if ax==idm_start_thread
                invoke setevent,heventstart

函数setevent可以让同步对象变成”有信号”状态,那么下一次线程得到时间片运行时,waitforsingleobject函数就会返回,线程余下的代码就可以得到执行了。当用户选择了菜单项”stop thread” 时,我们把全局变量eventstop设为true。

                .if eventstop==false
                        add  eax,eax
                        dec  ecx
                .else
                        invoke messagebox,hwnd,addr stopstring,addr appname,mb_ok
                        mov  eventstop,false
                        jmp threadproc

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

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

go top