一个多月来,加班似乎成了家常便饭,紧追慢赶手头几乎不可能实现的项目,也很少有机会写点什么了。
最近在实现Delphi Server控件组操作Word编辑文档的时候,遇到了3年前就曾遇到的问题,以为这次能够圆满解决,但最后发现还是沿用的老方法--看来对于实现层,我还是个新手啊...好了废话不说,来说说我发明的这个笨法。
问题的由来:
当前项目中有个实现为,用Delphi的Server控件启动一个Word实例,对文档进行操作,并在Word保存退出时读取该文件,并存入数据库。,我将保存文件到数据库的操作作为一个反转回调注册到WordApplication和WordDocument控件中,用于在WordDocument产生OnDocumentClose事件时调用该回调函数,而问题就出现在这里,当WordDocument产生OnDocumentClose事件时,并没有被Free掉,所关联的文件也是被独占了,所以读取文件的操作会执行失败。
3年前写FlaFly播放器时,也遇到了类似问题。Flash控件会响应一个Close的Command,之后会释放整个Flash控件,而这个响应是在Flash控件的OnCommand事件中,所以在一个对象的事件中无法实现自释放。
解决方法:
无奈中,我在每个对象的管理类中增加了一个TTimer作为Server,来监视对象的事件变化,当对象需要自释放时,在响应事件中启动这个Server(一般都要在对象的释放通知事件中来启动这个Server),Server启动后会检测并执行预先设置好的操作,之后停止自己。
不足之处:
该方法只适合解决对象释放通知事件的自释放问题,因为,只有在这个时候,我们才认为Server被通知后,对象立即被释放掉了,而Server的触发间隔基本可以应付一般情况。
当然,如果你的对象需要进行的清理操作时间较长,那么就在Server中定义一个标志符,来对失败的操作(比如读取文件失败)进行重试,直到操作成功执行(即等待对象完全释放)。
后记:
对于该类问题,也许是由于水平有限造成的设计问题,因此,除非一些极端情况,我们应该寻找更加有效的设计方案来解决此类问题。但对于单线程设计中,此方法可以解决某些调用交叉问题。
分享到:
相关推荐
通过对这份源代码的学习和实践,开发者不仅可以提升对定时器内核对象的理解,还能增强在商业环境中解决实际问题的能力,这对于任何从事软件开发的人来说都是宝贵的财富。记得在研究源代码时,不仅要关注其实现细节,...
而在WPF中,你可以在ViewModel或代码-behind文件中创建和管理定时器,并使用`DispatcherTimer`来确保定时器回调在UI线程上执行,避免跨线程访问UI元素的问题。例如: ```csharp public class ViewModel : ...
2. **使用事件对象**:利用CWinThread类或者线程池,创建一个工作线程来定期检查并执行任务。这涉及到线程同步和通信,可以使用事件对象(CEvent)来控制线程的等待和唤醒。 3. **使用异步消息队列**:通过创建一个...
5. **关闭定时器**: 完成定时任务后,使用`CloseHandle`函数关闭定时器对象,释放资源。 这种方式虽然提供了更高的精度,但也带来了额外的复杂性。例如,需要管理线程和同步,以及处理可能的定时器溢出问题。此外,...
通过深入理解并正确使用DSP2812的定时器功能,开发者可以构建高效、准确的嵌入式系统解决方案,满足各种实时性要求。"SourceCode02_Timer2"提供了一个实用的例子,有助于进一步学习和实践定时器的使用。
在本文中,我们将深入探讨如何在Visual Studio 2010环境下使用MFC(Microsoft Foundation Classes)实现多媒体定时器。MFC是微软提供的一套C++库,它封装了Windows API,使得开发者可以更容易地创建Windows应用程序...
6. 销毁定时器对象:当不再需要定时器时,记得正确地销毁它以释放资源。 ```cpp myTimer.~MyTimer(); ``` MyTimer库的强大之处还可能体现在多线程支持和定时任务的并发处理上。如果类库实现了这些特性,那么它可以...
PB9多Timer事件实例是PowerBuilder 9.0中关于定时器(Timer)使用的深入探讨。在编程领域,定时器是一种常见的工具,用于在特定时间间隔执行某项任务,这在许多应用程序中都非常实用,例如数据刷新、定时提醒或者...
3. **取消事件冒泡**:通过调用事件对象上的`stopPropagation()`方法可以阻止事件继续传播到父节点,从而避免了因事件冒泡导致的多个事件监听器同时触发的问题。 4. **取消默认行为**:使用`preventDefault()`方法...
在VB(Visual Basic)编程环境中,对象的系统事件是指由操作系统或VB运行时环境触发的一系列内置事件。...在实际开发中,不断实践和探索VB对象的系统事件,将有助于提升编程技能和解决问题的能力。
本文将深入探讨iOS中的定时器循环引用问题,并提供一种解决方案来封装定时器,以避免这类问题。 首先,我们来理解一下什么是循环引用。在Objective-C或Swift中,当两个或更多对象相互持有强引用时,就会形成循环...
在本文中,我们将讨论前端内存泄漏的四种常见原因及其解决方案,并且探讨 Vue SPA 中的内存泄漏问题。 一、意外的全局变量 在 JavaScript 中,未声明的变量将被添加到全局对象中,如果在浏览器中,全局对象就是 ...
在Android开发中,定时任务是...通过以上讨论,我们对Android中的定时器有了全面的了解,掌握了如何创建、调度任务,以及需要注意的问题。在实际项目中,结合源代码级注释,我们可以更深入地理解和优化定时器的使用。
C# 中的定时器在设计时考虑了线程安全和事件处理,但如果不正确地使用,可能会引发内存泄露问题。本文主要讨论了两种常见的定时器:`System.Timers.Timer` 和 `System.Threading.Timer`,以及它们如何通过保活机制...
使用weak属性弱引用self可解决此问题: ```swift weak var weakSelf = self let timer = Timer.scheduledTimer(timeInterval: 2.0, target: weakSelf!, selector: #selector(weakSelf?.handleTimer), userInfo: nil...
定时器也是常见产生内存泄露的地方:当定时器的回调函数中引用了外部的变量时,定时器无法被释放。 三、如何避免内存泄露? 1. 使用弱引用 在JavaScript中,可以使用弱引用来避免内存泄露。弱引用是指对象之间的...
为了解决这个问题,我们可以将定时器的引用存储在页面的数据对象(`data`)中。这样,我们可以在页面的 `onLoad` 函数中创建定时器,并在 `onUnload` 函数中清除它。以下是一个简单的示例: ```javascript // 在...
- **使用信号量(Semaphore)**:在特定时间间隔后,信号量可以自动释放,从而触发关联的事件。 - **多线程和条件变量(Condition Variables)**:在一个单独的线程中等待条件变量,当达到预定时间时,由另一个线程...
在 iOS 应用程序中,每个事件循环(如触摸事件或定时器触发)都有一个自动释放池,因此在这些事件处理完毕后,自动释放的对象会被释放。6. retain、release、autorelease 的关系:当你调用 alloc、new、copy 或 ...