xe10.1在dll创建的createTimerQueue,忘记删除了,怎么破?

aidpoint20126 2024-06-26 11:41:02

江湖救急,江湖救急,江湖救急

在多线程中调用了一个dll编写的插件,创建了一个定时器createTimerQueueTimer,结果忘记删除了,导致改定时器 一直在执行,

现在想把这个定时器删除了,不知道咋个搞?麻烦高手解决一下 ,红包 奉上

...全文
成就一亿技术人!
拼手气红包 50.00元
617 14 打赏 收藏 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋天之落叶 2024-06-30
  • 打赏
  • 举报
回复

能回这样帖子的都是高手啊。
我是来凑数的,我不明白的是,DLL重搞一下不行吗?

aidpoint20126 2024-06-30
  • 举报
回复
@秋天之落叶 可以重搞啊,但是前面已经创建的了定时器怎么删除啊?
  • 举报
回复 1
@aidpoint20126 GetModuleHandle、FreeLibrary
  • 打赏
  • 举报
回复

不知道创建的定时器队列的句柄?那就是没有源码,你要搞别人的DLL,关闭定时检查什么什么事件之类的?估计你的水平还稍微欠一点点。
没有句柄怎搞呢,简单说就是:
调用NtQuerySystemInformation,查询类型SystemHandleInformation
对返回的缓冲区的每个handle
调用NtQueryObject,查询的对象信息类ObjectTypeInformation
返回结构中有它的类型名字符串
然后你判断是否需要CloseHandle即可~~~

aidpoint20126 2024-06-29
  • 举报
回复
@日立奔腾浪潮微软松下联想 我自己的源码,自己写的dll,最开始是创建了定时器队列和定时器,然后把dll运行了一段时间,后来发现没有删除定时器,就在代码里面加上了删除代码,结果前面创建的定时器由于没有删除 代码,所以没有删除,现在我想把他删除了,是这么个意思
aidpoint20126 2024-06-29
  • 打赏
  • 举报
回复

兄弟,能给个删除的代码吗?dll我自己可以搞定

recin_com_cn 2024-06-29
  • 打赏
  • 举报
回复

如果你在使用 Embarcadero RAD Studio XE10.1 中创建了一个名为 createTimerQueue 的 DLL 函数,但忘记了删除它,可以通过以下步骤进行处理:

编写一个修复DLL函数的程序:创建一个新的 DLL,其中包含一个函数,用于删除或清理之前创建的 createTimerQueue。这种方法通常需要对你的原始 DLL 的代码和功能有较深的理解。你需要确保新的 DLL 可以正确识别和处理 createTimerQueue 的创建,并执行适当的清理操作。

或者创建一个新的DLL.

aidpoint20126 2024-06-29
  • 举报
回复
@recin_com_cn //旧dll 创建定时器代码 ... var timerHandle,timerQueue:Thandle; begin timerQueue:=createTimerQueue; if timerQueue<>0 then if not createTimerQueueTimer(timerHandle,timerQueue,@TimerCallback,nil,interValNum,0,0) then log('创建失败'); end; //新的dll怎么删除旧dll中 创建的定时器啊?用下面的删除代码没有定时器句柄啊 deleteTimerQueueTimer(timerQueue,timerHandle,invalid_handle_value); deleteTimerQueue(timerQueue);
  • 打赏
  • 举报
回复 1

在Windows中,如果你创建了一个定时器(TimerQueueTimer),但是忘记删除它,定时器会一直执行。要删除这个定时器,可以使用DeleteTimerQueueTimer函数。下面是如何删除定时器的步骤:

  1. 创建定时器
    当你创建定时器时,通常会保存定时器的句柄,以便以后删除它。

#include <windows.h>

// 定时器句柄
HANDLE hTimer = NULL;

// 定时器回调函数
void CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
// 定时器任务
}

void CreateMyTimer()
{
CreateTimerQueueTimer(
&hTimer, // 定时器句柄
NULL, // 默认的定时器队列
TimerRoutine, // 定时器回调函数
NULL, // 传递给回调函数的参数
0, // 定时器首次触发的延迟时间(毫秒)
1000, // 定时器间隔时间(毫秒)
0 // 定时器选项
);
}
2. 删除定时器
要删除定时器,可以使用DeleteTimerQueueTimer函数。需要注意的是,DeleteTimerQueueTimer会等待所有正在运行的回调函数执行完毕,然后再删除定时器。

void DeleteMyTimer()
{
if (hTimer != NULL)
{
// 删除定时器
if (!DeleteTimerQueueTimer(NULL, hTimer, INVALID_HANDLE_VALUE))
{
// 删除失败
printf("DeleteTimerQueueTimer failed with error %d\n", GetLastError());
}
else
{
// 成功删除定时器
printf("Timer successfully deleted\n");
}
hTimer = NULL;
}
}
3. 在多线程环境中删除定时器
在多线程环境中,需要确保在删除定时器时不会与其他线程发生竞争。可以使用互斥锁(Mutex)或临界区(Critical Section)来保护定时器的创建和删除操作。

#include <windows.h>
#include <stdio.h>

