就是不用VB的ActiveX EXE异步工程,就是用ActiveX DLL工程去设计,而且要求能自主控制当前的调用是否是一个异步调用。例如,在一个sub过程里,有一个值为布尔类型的参数,如果为True,那么当前的sub过程调用就是异步的,如果传进来的是False就是同步的。各位大神,懂我意思了吗?看看有没有方法?

解决方案 »

  1.   

    在用户ActiveX DLL中,定义一个定时器 TimerX在类模块代码中定义一个事件
    event TheEvent(param1 as ....)TimerX中检测sub TimerX_Timer
      if 某种条件到达 then
       raiseevent TheEvent(....)
      end if
    end sub
      

  2.   

    ActiveX EXE为什么不用,看不起吗?
      

  3.   

    哦,不是,我只是想,ActiveX EXE如果用了,所有的过程都是异步的了,我想自己选择那些过程是异步的,那些不是异步的(在同一个DLL里),而且是通过代码控制。
      

  4.   

    在用户ActiveX DLL中,定义一个定时器 TimerX,并设置使能为false在类模块代码中定义一个事件
    event TheEvent(param1 as ....)TimerX中检测sub TimerX_Timer
      if 某种条件到达 then
      raiseevent TheEvent(....)
      timerx.enabled=false '事件发生后,定时器关闭
      end if
    end sub
    异步方法:
    public sub aSub(...)
      timerx.Enabled =True 
    end sub同步方法:
    public sub bSub(...)
      原来怎么做还是怎么做
    end sub
      

  5.   

    能不用定时器吗?这是在ActiveX DLL里做异步的方法。你不是说在ActiveX EXE里可以存在同步的过程,能说一下怎么做吗?
      

  6.   

    但是在ActiveX EXE里的过程并不需要定时器,本身就是异步的,你调用它之后立即返回。既然你说ActiveX EXE并不是全部都是异步过程,那就麻烦说一下怎样写出同步的过程,在ActiveX exe里。
      

  7.   

    但是在ActiveX EXE里的过程并不需要定时器,本身就是异步的,你调用它之后立即返回。 这是谁说的?ActiveX EXE 一般情况下,都是同步的,比如其内部有一个过程aProc,需要很花时间,现在你客户端调用该该过程,客户端代码只要等待到ActiveX EXE里的过程aProc执行完成要才能运行到下个语句。异步才需要定时器。
      

  8.   

    但是在ActiveX EXE里的过程并不需要定时器,本身就是异步的,你调用它之后立即返回。 这是谁说的?ActiveX EXE 一般情况下,都是同步的,比如ActiveX EXE内部有一个过程aProc,需要很花时间,现在你的客户端调用该该过程,客户端代码只有等待到ActiveX EXE里的过程aProc执行完成后,才能运行到下个语句。异步才需要定时器。
      

  9.   

    那我问你ActiveX EXE跟ActiveX DLL有什么不同,难道只是编译出来的文件不同吗?这个我早就试验过了,不信你自己试试ActiveX EXE和ActiveX DLL是前者本身就是异步的,拥有单独的进程,后者是同步的,没有单独的进程。不然为什么我问这个问题的时候,8楼这样回答我呢:
      

  10.   

    ActiveX EXE 进程外部件,其运行在独立的进程中 ,使用dcom可以运行于其他机器作为服务器
    ActiveX DLL 进程内部件,其运行于调用者的进程中 ,使用com+可以运行于其他机器作为服务器
      

  11.   


    不信你自己试试ActiveX EXE和ActiveX DLL是前者本身就是异步的,拥有单独的进程,后者是同步的,没有单独的进程。不然为什么我问这个问题的时候,8楼这样回答我呢:这个说法不对,对exe部件方法的调用,并没有异步,假设有以下代码sub aSub
    dim x as new aExeComponent
    ....a=x.aFunction(...)'调用部件x的方法aFunction
    b=a+cend sub上述中b=a+c语句只有在x.aFunction(...)执行完毕后,才能运行,如果x.aFunction运行时间很长,代码将在此处阻塞,知道x.aFunction返回,才能运行下一个语句.......这是同步的
      

  12.   


    呵呵,那我就不懂了,MSDN的异步的例子也是用定时器的,你可以自己去看
      

  13.   

    单线程异步就用timer,好控制;除此之外还有象枚举窗口句柄的api也可以实现
      

  14.   

    但那时我觉得用Timer很麻烦。顺带问一下,在VC里有没有是直接实现异步的方法?
      

  15.   

    timer 是最最简单的实现异步的方法,还有更多的方法,比如利用消息循环,==
      

  16.   

    使用多线程吧,传一个回调函数地址传到DLL中,当需要异步时在DLL中创建一线程,执行状态通过执行回调函数来返回.多转转VBGOOD
      

  17.   

    我想过一个变通的方法。
    主程序SHELL调用EXE,传参数进去。
    EXE用COMMAND取到参数,然后干活。
    EXE干完活后,通过getobject取到主程序的某个注册的实例,
    然后调用某方法,就可以通知到主程序了。
      

  18.   


    不需要共享文件,是主程序共享一个实例。
    关于getobject,我已经贴过具体的代码。
      

  19.   

    虽然一年了,但是我才看到这个帖子。我可以告诉楼主,ActiveX Exe不是上面你说的那样“都是异步的”,@worldy 说的是对的我是在ActiveX Exe中使用消息循环做的,我的那个服务器进程是with GUI的,虽然给隐藏了,所以消息循环是比较经济简便的
    dll的话还是你采用的多线程的方式吧。不知道你现在是怎么做的~