回 帖 发 新 帖 刷新版面

主题:[讨论]主程序退出后,为何ActiveX EXE不能退出??

在主程序里,结束时用set a =nothing    'a是一个ActiveX Exe
来结束程序。但是发现,在主程序退出后,那个ActiveX Exe仍然在任务管理器里,要手工结束才行。
如何才能使它在主程序退出时就能正常地结束?

回复列表 (共3个回复)

沙发

在ActiveX EXE里面的Class_Terminate事件里加个End

板凳

起初,我也在ActiveX exe 的Class_Terminate事件里加了End,但是,只要其中的一个实例运行结束后,其它的实例也退出了。在开发环境中,ActiveX EXE工程会从运行状态变成设计状态,然后主程序试图再创建一个新的实例时就发生错误。
    但生成Exe后再运行,就没有这样的错误,只是即使加了End,主程序退出后照样不能退出。
MSDN上说
[quote]
进程外部件
如果用 End 语句关闭进程外部件,客户应用程序仍保持着对这个已不存在的对象的引用。当它们试图调用这些对象的属性或方法时,则会引起错误。

对于部件关闭必须记住的要点。 
1、一个性能良好的部件不控制它自己的寿命。

2、不要用 End 语句强制关闭进程外部件。 
这一条的推论是,不要实现 Quit 方法。通过释放对所有对象的引用来释放部件是个良好的编程习惯。应在 Help 文件中告诉用户这是释放部件的正确方式。不要给开发者提供可以中断其他客户的捷径,这会鼓励不良的编程习惯。
当没有对象再使用窗体时,不要通过保持加载但隐藏窗体来无谓地延长部件的寿命。
3、避免人工延长部件寿命的循环引用,例如一个对象拥有对某一窗体的引用,后者反过来也拥有此对象的引用。关于循环引用请参阅“部件设计的一般准则”中的“循环引用的处理”。
4、如果部件是一个提供对象的独立的桌面应用程序,记住计算机用户也是客户。[/quote]

ActiveX exe编译时的选项,“每个对象对应一个线程”和“线程缓冲池”两种编译方式都试过,几乎是一样的效果。

PS:原来没有设置编译方式(默认使用线程缓冲池,1线程),发现运行时各个实例之间好像有“阻塞”,设置之后,运行顺畅多了,多个实例感觉几乎可以同时运行。
    另外,运行时,任务管理器里的CPU使用率常常是100%,但并不感觉到“卡”。
真搞不懂这ActiveX、COM什么什么的。

3 楼

你可以在ActiveX中偿试一下end,但要在end前做一个延时,保证主程序完全nothing以后执行end

我来回复

您尚未登录,请登录后再回复。点此登录或注册