HANDLE hTimer = NULL;
CRITICAL_SECTION cs;

void CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
// 定时器任务
}

void CreateMyTimer()
{
EnterCriticalSection(&cs);

CreateTimerQueueTimer(
    &hTimer,                   // 定时器句柄
    NULL,                      // 默认的定时器队列
    TimerRoutine,              // 定时器回调函数
    NULL,                      // 传递给回调函数的参数
    0,                         // 定时器首次触发的延迟时间(毫秒)
    1000,                      // 定时器间隔时间(毫秒)
    0                          // 定时器选项
);

LeaveCriticalSection(&cs);

}

void DeleteMyTimer()
{
EnterCriticalSection(&cs);

if (hTimer != NULL)
{
    // 删除定时器
    if (!DeleteTimerQueueTimer(NULL, hTimer, INVALID_HANDLE_VALUE))
    {
        // 删除失败
        printf("DeleteTimerQueueTimer failed with error %d\n", GetLastError());
    }
    else
    {
        // 成功删除定时器
        printf("Timer successfully deleted\n");
    }
    hTimer = NULL;
}

LeaveCriticalSection(&cs);

}

int main()
{
InitializeCriticalSection(&cs);

CreateMyTimer();

// 模拟一些操作
Sleep(5000);

DeleteMyTimer();

DeleteCriticalSection(&cs);
return 0;

}
在这个例子中,使用了临界区来保护对定时器句柄的访问,确保在多线程环境中安全地创建和删除定时器。你可以根据你的实际情况选择合适的同步机制,如互斥锁或事件。

aidpoint20126 2024-06-29
  • 举报
回复
@清风明月9987321 多谢支援,但是现在的 问题是,我不知道创建的定时器的句柄了,有没有什么 办法把他找出来
aidpoint20126 2024-06-29
  • 举报
回复
@清风明月9987321 就是我原来创建的定时器的句柄我不知道了,怎么删除呢?
tanqth 2024-06-27
  • 打赏
  • 举报
回复 1

既然是“忘记删除了”,那就把删除加上吧。

yn951193705 2024-06-27
  • 打赏
  • 举报
回复

我很同意,话说发15个字的评论能获得积分,我也试一试

Eluca 2024-06-26
  • 打赏
  • 举报
回复
定位定时器: 首先,检查代码中是否有一个全局变量或类成员保存了对定时器的引用,这可能是Windows::Threading::TimerQueueTimer或类似对象。

获取句柄或ID: 找到定时器后,你可能需要它的句柄(如果库提供了这样的接口)或者它的ID来停止它。这通常可以通过定时器对象的成员函数获取。

取消定时器: 使用获得的句柄或ID,调用cancel()、stop()或类似的方法来停止定时器。这取决于库的具体实现,例如在Windows API中可能是CloseHandle(timerHandle),而在WinRT中可能是timer.Cancel()。

清理资源: 如果定时器对象是动态分配的,记得将其从内存中释放,以防止内存泄漏。

处理异常: 在尝试取消定时器时,确保捕获任何可能出现的异常,如找不到句柄或无效操作。

日志和调试: 为了解决这类问题,记录相关的日志信息以便于追踪和解决问题。

如果你在DLL中无法直接操作,可能需要通过插件提供的API或者通知机制来请求父进程或管理器停止定时器。

