【Python 开源】你的 Windows 关机助手——PyQt5 版定时关机工具
🖥️ 你的 Windows 关机助手——PyQt5 版定时关机工具
相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着开源精神的想法,望大家喜欢,点个关注不迷路!!!
📌 概述
在日常使用电脑的过程中,我们经常会遇到需要定时关机的场景,比如:
- 夜间下载文件,想让电脑在任务完成后自动关机。
- 长时间运行的程序,需要在某个时间点关闭系统。
- 限制电脑使用时间,避免长时间占用资源。
虽然 Windows 自带 shutdown
命令可以定时关机,但操作方式较为繁琐,缺乏可视化界面。因此,本篇文章将带大家实现一个基于 PyQt5 的 Windows 定时关机工具,支持定时或延时关机、重启、注销,并提供系统托盘功能,方便随时管理关机任务。
🎯 功能介绍
本工具主要具备以下功能:
✅ 定时关机 —— 设定具体时间,到点自动关机。
✅ 延时关机 —— 设置倒计时,倒计时结束后自动关机。
✅ 重启 & 注销 —— 除关机外,还可执行系统重启和注销操作。
✅ 取消操作 —— 关机前可随时取消,避免误操作。
✅ 系统托盘支持 —— 运行后最小化到系统托盘,不影响日常操作。
✅ 人性化提示 —— 关机前弹出提醒,避免突发关机。
🔧 代码实现
📌 1. 安装依赖
在运行代码之前,我们需要先安装 PyQt5 库:
pip install PyQt5 pyqt5-tools
📌 2. 代码编写
以下是完整的代码实现:
import sys
import os
import time
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QVBoxLayout, QTimeEdit, QSystemTrayIcon, QMenu, QAction
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QTimer, QTimeclass ShutdownApp(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle('Windows 定时关机工具')self.setGeometry(600, 300, 300, 200)self.label = QLabel('请选择关机时间:', self)self.timeEdit = QTimeEdit(self)self.timeEdit.setDisplayFormat("HH:mm")self.startButton = QPushButton('设置关机', self)self.startButton.clicked.connect(self.scheduleShutdown)self.cancelButton = QPushButton('取消关机', self)self.cancelButton.clicked.connect(self.cancelShutdown)layout = QVBoxLayout()layout.addWidget(self.label)layout.addWidget(self.timeEdit)layout.addWidget(self.startButton)layout.addWidget(self.cancelButton)self.setLayout(layout)# 托盘功能self.trayIcon = QSystemTrayIcon(QIcon("icon.png"), self)trayMenu = QMenu()exitAction = QAction("退出", self)exitAction.triggered.connect(self.close)trayMenu.addAction(exitAction)self.trayIcon.setContextMenu(trayMenu)self.trayIcon.show()def scheduleShutdown(self):shutdown_time = self.timeEdit.time()current_time = QTime.currentTime()seconds = current_time.secsTo(shutdown_time)if seconds <= 0:self.label.setText("请选择一个未来的时间!")returnself.label.setText(f"关机已设置,将在 {shutdown_time.toString()} 执行")os.system(f'shutdown -s -t {seconds}')def cancelShutdown(self):os.system('shutdown -a')self.label.setText("关机已取消!")if __name__ == '__main__':app = QApplication(sys.argv)ex = ShutdownApp()ex.show()sys.exit(app.exec_())
📌 功能使用
🛠️ 1. 运行软件
python shutdown_tool.py
⏳ 2. 设置定时关机
- 选择时间
- 点击 “设置关机”
- 程序将计算剩余时间,并执行关机命令
🚫 3. 取消关机
-
如果想取消定时关机,点击 “取消关机” 按钮
-
也可以手动在命令行执行:
shutdown -a
🔽 4. 系统托盘
- 运行后可最小化到托盘
- 右键点击托盘图标可 退出应用
📊 技术要点解析
1️⃣ 关机命令
Windows 提供 shutdown
命令来执行关机任务:
-
定时关机:
shutdown -s -t 秒数
-
取消关机:
shutdown -a
2️⃣ 计算关机时间
我们使用 QTime
计算当前时间到设定时间的 秒数,避免时间计算错误:
seconds = current_time.secsTo(shutdown_time)
3️⃣ 托盘图标支持
使用 QSystemTrayIcon
实现最小化到托盘:
self.trayIcon = QSystemTrayIcon(QIcon("icon.png"), self)
这样即使窗口关闭,应用仍能在后台运行。
运行效果
相关源码
import os
import sys
import time
import configparser
import win32api
import win32con
from datetime import datetime, timedelta
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QGroupBox, QRadioButton, QDateTimeEdit, QLabel, QPushButton, QCheckBox, QSystemTrayIcon, QMenu, QMessageBox, QSpacerItem, QSizePolicy, QFrame)
from PyQt5.QtCore import Qt, QTimer, QDateTime, QTime, QSize, QSharedMemory
from PyQt5.QtGui import QIcon, QFont, QPalette, QColordef resource_path(relative_path):""" 获取资源的绝对路径,适用于开发环境和PyInstaller单文件模式 """if hasattr(sys, '_MEIPASS'):# PyInstaller创建的临时文件夹return os.path.join(sys._MEIPASS, relative_path)return os.path.join(os.path.abspath('.'), relative_path)class ShutdownApp(QMainWindow):def __init__(self):super().__init__()self.task_running = Falseself.config_file = os.path.join(os.getenv('APPDATA'), 'shutdown_config.ini')self.first_show = True # 用于跟踪是否是第一次显示self.setup_ui_style()self.init_ui()self.load_config()# 系统托盘self.tray_icon = QSystemTrayIcon(self)self.tray_icon.setIcon(QIcon(resource_path("icon.ico")))self.tray_icon.setToolTip("定时关机")self.tray_icon.activated.connect(self.tray_icon_activated)# 托盘菜单self.tray_menu = QMenu()self.show_action = self.tray_menu.addAction("显示")self.exit_action = self.tray_menu.addAction("退出")self.show_action.triggered.connect(self.show_normal)self.exit_action.triggered.connect(self.confirm_exit)self.tray_icon.setContextMenu(self.tray_menu)self.tray_icon.show() # 确保托盘图标显示# 显示当前时间self.timer = QTimer(self)self.timer.timeout.connect(self.update_current_time)self.timer.start(1000)# 剩余时间计时器self.countdown_timer = QTimer(self)self.countdown_timer.timeout.connect(self.update_remaining_time)def setup_ui_style(self):"""设置全局UI样式"""self.setStyleSheet("""QMainWindow {background-color: #f5f5f5;}QGroupBox {border: 1px solid #ccc;border-radius: 4px;margin-top: 10px;padding-top: 15px;font-weight: bold;color: #333;}QGroupBox::title {subcontrol-origin: margin;left: 10px;padding: 0 3px;}QRadioButton, QCheckBox {color: #444;}QPushButton {background-color: #4CAF50;color: white;border: none;padding: 8px 16px;border-radius: 4px;min-width: 80px;}QPushButton:hover {background-color: #45a049;}QPushButton:disabled {background-color: #cccccc;}QPushButton#cancel_btn {background-color: #f44336;}QPushButton#cancel_btn:hover {background-color: #d32f2f;}QDateTimeEdit {padding: 5px;border: 1px solid #ddd;border-radius: 4px;}QLabel#current_time_label {font-size: 16px;color: #333;padding: 5px;background-color: #e9f5e9;border-radius: 4px;}QLabel#remaining_time_label {font-size: 16px;color: #d32f2f;font-weight: bold;padding: 5px;background-color: #f9e9e9;border-radius: 4px;}""")def init_ui(self):self.setWindowTitle("定时关机")self.setWindowIcon(QIcon(resource_path("icon.ico")))self.resize(300, 440)# 主窗口布局main_widget = QWidget()self.setCentralWidget(main_widget)layout = QVBoxLayout(main_widget)layout.setContentsMargins(12, 12, 12, 12)layout.setSpacing(10)# 当前时间显示self.current_time_label = QLabel()self.current_time_label.setAlignment(Qt.AlignCenter)self.current_time_label.setObjectName("current_time_label")layout.addWidget(self.current_time_label)# 添加分隔线line = QFrame()line.setFrameShape(QFrame.HLine)line.setFrameShadow(QFrame.Sunken)layout.addWidget(line)# 定时/延时选择time_type_group = QGroupBox("时间类型")time_type_layout = QHBoxLayout()time_type_layout.setContentsMargins(10, 15, 10, 10)self.fixed_time_radio = QRadioButton("定时关机")self.delay_time_radio = QRadioButton("延时关机")self.fixed_time_radio.setChecked(True)time_type_layout.addWidget(self.fixed_time_radio)time_type_layout.addWidget(self.delay_time_radio)time_type_group.setLayout(time_type_layout)layout.addWidget(time_type_group)# 定时时间选择self.fixed_datetime = QDateTimeEdit()self.fixed_datetime.setDisplayFormat("yyyy-MM-dd HH:mm:ss")self.fixed_datetime.setDateTime(QDateTime.currentDateTime())self.fixed_datetime.setCalendarPopup(True)layout.addWidget(self.fixed_datetime)# 延时时间选择self.delay_datetime = QDateTimeEdit()self.delay_datetime.setDisplayFormat("HH:mm:ss")self.delay_datetime.setTime(QTime(0, 0, 0))self.delay_datetime.setVisible(False)layout.addWidget(self.delay_datetime)# 连接信号self.fixed_time_radio.toggled.connect(self.on_time_type_changed)# 操作类型action_group = QGroupBox("操作类型")action_layout = QHBoxLayout()action_layout.setContentsMargins(10, 15, 10, 10)self.shutdown_radio = QRadioButton("关机")self.restart_radio = QRadioButton("重启")self.logoff_radio = QRadioButton("注销")self.shutdown_radio.setChecked(True)action_layout.addWidget(self.shutdown_radio)action_layout.addWidget(self.restart_radio)action_layout.addWidget(self.logoff_radio)action_group.setLayout(action_layout)layout.addWidget(action_group)# 选项options_group = QGroupBox("选项")options_layout = QVBoxLayout()options_layout.setContentsMargins(10, 15, 10, 10)self.auto_start_check = QCheckBox("随系统启动")self.loop_exec_check = QCheckBox("循环执行")options_layout.addWidget(self.auto_start_check)options_layout.addWidget(self.loop_exec_check)options_group.setLayout(options_layout)layout.addWidget(options_group)# 剩余时间显示self.remaining_time_label = QLabel()self.remaining_time_label.setAlignment(Qt.AlignCenter)self.remaining_time_label.setObjectName("remaining_time_label")layout.addWidget(self.remaining_time_label)# 按钮布局button_layout = QHBoxLayout()button_layout.setContentsMargins(0, 10, 0, 0)button_layout.setSpacing(15)self.save_btn = QPushButton("保存设置")self.cancel_btn = QPushButton("取消")self.cancel_btn.setObjectName("cancel_btn")self.cancel_btn.setEnabled(False)self.save_btn.clicked.connect(self.save_config)self.cancel_btn.clicked.connect(self.cancel_task)button_layout.addWidget(self.save_btn)button_layout.addWidget(self.cancel_btn)layout.addLayout(button_layout)# 添加弹簧使布局更紧凑layout.addSpacerItem(QSpacerItem(20, 10, QSizePolicy.Minimum, QSizePolicy.Expanding))def on_time_type_changed(self, checked):self.fixed_datetime.setVisible(checked)self.delay_datetime.setVisible(not checked)def update_current_time(self):current_time = datetime.now().strftime("%Y年%m月%d日 %H:%M:%S")self.current_time_label.setText(f"当前时间: {current_time}")def save_config(self):config = configparser.ConfigParser()config['task'] = {'time_type': 'fixed' if self.fixed_time_radio.isChecked() else 'delay','time': self.fixed_datetime.dateTime().toString("HHmmss") if self.fixed_time_radio.isChecked() else self.delay_datetime.time().toString("HHmmss"),'execute_type': 'shutdown' if self.shutdown_radio.isChecked() else 'restart' if self.restart_radio.isChecked() else 'logoff','auto_start': '1' if self.auto_start_check.isChecked() else '0','task_circ': '1' if self.loop_exec_check.isChecked() else '0'}with open(self.config_file, 'w') as f:config.write(f)self.set_auto_start(self.auto_start_check.isChecked())self.cancel_btn.setEnabled(True) # 保存后启用取消按钮self.start_task()def load_config(self):if not os.path.exists(self.config_file):returnconfig = configparser.ConfigParser()config.read(self.config_file)if 'task' in config:task_config = config['task']# 时间类型if task_config.get('time_type', 'fixed') == 'fixed':self.fixed_time_radio.setChecked(True)time_str = task_config.get('time', '000000')qtime = QTime.fromString(time_str, "HHmmss")current_date = QDateTime.currentDateTime()self.fixed_datetime.setDateTime(QDateTime(current_date.date(), qtime))else:self.delay_time_radio.setChecked(True)time_str = task_config.get('time', '000000')qtime = QTime.fromString(time_str, "HHmmss")self.delay_datetime.setTime(qtime)# 操作类型execute_type = task_config.get('execute_type', 'shutdown')if execute_type == 'shutdown':self.shutdown_radio.setChecked(True)elif execute_type == 'restart':self.restart_radio.setChecked(True)else:self.logoff_radio.setChecked(True)# 选项self.auto_start_check.setChecked(task_config.get('auto_start', '0') == '1')self.loop_exec_check.setChecked(task_config.get('task_circ', '0') == '1')if self.loop_exec_check.isChecked():self.cancel_btn.setEnabled(True)self.start_task()def set_auto_start(self, enable):key = win32con.HKEY_CURRENT_USERsub_key = r"Software\Microsoft\Windows\CurrentVersion\Run"try:reg_key = win32api.RegOpenKey(key, sub_key, 0, win32con.KEY_ALL_ACCESS)if enable:win32api.RegSetValueEx(reg_key, "定时关机", 0, win32con.REG_SZ, sys.executable)else:try:win32api.RegDeleteValue(reg_key, "定时关机")except:passwin32api.RegCloseKey(reg_key)except Exception as e:QMessageBox.warning(self, "警告", f"设置自启动失败: {str(e)}")def start_task(self):if self.task_running:returnself.task_running = Trueself.toggle_components(True)if self.fixed_time_radio.isChecked():target_time = self.fixed_datetime.dateTime().toPyDateTime()now = datetime.now()if target_time < now:target_time += timedelta(days=1)self.target_time = target_timeelse:delay = self.delay_datetime.time()self.target_time = datetime.now() + timedelta(hours=delay.hour(),minutes=delay.minute(),seconds=delay.second())self.countdown_timer.start(1000)self.update_remaining_time()def update_remaining_time(self):now = datetime.now()remaining = self.target_time - nowif remaining.total_seconds() <= 0:self.execute_action()if self.loop_exec_check.isChecked():self.start_task()else:self.cancel_task()returnhours, remainder = divmod(int(remaining.total_seconds()), 3600)minutes, seconds = divmod(remainder, 60)remaining_str = f"{hours}小时{minutes}分{seconds}秒"self.remaining_time_label.setText(f"剩余时间: {remaining_str}")# 更新托盘提示self.tray_icon.setToolTip(f"定时关机\n剩余时间: {remaining_str}")def execute_action(self):if self.shutdown_radio.isChecked():os.system("shutdown -s -t 0")elif self.restart_radio.isChecked():os.system("shutdown -r -t 0")else:os.system("shutdown -l")def cancel_task(self):"""取消定时任务"""if not self.task_running:QMessageBox.warning(self, "警告", "没有正在运行的任务")returnreply = QMessageBox.question(self, "确认", "确定要取消定时任务吗?", QMessageBox.Yes | QMessageBox.No)if reply == QMessageBox.Yes:self.task_running = Falseself.countdown_timer.stop()self.remaining_time_label.setText("")self.tray_icon.setToolTip("定时关机")self.toggle_components(False)self.cancel_btn.setEnabled(False)# 显示取消成功的提示QMessageBox.information(self, "提示", "定时任务已取消", QMessageBox.Ok)def toggle_components(self, disabled):self.fixed_time_radio.setDisabled(disabled)self.delay_time_radio.setDisabled(disabled)self.fixed_datetime.setDisabled(disabled)self.delay_datetime.setDisabled(disabled)self.shutdown_radio.setDisabled(disabled)self.restart_radio.setDisabled(disabled)self.logoff_radio.setDisabled(disabled)self.auto_start_check.setDisabled(disabled)self.loop_exec_check.setDisabled(disabled)self.save_btn.setDisabled(disabled)def tray_icon_activated(self, reason):if reason == QSystemTrayIcon.DoubleClick:self.show_normal()def show_normal(self):self.show()self.setWindowState(self.windowState() & ~Qt.WindowMinimized)self.activateWindow()self.raise_()def closeEvent(self, event):"""重写关闭事件,改为最小化到托盘"""if self.isVisible():self.hide()self.tray_icon.show() # 确保托盘图标显示if not self.first_show: # 第一次启动时不显示消息self.tray_icon.showMessage("定时关机", "程序已最小化到托盘", QSystemTrayIcon.Information, 2000)self.first_show = Falseevent.ignore()else:# 真正退出程序self.tray_icon.hide()event.accept()def confirm_exit(self):reply = QMessageBox.question(self, '确认', '是否退出?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if reply == QMessageBox.Yes:self.tray_icon.hide()QApplication.quit()def main():# 防止重复运行shared = QSharedMemory("定时关机")if not shared.create(512, QSharedMemory.ReadWrite):QMessageBox.warning(None, "警告", "程序已经在运行!")sys.exit(0)# 设置高DPI支持QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)app = QApplication(sys.argv)window = ShutdownApp()# 如果配置了随系统启动且循环执行,则不显示窗口config_file = os.path.join(os.getenv('APPDATA'), 'shutdown_config.ini')if os.path.exists(config_file):config = configparser.ConfigParser()config.read(config_file)if 'task' in config and config['task'].get('auto_start', '0') == '1':if config['task'].get('task_circ', '0') == '1':window.showMinimized()else:window.show()else:window.show()else:window.show()sys.exit(app.exec_())if __name__ == '__main__':main()
🎉 总结与优化方向
🔹 优点
✅ 界面简洁,操作方便
✅ 系统托盘支持,后台静默运行
✅ 支持定时 & 倒计时模式,满足不同需求
🔹 可优化方向
🚀 支持多任务管理(同时设置多个定时任务)
🚀 增加日志记录(记录每次关机任务)
🚀 增加任务进度条(倒计时可视化显示)
如果你对这个工具感兴趣,可以尝试优化它,让它变得更加智能!💡
你会如何改进这个工具?欢迎在评论区交流你的想法! 🚀
📥 资源下载
- 源码以及exe文件直接下载 ZIP:🔗 点此下载
🚀 赶快下载体验吧,如果觉得有帮助,欢迎 Star 支持!
相关文章:
【Python 开源】你的 Windows 关机助手——PyQt5 版定时关机工具
🖥️ 你的 Windows 关机助手——PyQt5 版定时关机工具 相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着开源精神的…...
布局决定终局:基于开源AI大模型、AI智能名片与S2B2C商城小程序的战略反推思维
摘要:在商业竞争日益激烈的当下,布局与终局预判成为企业成功的关键要素。本文探讨了布局与终局预判的智慧性,强调其虽无法做到百分之百准确,但能显著提升思考能力。终局思维作为重要战略工具,并非一步到位的战略部署&a…...
vue3循环表单【以el-form组件为例】,如何校验所有表单,所有表单校验通过后提交
1.循环时,在组件标签上使用ref绑定组件实例 3.如何校验所有表单都通过后方可提交?利用promise.all()判断 代码如下: <template><div><!-- 循环渲染表单 --><el-formv-for"(formItem, index) in formList":…...
量子代理签名:量子时代的数字授权革命
1. 量子代理签名的定义与核心原理 量子代理签名(Quantum Proxy Signature, QPS)是经典代理签名在量子信息领域的延伸,允许原始签名者(Original Signer)授权给代理签名者(Proxy Signer)代为签署文…...
HTTPS代理的实际优势,如何选择HTTPS代理服务?
在数字化时代,网络请求的安全性和效率成为企业和个人用户关注的焦点。HTTPS代理作为一种强大的工具,不仅在数据安全方面表现出色,还在安全访问、突破地域限制以及支持复杂任务等方面展现出多样化的优势。本文将深入探讨HTTPS代理的实际优势&a…...
Java 中常见的数据结构
目录 1. List (列表) 2)ArrayList 2)LinkedList 2. Set (集合) 1)HashSet 2)TreeSet 3. Map (映射) 1)HashMap 2)TreeMap 4. Queue (队列) 1)LinkedList (也实现了Queue接口) 2&…...
Transformer多卡训练初始化分布式环境:(backend=‘nccl‘)
Transformer多卡训练初始化分布式环境:(backend=‘nccl’) dist.init_process_group(backend=nccl)在多卡环境下初始化分布式训练环境,并为每个进程分配对应的 GPU 设备。下面为你逐行解释代码的含义: 1. 初始化分布式进程组 try:dist.init_process_group(backend=nccl) e…...
云曦月末断网考核复现
Web 先看一个BUUCTF中的文件一个上传题 [BUUCTF] 2020新生赛 Upload 打开后是一个文件上传页面 随便上传一个txt一句话木马后出现js弹窗,提示只能上传图片格式文件 说明有前端验证。我的做法是把一句话改为.jpg格式, 然后上传 访问发现虽然上传成功了…...
SQL Server AlwaysOn (SQL 查询数据详解及监控用途)
修正后的完整查询 SELECT ar.replica_server_name AS [副本名称],ar.availability_mode_desc AS [同步模式],DB_NAME(dbr.database_id) AS [数据库名称],dbr.database_state_desc AS [数据库状态],dbr.synchronization_state_desc AS [同步状态],dbr.synchronization_health_d…...
使用 Q - learning 算法解决迷宫路径规划问题
整体功能概述 这段 Python 代码实现了一个使用 Q - learning 算法解决迷宫路径规划问题的程序。智能体在给定的迷宫环境中学习如何找到从起点到终点的最优路径,以获得最大奖励。 模块导入 python import numpy as np import randomnumpy:用于处理数组…...
SqlYog无限试用方法
1、WinR ,输入 :regedit 回车 2、进入注册表,在 \HEYK_CURRENT_USER\Software\{*********-D8CE-4637-9BC7-93E************}下的【InD100】保存着SQLyog的使用天数 3、在【InD】上右键,点击删除该项,在重启SQLyog后注册表中会重…...
14 nginx 的 dns 缓存的流程
前言 这个是 2020年11月 记录的这个关于 nginx 的 dns 缓存的问题 docker 环境下面 前端A连到后端B 前端B连到后端A 最近从草稿箱发布这个问题的时候, 重新看了一下 发现该问题的记录中仅仅是 定位到了 nginx 这边的 dns 缓存的问题, 但是 并没有到细节, 没有到 具体的 n种…...
Spring Cloud Gateway 具体的实现案例
文章目录 前言✅ 1. **创建 Spring Boot 项目**Maven 依赖:Gradle 依赖: ✅ 2. **配置 application.yml 路由和过滤器**解释: ✅ 3. **创建自定义过滤器**3.1 **前置过滤器(Pre Filter)**3.2 **后置过滤器(…...
css易混淆的知识点
子选择器 (>) vs 后代选择器 (空格) 子选择器 (>) 只匹配直接子元素。后代选择器 (空格) 匹配所有后代元素(无论嵌套多深)。 绝对定位vs相对定位 布局: justify-content 的作用 控制子元素在主轴上的分布方式。常见值包括 flex-start、…...
OpenCV 图形API(27)图像滤波-----膨胀函数dilate()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用特定的结构元素膨胀图像。 cv::gapi::dilate 是 OpenCV G-API 模块中的一个函数,用于对图像执行膨胀操作。膨胀是一种形态学操作…...
13. Git 远程仓库配置
基本步骤 以Gitee为例子,GitHub的步骤也基本一致 1.注册/登录 Gitee 账号 https://gitee.com/ 2.新建仓库 3.配置仓库 根据自己的喜好,配置即可。 4.生成SSH密钥 ssh-keygen -t ed25519 -C "你的邮箱example.com"-t ed25519:使…...
语音识别——根据声波能量、VAD 和 频谱分析实时输出文字
ASR(语音识别)是将音频信息转化为文字的技术。在实时语音识别中,一个关键问题是:如何决定将采集的音频数据输入大模型的最佳时机?固定时间间隔显然不够灵活,太短可能导致频繁调用模型,太长则会延迟文字输出。有没有更智能的方式?答案是肯定的。 一种常见的解决方案是使…...
netty中的ChannelHandler详解
Netty中的ChannelHandler是网络事件和数据处理的核心执行单元,负责处理I/O事件(如连接建立、数据读写)以及业务逻辑的实现。它通过ChannelPipeline形成责任链,实现事件的动态编排与传播。以下从功能分类、核心机制到实际应用进行详细解析: 1. ChannelHandler的核心功能与分…...
介绍一下freertos
FreeRTOS 是一款开源的实时操作系统(RTOS),专为嵌入式系统和微控制器设计,以轻量级、高可靠性、低延迟著称。它广泛应用于物联网(IoT)、工业自动化、消费电子等领域。以下是详细介绍: …...
使用克魔助手查看iOS 应用程序使用历史记录和耗能历史记录
使用克魔助手查看iOS 应用程序使用历史记录和耗能历史记录 功能概述 克魔助手无需越狱即可访问iOS上各个应用程序的历史记录,包括: 最近几个月的app的详细启动时间记录,结束时间,app使用的硬件组件应用的耗能具体情况ÿ…...
mysql和mongodb
1.mongodb 写入更快,数据结构频繁更新,这个不方便工程管理.另外会序列化成json格式,比如为json的成员建立索引,这都是比较损耗性能。字段太多,moondbjson名太多,导致数据冗余, moongodb频繁按字段更新&…...
介绍一下 ChibiOS
ChibiOS 是一款专为嵌入式系统设计的开源实时操作系统(RTOS),以其硬实时性能、轻量化架构和高可移植性著称。它广泛应用于无人机、机器人、工业控制等领域,尤其在无人机飞控(如 ArduPilot 的某些硬件平台&…...
《Vue Router实战教程》3.动态路由匹配
欢迎观看《Vue Router 实战(第4版)》视频课程 动态路由匹配 带参数的动态路由匹配 很多时候,我们需要将给定匹配模式的路由映射到同一个组件。例如,我们可能有一个 User 组件,它应该对所有用户进行渲染,…...
NLP高频面试题(四十)——什么是 BitFit?
BitFit(Bias-term Fine-tuning)是一种参数高效的微调方法,专注于在预训练模型中仅调整偏置项(bias term),而将其他参数保持不变。这种方法在自然语言处理领域,尤其是在中小规模数据集上,展现出了与全量微调相媲美的性能,同时显著减少了计算资源的消耗。 什么是 BitFi…...
react+Tesseract.js实现前端拍照获取/选择文件等文字识别OCR
需求背景 在开发过程中可能会存在用户上传一张图片后下方需要自己识别出来文字数字等信息,有的时候会通过后端来识别后返回,但是也会存在纯前端去识别的情况,这个时候就需要使用到Tesseract.js这个库了 附Tesseract.js官方(htt…...
go:实现最简单区块链
1.新建文件夹命名为blockchain,在此文件夹下分别创建两个文件一个为block.go另一个为chain.go如下图所示: 2.写入代码: block.go package blockchainimport ("bytes""crypto/sha256""encoding/gob""log""strconv""ti…...
使用Python写入JSON、XML和YAML数据到Excel文件
在当今数据驱动的技术生态中,JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体。然而,当需要将这类半结构化数据转化为具备直观可视化、动态计算和协作共享特性的载体时&…...
如何使用通义灵码玩转Linux - AI编程助手提升效率
一、引言 Linux 作为服务器常用的操作系统,其命令行界面、繁多的命令以及需要进行的配置等,都给初学者带来了不小的挑战。为了帮助初学者快速上手 Linux,本文将介绍如何使用通义灵码这一智能编码助手,提升在 Linux 环境下的开发效…...
主服务器和子服务器之间通过NFS实现文件夹共享
背景: 子服务器想做一个备份服务器 但是之前有很多文件是上传到本地的,于是服务要从本地读取文件 但是在不在同一台服务器中,读取就会有问题,想 实现在两者之间创建一个共享文件夹 一 NFS挂载步骤: 在主服务器&#…...
前端知识点---防抖(javascript)
什么是防抖 ? 防抖:单位时间内,频繁触发事件,只执行最后一次 举例: 百度输入框, 输入一个字母下面就会有提示 输入第二个字母下面的提示就会变 而别的浏览器只有在你输入结束之后才出现提示, 这就是做了防抖处理 使用场景: 搜索框搜索输入。只需用户…...
django rest framework相关面试题
django rest framework相关面试题 1.什么是restful规范 link link link link...
突破性能瓶颈:Java微服务多任务管理的架构设计与实践
摘要 本文深度解析Java微服务架构下的多任务管理机制,围绕串行任务、并行任务及跨服务器协同三大核心场景,结合线程池、任务队列、分布式调度算法等关键技术,探讨如何通过精细化的任务拆分、资源调度和容错设计实现系统高吞吐与低延迟。 关…...
为啥物联网用MQTT?
前言 都说物联网用MQTT,那分别使用Http和Mqtt发送“Hello”,比较一下就知道啦 HTTP HTTP请求报文由请求行、头部字段和消息体组成。一个最简单的HTTP POST请求如下: POST / HTTP/1.1 Host: example.com Content-Length: 5 Content-Type: …...
onenote的使用技巧以及不足之处
OneNote我用了三年了,感觉这软件还是记一些手写笔记会比较好吧,记和编程有关的就显然不如markdown了, 插入公式: 按alt输入公式,再按退出公式输入 不足之处: onenote是我用了很长时间的一款笔记软件&…...
人工智能在医疗设备中的最新应用案例与技术挑战?
人工智能(AI)在医疗设备中的应用正以前所未有的速度发展,带来了许多创新和改进。以下是一些最新的应用案例和相关的技术挑战: 最新应用案例 智能诊断和成像: AI技术在医学影像分析中得到了广泛应用。通过深度学习算法…...
TDengine 语言连接器(Rust)
简介 taos 是 TDengine 的官方 Rust 语言连接器,Rust 开发人员可以通过它开发存取 TDengine 数据库的应用软件。 该 Rust 连接器的源码托管在 GitHub。 Rust 版本兼容性 支持 Rust 1.70 及以上版本。 支持的平台 原生连接支持的平台和 TDengine 客户端驱动支持…...
Leetcode 58. 最后一个单词的长度
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s "Hello World" 输出:5…...
如何使用CAPL解析YAML文件?
🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…...
如何让老电脑运行快些(极限榨干老电脑硬件)
要让老电脑运行更快,可以通过增加虚拟内存、优化系统设置和硬件升级等方法实现。以下是具体建议: 1. 增加虚拟内存(适合硬盘空间大的老电脑) 虚拟内存(页面文件)是硬盘上的一部分空间,用于扩展…...
C++在嵌入式中表现如何?
C在嵌入式中表现如何? 作为一个从机械转行到嵌入式开发的老兵,我深深体会到了C在嵌入式领域的独特魅力与挑战。从最初在厦门某马写单片机代码时的纯C语言,到后来在世界500强外企开发汽车电子项目时大量使用C,这些年的经历让我对这…...
Elasticsearch 系列专题 - 第四篇:聚合分析
聚合(Aggregation)是 Elasticsearch 的强大功能之一,允许你对数据进行分组、统计和分析。本篇将从基础到高级逐步讲解聚合的使用,并结合实际案例展示其应用。 1. 聚合基础 1.1 什么是聚合(Aggregation)? 聚合是对文档集合的统计分析,类似于 SQL 中的 GROUP BY 和聚合…...
TensorFlow充分并行化使用CPU
关键字:TensorFlow 并行化、TensorFlow CPU多线程 场景:在没有GPU或者GPU性能一般、环境不可用的机器上,对于多核CPU,有时TensorFlow或上层的Keras默认并没有完全利用机器的计算能力(CPU占用没有接近100%)…...
JAVA Web_定义Servlet_1 欢迎考生
题目 假定:本地服务器(127.0.0.1)上有一名为jspExam的Web项目,现按要求定义一Servlet,实现以下功能: 1)Servlet的类名自定义,假定可以用以下url访问该Servlet, http://127.0.0.1:80…...
鸿蒙NEXT开发Emitter工具类(ArkTs)
import { emitter } from kit.BasicServicesKit;/*** TODO Emitter工具类(进行线程间通信)* author: 鸿蒙布道师* since: 2025/04/11*/ export class EmitterUtil {/*** 发送事件* param eventId 事件ID,string类型的eventId不支持空字符串。…...
vue项目引入tailwindcss
vue3项目引入tailwindcss vue3 vite tailwindcss3 版本 初始化项目 npm create vitelatest --template vue cd vue npm install npm run dev安装tailwindcss3 和 postcss 引入 npm install -D tailwindcss3 postcss autoprefixer // 初始化引用 npx tailwindcss init -p…...
Quartz修仙指南:从定时任务萌新到调度大能的终极奥义
各位被Thread.sleep()和ScheduledExecutorService折磨的道友们!今天要解锁的是Java界任务调度至尊法宝——Quartz!这货能让你像玉皇大帝安排天庭日程一样,精确控制每个任务的执行时机!准备好告别蹩脚的手动定时器了吗?…...
Process Explorer 性能调优实战:精准定位资源泄漏与高负载进程
一、下载与安装 下载地址 Process Explorer安装包下载:https://pan.quark.cn/s/950c36ba5364下载后解压压缩包,运行 procexp.exe(32 位系统)或 procexp64.exe(64 位系统)。 界面概览 主界面以树…...
Docker 常用命令指南
Docker 提供了丰富的命令行工具来管理镜像、容器、网络和数据卷等资源。本指南按类别整理 Docker 的常用命令,并为每个命令提供简体中文说明和示例,以帮助您快速查询和掌握日常使用。 1. 镜像管理 Docker 镜像(Image)是打包好的应用程序及其依赖环境,可用于创建容器。常用…...
3.1A、34V DC/DC 同步降压转换器WD5034
以下是对 WD5034 相关内容的编辑: WD5034 是一款性能卓越的高效率、单片同步降压 DC/DC 转换器,凭借其先进的恒定频率、平均电流模式控制架构,在众多电源管理芯片中脱颖而出。以下是其详细特点和优势: 出色的负载能力:…...
面向对象高级(1)
文章目录 final认识final关键字修饰类:修饰方法:修饰变量final修饰变量的注意事项 常量 单例类什么是设计模式?单例怎么写?饿汉式单例的特点是什么?单例有啥应用场景,有啥好处?懒汉式单例类。 枚举类认识枚…...