排序问题 和setInterval setTime out

代码在记事本 HTML文件输入  加入按钮 来运行

 

加入按钮的方法

<input type="button" value="button" onClick ="Btn_Click()"/>

<div id = "txt"></div>
<script>

 

 

//--------------------排序问题--------------------------  每点击一次按钮就让 数字加2 横向输出
 var startIndex = 0               定义一个变量的初始的值为0 
 var direction = 2                 定义一个变量的初始值为2


 function Btn_Click(){         
 txt.innerHTML += startIndex      每次点击之后 横向输出 0
 startIndex += direction                每次点击后变量 startIndex +=2
 if(startIndex==10){            如果 当这个数字等于10的时候执行以下条件
  direction = -2                     这个变量减去2
 }
 if(startIndex==0){              当这个变量等于0的时候
     direction = 2                 这个变量  在加2
  }
 }
 
 //----------------setInterval用法---------------------------
 
 var s =0                  //定义一个 变量S 赋值0
 var stop = true      //逻辑锁
 var td = setInterval(setInt,1000)   //定义的变量 TD 是setInterval  调用setInt方法 并设置时间为1000毫秒
 
 function Btn_Click(){                    //按钮的方法
 if(stop){                                  //当stop 等于ture的时候
 clearInterval(td)                     //清除定时器
 }else{                                    //当以上条件没有满足的时候执行以下方法
 td = setInterval(setInt,1000)            // 每次间隔1秒调用1次setInt 方法

 }
 stop = !stop                // 取反 逻辑锁 是执行else中的条件
 }
 
 function setInt(){ 

 s +=100        //s = s+100
 txt.innerHTML += s +"," 横向显示输出在浏览器上  
 }*/
 //-------------------setTimeout----------------------------
 /*var s = 0
 var td = setTimeout(end,5000) //设置结束时间5秒后执行 end 的方法
 
 function end (){
 txt.innerHTML = "逗"    在浏览器上显示 文字
 }
 
 function Btn_Click(){
 txt.innerHTML = "被中断了"       //点击按钮之后显示文字
 clearTimeout(td)                          //清除定时器
 }*/
 