源码直接下载地址: https://pan.quark.cn/s/0c43ed5159df 本资源为HCDA认证培训教程,旨在面向准备参加HCDA考试的学员,或希望掌握TCP/IP基础、路由、交换技术、广域网、以太网技术基本原理以及华为通用路由平台VRP上实现的相关内容。具体涵盖的模块包括:Module 1-网络互联基础、Module 2-路由和路由协议基础与实现、Module 3-以太网交换技术基础与实现、Module 4-广域网技术基本原理与实现、Module 5-网络安全基础、Module 6-华为数通产品概述 ### 华为-NAT技术详解 #### 一、概述 NAT(Network Address Translation,网络地址转换)是一种在专用网络内部使用私有IP地址的情况下,使这些设备能够通过公有IP地址进行外部通信的技术手段。NAT技术在多种网络环境中得到广泛应用,特别是在企业网络中发挥着关键性作用。作为HCDA认证培训教程的一部分,本文档将系统性地阐述NAT的基础理论及其实现方法,并深入探讨在华为VRP平台上的具体应用场景。 #### 二、NAT处理流程 NAT处理流程主要包含两种类型:基于源IP地址和基于目的IP地址的处理模式。 ##### 1. 基于源IP地址的NAT处理 **1.1 一对一NO-PAT** 一对一NO-PAT即非端口地址转换(No-Port Address Translation),在这种模式下,一个私有IP地址对应一个公有IP地址,不涉及端口号的转换。当配置了NAT no-pat时,华为设备会为已配置的多通道协议产生的实际流量数据建立server-map表项。这种方式适用于需要固定公网IP的服务器等场景。 **1.2 多对一...
内容概要:本文基于Simulink仿真平台,复现并深入研究了一篇关于全桥LLC谐振变换器的学术论文,重点聚焦于变频控制与移相控制相结合的协同策略,旨在优化变换器在不同工作模式切换过程中的动态响应特性。通过构建高精度的全桥LLC变换器仿真模型,系统分析了传统单一控制方式下模式切换易引发的电压电流冲击问题,进而提出一种融合频率调节与移相角调节的复合控制方法。该方法通过精确协调两个控制自由度,有效平抑了切换瞬态的电气应力,显著提升了系统的运行平稳性、效率及整体稳定性。文中详尽阐述了协同控制的逻辑架构、关键参数的设计与整定原则,并通过严谨的仿真对比实验,验证了所提策略在改善模式切换平滑性方面的优越性能。; 适合人群:具备扎实的电力电子与电力传动理论基础,熟练掌握Simulink/MATLAB仿真工具,正在从事高频软开关变换器、DC-DC电源变换、新能源并网逆变器等相关领域研究的硕士、博士研究生及科研技术人员。; 使用场景及目标:①深入理解全桥LLC谐振变换器的工作原理、谐振特性及其多模式运行机制;②掌握变频与移相结合的混合控制策略的设计思想与实现方法;③将其应用于高效率、高可靠性电源系统的动态性能优化,为解决实际工程中电源启停、负载突变等工况下的稳定性问题提供理论依据和技术方案。; 阅读建议:建议读者结合所提供的Simulink模型文件进行同步操作与学习,重点关注控制器模块的搭建细节、控制逻辑的实现方式以及各关键参数的调节过程。应主动对比单一变频、单一移相与协同控制三种策略下的仿真波形,从电压、电流的瞬态响应中直观感受协同控制的优势,从而深化对先进控制理论在电力电子系统中应用价值的理解。
代码转载自:https://pan.quark.cn/s/b9146ae38508 《Linux From Scratch》(LFS)是一部详尽阐述如何从源代码开始构建Linux系统的指南性著作。书中包含了完整的流程和说明,指导读者逐步构建个性化的Linux系统。这本书不仅适合那些希望探究Linux操作系统内部运作机制的用户,同时也适合那些希望构建专业级、高度定制化系统的进阶用户。LFS的中文版本将这一过程用中文详细描述,使中文用户能够毫无障碍地遵循书中的步骤来定制Linux系统。本书的翻译工作由多位译者分别承担,他们分别是金步国、ipconfigme和bobkey,各自负责不同章节的翻译任务。本书的结构分为若干部分,各部分内容如下: 第一部分主要阐述了如何构建LFS系统。在这一部分中,首先解释了LFS的定义以及构建LFS系统的必要性。接着,列出了构建LFS系统的目标读者群体、先决条件、对宿主系统的要求,并说明了排版约定和本书的组织结构。此外,还提供了版本更新记录,帮助读者了解不同版本之间的差异。 在“准备一个新分区”章节中,讲解了如何在计算机上创建新分区并在该分区上建立文件系统,为安装LFS系统进行准备。 在“软件包和补丁”章节,LFS列出了所有需要下载的软件包和补丁,并介绍了它们的用途。 在“最后的准备工作”章节,书中指导读者设置环境变量$LFS,创建$LFS/tools目录,添加LFS用户,并设定工作环境。 紧随其后,在“构建临时编译环境”章节中,详细介绍了如何创建一个临时编译环境,这个环境是编译和安装最终的LFS系统所必需的工具链。这一部分包括了如何编译安装Binutils、GCC、Linux内核头文件、Glibc,以及调整工具链等步骤。 本书详细说...
IEEE基于高频信号注入法的PMSM零低速无位置控制永磁同步电机仿真,有参考文献内容概要:本文主要介绍了一种基于高频信号注入法的永磁同步电机(PMSM)在零低速条件下的无位置传感器控制技术,重点研究了通过高频信号注入实现转子初始位置辨识和零低速运行时的精确控制。该方法利用电机交直轴高频阻抗的差异特性,通过注入高频电压信号并检测响应电流,构建转子位置观测器,从而实现对转子位置与速度的准确估计。文中详细阐述了脉振高频电压注入法的原理、观测器设计方法及其收敛性分析,并结合Simulink仿真平台验证了所提控制策略的有效性和鲁棒性。此外,文档还列举了大量相关研究主题,涵盖电机控制、新能源系统优化、智能算法应用等多个领域,体现出该技术在现代电力电子与电机控制系统中的广泛适用性。; 适合人群:具备一定电机控制与电力电子基础知识,从事自动化、电气工程及相关领域研究的研发人员与高校研究生。; 使用场景及目标:①应用于永磁同步电机驱动系统中,解决低速及零速时因反电动势微弱而导致的传统观测器失效问题;②为无位置传感器控制策略的科研仿真与工程实现提供技术参考与代码支持;③结合Matlab/Simulink进行教学演示与算法验证,促进理论与实践结合。; 阅读建议:此资源以仿真为核心,建议读者结合提供的Simulink模型与Matlab代码进行实操演练,重点关注高频信号注入参数设计、观测器结构搭建与系统稳定性分析,同时可参照文中列出的相关研究方向拓展学习深度。

5,944

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