From 89f85d0ea7d86c061bd4809ab9e9678d250bc779 Mon Sep 17 00:00:00 2001 From: Lenheart <947330670@qq.com> Date: Thu, 14 Apr 2022 13:12:00 +0800 Subject: [PATCH] 2211 --- test/STL.h | 2 ++ test/squirrel.cpp | 45 ++++++++++++++++++++++++++++++++++----------- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/test/STL.h b/test/STL.h index 712f437..66b22d1 100644 --- a/test/STL.h +++ b/test/STL.h @@ -16,6 +16,8 @@ struct TimeSTLStruct std::string Name; int Max_Time; int Now_Time; + long long Static_Time; + HANDLE Thand; }; //构造Time类型容器 static std::mapTime_STL; diff --git a/test/squirrel.cpp b/test/squirrel.cpp index 4a755d7..49a3b1e 100644 --- a/test/squirrel.cpp +++ b/test/squirrel.cpp @@ -822,14 +822,14 @@ int squirrel::New_STL(uint32_t v) } - +//时间容器线程 void TimeSTL(LPVOID lpParam) { TimeSTLStruct *pack = (TimeSTLStruct*)lpParam; - int F_Time = (int)GetTickCount64(); + Time_STL[pack->Name].Static_Time = (int)GetTickCount64(); while (true) { - int N_Time = (int)GetTickCount64() - F_Time; + int N_Time = (int)GetTickCount64() - Time_STL[pack->Name].Static_Time; if (N_Time < Time_STL[pack->Name].Max_Time) { Time_STL[pack->Name].Now_Time = N_Time; @@ -855,29 +855,52 @@ int squirrel::Timer_STL(uint32_t v) SQGetInt(v, 3, &MaxTime); //获取容器类型 SQGetInt(v, 4, &Type); - + switch (Type) { - case 0: { + case 0: {//设置时间容器 if (Time_STL.count(Name) != 0)//如果这个标识容器存在 就返回 否则创建 { SQPushBool(v, false); return 1; } - TimeSTLStruct pack; + TimeSTLStruct pack;//定义结构体 pack.Name = Name;//设置容器标识名称 pack.Max_Time = MaxTime;//设置 标识时间容器最大时间 pack.Now_Time = 0;//设置 标识时间容器当前时间 + pack.Static_Time = 0;//设置 基础时间(用于运算) + pack.Thand = NULL;//设置句柄为空 Time_STL[Name] = pack;//设置包给标识时间容器 break; } - case 1: { - DWORD threadID; - CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TimeSTL, &Time_STL[Name], 0, &threadID); + case 1: {//启动时间容器 + if (Time_STL[Name].Thand == NULL)//只有句柄为空的时候new线程 + { + DWORD threadID;//线程ID + Time_STL[Name].Now_Time = 0;//设置当前容器时间 + Time_STL[Name].Thand = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TimeSTL, &Time_STL[Name], 0, &threadID);//创建一个新线程 开始计算时间 并把线程赋予给容器 + } break; } - case 2: - SQPushInt(v, Time_STL[Name].Now_Time); + case 2://获取时间容器 + SQPushInt(v, Time_STL[Name].Now_Time);//返回当前容器时间 return 1; break; + case 3://重置时间容器 + SuspendThread(Time_STL[Name].Thand);//挂起线程 + Time_STL[Name].Static_Time = 0;//基准时间设置为0 + Time_STL[Name].Thand = NULL; + ResumeThread(Time_STL[Name].Thand);//启动线程 + break; + case 4://暂停时间容器 + SuspendThread(Time_STL[Name].Thand);//挂起线程 + break; + case 5://继续时间容器 + Time_STL[Name].Static_Time = (int)GetTickCount64() - Time_STL[Name].Now_Time;//当前时间 减去容器时间 + ResumeThread(Time_STL[Name].Thand);//启动线程 + break; + case 6://销毁时间容器 + CloseHandle(Time_STL[Name].Thand);//销毁线程 + Time_STL.erase(Name);//销毁容器 + break; default: SQPushBool(v, false); return 1;