#include "LogFileProcessor.h" #include "Logger.h" #include <QRegularExpression> #include <QTextStream> #include <QJsonDocument> #include <QJsonParseError> #include <QStandardPaths> LogFileProcessor::LogFileProcessor(const QString &logPath, QObject *parent) : QObject(parent), logPath(logPath) { //初始化状态文件路径 QString appDataDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); QDir dir(appDataDir); if(!dir.exists()) { dir.mkpath(appDataDir); } stateFilePath = dir.filePath("log_reader_state.json"); LOG_INFO(QString("日志状态文件路径: %1").arg(stateFilePath)); fileWatcher = new QFileSystemWatcher(this); checkTimer = new QTimer(this); checkTimer->setInterval(3000); //1分钟检查一次 connect(fileWatcher, &QFileSystemWatcher::fileChanged, this, [this](const QString &path) { // 文件可能被删除或重建,需要重新添加监控 if (!QFile::exists(path)) { fileWatcher->removePath(path); QTimer::singleShot(1000, this, [this, path]() { if (QFile::exists(path)) { fileWatcher->addPath(path); processLogFile(path, true); } }); } else { processLogFile(path, true); } }); connect(checkTimer, &QTimer::timeout, this, &LogFileProcessor::checkDateChange); } void LogFileProcessor::loadState() { QFile stateFile(stateFilePath); if(!stateFile.exists()) { LOG_INFO("日志状态文件不存在,创建新状态"); return; } if(!stateFile.open(QIODevice::ReadOnly)) { LOG_ERROR(QString("无法打开日志状态文件: %1").arg(stateFilePath)); return; } QByteArray data = stateFile.readAll(); stateFile.close(); QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson(data, &error); if(error.error != QJsonParseError::NoError) { LOG_ERROR(QString("日志状态文件解析错误: %1").arg(error.errorString())); return; } if(!doc.isObject()) { LOG_ERROR("日志状态文件格式无效"); return; } filePositions = doc.object(); LOG_INFO("成功加载日志处理状态"); } void LogFileProcessor::saveState() { QFile stateFile(stateFilePath); if(!stateFile.open(QIODevice::WriteOnly)) { LOG_ERROR("无法保存日志状态文件"); return; } stateFile.write(QJsonDocument(filePositions).toJson()); stateFile.close(); LOG_DEBUG("成功保存日志处理状态"); } void LogFileProcessor::startProcessing() { QDir dir(logPath); if(!dir.exists()) { LOG_ERROR(QString("日志路径不存在: %1").arg(logPath)); return; } //加载上次的处理状态 loadState(); //清理两天前的日志 QDate cleanDate = QDate::currentDate().addDays(-1); emit needCleanOldLogs(cleanDate); //处理最近两天的日志文件 QStringList recentFiles = getRecentLogFiles(2); //对文件列表进行排序,确保按日期升序排列 std::sort(recentFiles.begin(), recentFiles.end(), [](const QString &a, const QString &b) { //从文件名提取日期部分并比较 QRegularExpression dateRegex(R"((\d{4}-\d{1,2}-\d{1,2}))"); QRegularExpressionMatch matchA = dateRegex.match(a); QRegularExpressionMatch matchB = dateRegex.match(b); if (matchA.hasMatch() && matchB.hasMatch()) { QDate dateA = QDate::fromString(matchA.captured(1), "yyyy-M-d"); QDate dateB = QDate::fromString(matchB.captured(1), "yyyy-M-d"); return dateA < dateB; } //如果无法提取日期,按文件名排序 return a < b; }); for(const QString& filePath : recentFiles) { processLogFile(filePath,false); } //设置当前文件监控 currentDate = QDate::currentDate(); currentFilePath = getCurrentLogFilePath(); if(!currentFilePath.isEmpty() && QFile::exists(currentFilePath)) { fileWatcher->addPath(currentFilePath); LOG_INFO(QString("开始监控日志文件变化: %1").arg(currentFilePath)); } checkTimer->start(); LOG_INFO("日志文件监控已启动"); } void LogFileProcessor::checkDateChange() { QDate today = QDate::currentDate(); if(today != currentDate) { //保存当前文件状态 saveState(); //日期变化,切换到新文件 QString newFilePath = getCurrentLogFilePath(); if(!newFilePath.isEmpty() && newFilePath != currentFilePath) { if(!currentFilePath.isEmpty()) { fileWatcher->removePath(currentFilePath); } //清理两天前的日志 QDate cleanDate = today.addDays(-2); emit needCleanOldLogs(cleanDate); //处理新文件 if(QFile::exists(newFilePath)) { processLogFile(newFilePath); fileWatcher->addPath(newFilePath); currentFilePath = newFilePath; currentDate = today; LOG_INFO(QString("切换到新日期日志文件: %1").arg(newFilePath)); } } } } void LogFileProcessor::processLogFile(const QString &filePath, bool monitorChanges) { QFileInfo fileInfo(filePath); QString fileName = QFileInfo(filePath).fileName(); QString standardFileName = convertToStandardFileName(fileName); if(!fileInfo.exists()) { LOG_ERROR(QString("日志文件不存在: %1").arg(filePath)); return; } QFile file(filePath); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { LOG_ERROR(QString("无法打开日志文件: %1").arg(filePath)); return; } qint64 lastPos = 0; //如果是监控变化模式,只读取新增内容 if(monitorChanges) { //获取上次读取的位置 lastPos = filePositions.value(standardFileName).toInt(); //如果文件变小了(可能是被重新创建),重置位置 QFileInfo newInfo(filePath); if(newInfo.lastModified() < QDateTime::fromSecsSinceEpoch(0) || file.size() < lastPos || lastPos < 0) { lastPos = 0; } if(lastPos > 0) { if(!file.seek(lastPos)) { LOG_WARNING(QString("无法定位到位置 %1,将从文件开头读取").arg(lastPos)); lastPos = 0; file.seek(0); } } }else { //非监控模式,检查是否已经处理过 if(filePositions.contains(standardFileName)) { LOG_INFO(QString("日志文件 %1 已处理过,跳过").arg(standardFileName)); file.close(); return; } filePositions[standardFileName] = 0; } QTextStream in(&file); int lineCount = 0; int processedLineCount = 0; while(!in.atEnd()) { QString line = in.readLine().trimmed(); lineCount++; //解析日志行格式: 时间 角色英文 角色中文 内容 QRegularExpression re(R"((\d{2}:\d{2}:\d{2})\s+(\S+)\s+(\S+)\s+(.*))"); QRegularExpressionMatch match = re.match(line); if(match.hasMatch()) { QString timeStr = match.captured(1); QString roleE = match.captured(2); QString roleC = match.captured(3); QString content = match.captured(4); // 检查是否是远程客户端连接上线事件 if (content.contains("远程客户端") && content.contains("连接上线")) { isNewClientConnection = true; lastClientConnectionTime = timeStr; processedCommands.clear(); // 清除已处理的命令记录 LOG_DEBUG("检测到新的远程客户端连接,重置命令过滤状态"); } // 检查是否是GetOutput或PING指令 bool isGetOutputOrPing = (content.contains("GetOutput") || (content.contains("PING"))); // 如果是GetOutput或PING指令,并且不是新的客户端连接后的第一次出现 if (isGetOutputOrPing && !isNewClientConnection) { // 检查是否已经处理过相同的命令 if (processedCommands.contains(content)) { LOG_DEBUG(QString("跳过重复的命令: %1").arg(content)); continue; // 跳过重复的命令 } } // 如果是GetOutput或PING指令,并且是新的客户端连接后的第一次出现 if (isGetOutputOrPing && isNewClientConnection) { processedCommands.insert(content); // 记录已处理的命令 isNewClientConnection = false; // 重置标志 } //获取文件日期部分 QFileInfo fileInfo(filePath); QString dateStr = fileInfo.fileName().split('.').first(); QDate date = QDate::fromString(dateStr, "yyyy-M-d"); if(date.isValid()) { QTime time = QTime::fromString(timeStr, "hh:mm:ss"); QDateTime dateTime(date, time); dateTime.setTimeZone(QTimeZone::utc()); emit logProcessed(dateTime, roleE, roleC, content); processedLineCount++; } } } //更新文件位置并保存状态 filePositions[standardFileName] = file.pos(); saveState(); file.close(); LOG_DEBUG(QString("处理日志文件: %1, 读取行数: %2, 有效行数: %3") .arg(filePath).arg(lineCount).arg(processedLineCount)); } QString LogFileProcessor::getCurrentLogFilePath() const { if(logPath.isEmpty()) return QString(); QString fileName = QDate::currentDate().toString("yyyy-M-d") + ".log"; return QDir(logPath).filePath(fileName); } QStringList LogFileProcessor::getRecentLogFiles(int days) const { QStringList recentFiles; QDir dir(logPath); for(int i = 0; i < days; ++i) { QDate date = QDate::currentDate().addDays(-i); QString fileName = date.toString("yyyy-M-d") + ".log"; QString filePath = dir.filePath(fileName); if(QFile::exists(filePath)) { recentFiles.append(filePath); } } return recentFiles; } QString LogFileProcessor::convertToStandardFileName(const QString &fileName) const { QRegularExpression dateRegex(R"((\d{4})-(\d{1,2})-(\d{1,2}))"); QRegularExpressionMatch match = dateRegex.match(fileName); if(match.hasMatch()) { int year = match.captured(1).toInt(); int month = match.captured(2).toInt(); int day = match.captured(3).toInt(); QDate date(year, month, day); if(date.isValid()) { return date.toString("yyyy-M-d") + ".log"; } } return fileName; } 这个实现的监控文件不对啊,我往监控的文件插入数据,结果没反应怎么回事,没有办法监控新插入的数据上传数据库
最新发布
07-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值