Windows Service中使用Threading.Timer需注意回收

本文讨论了在WindowsService中使用Threading.Timer时可能遇到的问题,特别是关于线程池对象的垃圾回收机制可能导致服务出现假死状态的现象。文章提供了避免此问题的有效解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Windows Service中使用Threading.Timer时需要注意回收池问题

Threading.Timer是基于线程池的,系统会对其进行垃圾回收。

当Threading.Timer定义在OnStart方法中时,当服务启动完成后。

系统对其中定义的对象进行回收【回收是不定时进行,所以可能会

运行一段时间然后突然就不运行的情况发生】,这时候会把在OnStart

方法的timer进行回收,有可能会造成服务假死的情况。解决办法也很简单

定义到类上就好,如 private System.Threading.Timer timer.

注:用做记录。。。

转载于:https://www.cnblogs.com/ywkpl/p/3904252.html

import rclpy from rclpy.node import Node from tf2_msgs.msg import TFMessage from geometry_msgs.msg import Pose import serial import subprocess from sensor_msgs.msg import LaserScan class TFSubscriber(Node): def __init__(self): super().__init__('tf_subscriber') self.subscription = self.create_subscription( TFMessage, '/tf', self.tf_callback, 10 # 缓冲区大小 ) self.min_lenth = 0.3 self.ser = serial.Serial("/dev/ttyUSB2", 115200) self.command_publisher_ = self.create_publisher(Pose, "/pose", 10) #self.sub = self.create_subscription(LaserScan, '/scan', self.command_callback, rclpy.qos.qos_profile_sensor_data) timer_period = 0.02 #每20ms self.decoded_data='' self.timer = self.create_timer(timer_period, self.timer_callback) #启动一个定时装置,每 1 s,调用一次time_callback函数 self.subscription # 避免被垃圾回收 def timer_callback(self): size = self.ser.inWaiting() if size > 0: # 读取串口数据 data = self.ser.readline() self.decoded_data = data.decode('utf-8') # 使用适当的编码解码数据 print(self.decoded_data) if 'PRST' in self.decoded_data: print("Restart !!!!") service_name = 'rc-local' subprocess.run(['sudo', 'service', service_name, 'restart']) if 'PSTP' in self.decoded_data: print("Stop !!!!") service_name = 'rc-local' subprocess.run(['sudo', 'service', service_name, 'stop']) # self.get_logger().info('定时器触发 - 执行定时任务') def tf_callback(self, msg): # 在这里处理接收到的tf消息 for transform in msg.transforms: # print("Received Transform:") # print(f" Header: {transform.header.frame_id}") if transform.header.frame_id == "odom": pose_msg = Pose() pose_msg.position.x=transform.transform.translation.x*100 pose_msg.position.y=transform.transform.translation.y*100 pose_msg.position.z=transform.transform.translation.z pose_msg.orientation.x = transform.transform.rotation.x pose_msg.orientation.y = transform.transform.rotation.y pose_msg.orientation.z = transform.transform.rotation.z pose_msg.orientation.w = transform.transform.rotation.w start_bit = b'\xfa' end_bit = b'\xab' x = int(pose_msg.position.x) y = int(pose_msg.position.y) fuhao = b'\x01' zhen = b'\x00' x_bit = abs(x).to_bytes(4, 'big') y_bit = abs(y).to_bytes(4, 'big') if x< 0: x_bit = fuhao + abs(x).to_bytes(3, 'big') if x>0: x_bit = zhen + abs(x).to_bytes(3, 'big') if y< 0: y_bit = fuhao + abs(y).to_bytes(3, 'big') if y>0: y_bit = zhen + abs(y).to_bytes(3, 'big') # 构造数据帧 data_frame = start_bit + x_bit + y_bit + end_bit # 发送数据 self.ser.write(data_frame) # tmp=f"pi {pose_msg.position.x} {pose_msg.position.y} #" # self.ser.write(tmp.encode()) # self.command_publisher_.publish(pose_msg) # print("=============") # print(f" Child Frame ID: {transform.child_frame_id}") # print(f" Transform Translation: {transform.transform.translation.x}") # print(f" Transform Rotation: {transform.transform.rotation.w}") # print() def main(args=None): rclpy.init(args=args) tf_subscriber = TFSubscriber() rclpy.spin(tf_subscriber) tf_subscriber.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() 这是test01.py
07-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值