Skip to content

Commit 037d4da

Browse files
committed
add lock for independent task
1 parent 62492b3 commit 037d4da

File tree

7 files changed

+146
-94
lines changed

7 files changed

+146
-94
lines changed

BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs

+14-9
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@ public class AutoDomainTask
4242

4343
private readonly AutoDomainConfig _config;
4444

45-
private bool IsRunning { get; set; }
46-
4745
public AutoDomainTask(AutoDomainParam taskParam)
4846
{
4947
_taskParam = taskParam;
@@ -54,13 +52,20 @@ public AutoDomainTask(AutoDomainParam taskParam)
5452
_clickOffset = new ClickOffset(captureArea.X, captureArea.Y, assetScale);
5553
_combatCommands = CombatScriptParser.Parse(_taskParam.CombatStrategyContent);
5654
_config = TaskContext.Instance().Config.AutoDomainConfig;
57-
IsRunning = false;
5855
}
5956

6057
public async void Start()
6158
{
59+
var hasLock = false;
6260
try
6361
{
62+
Monitor.TryEnter(TaskContext.TaskLocker, ref hasLock);
63+
if (!hasLock)
64+
{
65+
Logger.LogError("启动自动秘境功能失败:当前存在正在运行中的独立任务,请不要重复执行任务!");
66+
return;
67+
}
68+
6469
Init();
6570
var combatScenes = new CombatScenes().InitializeTeam(GetContentFromDispatcher());
6671

@@ -125,13 +130,16 @@ public async void Start()
125130
TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.OnlyTrigger);
126131
TaskSettingsPageViewModel.SetSwitchAutoDomainButtonText(false);
127132
Logger.LogInformation("→ {Text}", "自动秘境结束");
128-
IsRunning = false;
133+
134+
if (hasLock)
135+
{
136+
Monitor.Exit(TaskContext.TaskLocker);
137+
}
129138
}
130139
}
131140

132141
private void Init()
133142
{
134-
IsRunning = true;
135143
LogScreenResolution();
136144
if (_taskParam.DomainRoundNum == 9999)
137145
{
@@ -374,7 +382,6 @@ private bool IsDomainEnd()
374382
return false;
375383
}
376384

377-
378385
/// <summary>
379386
/// 旋转视角后寻找石化古树
380387
/// </summary>
@@ -665,10 +672,8 @@ private bool GettingTreasure(bool recognizeResin, bool isLastTurn)
665672
Sleep(800, _taskParam.Cts);
666673
}
667674

668-
669675
Sleep(1000, _taskParam.Cts);
670676

671-
672677
var captureArea = TaskContext.Instance().SystemInfo.CaptureAreaRect;
673678
for (var i = 0; i < 30; i++)
674679
{
@@ -757,4 +762,4 @@ private bool GettingTreasure(bool recognizeResin, bool isLastTurn)
757762
Logger.LogInformation("剩余:浓缩树脂 {CondensedResinCount} 脆弱树脂 {FragileResinCount}", condensedResinCount, fragileResinCount);
758763
return (condensedResinCount, fragileResinCount);
759764
}
760-
}
765+
}

BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs

+15-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Microsoft.Extensions.Logging;
88
using System;
99
using System.Collections.Generic;
10+
using System.Threading;
1011
using System.Threading.Tasks;
1112
using static BetterGenshinImpact.GameTask.Common.TaskControl;
1213
using static Vanara.PInvoke.Gdi32;
@@ -27,8 +28,16 @@ public AutoFightTask(AutoFightParam taskParam)
2728

2829
public async void Start()
2930
{
31+
var hasLock = false;
3032
try
3133
{
34+
Monitor.TryEnter(TaskContext.TaskLocker, ref hasLock);
35+
if (!hasLock)
36+
{
37+
Logger.LogError("启动自动战斗功能失败:当前存在正在运行中的独立任务,请不要重复执行任务!");
38+
return;
39+
}
40+
3241
Init();
3342
var combatScenes = new CombatScenes().InitializeTeam(GetContentFromDispatcher());
3443
if (!combatScenes.CheckTeamInitialized())
@@ -78,6 +87,11 @@ await Task.Run(() =>
7887
TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.OnlyTrigger);
7988
TaskSettingsPageViewModel.SetSwitchAutoFightButtonText(false);
8089
Logger.LogInformation("→ {Text}", "自动战斗结束");
90+
91+
if (hasLock)
92+
{
93+
Monitor.Exit(TaskContext.TaskLocker);
94+
}
8195
}
8296
}
8397

@@ -98,4 +112,4 @@ private void LogScreenResolution()
98112
Logger.LogWarning("游戏窗口分辨率不是 1920x1080 !当前分辨率为 {Width}x{Height} , 非 1920x1080 分辨率的游戏可能无法正常使用自动战斗功能 !", gameScreenSize.Width, gameScreenSize.Height);
99113
}
100114
}
101-
}
115+
}

BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Duel.cs

+13
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,17 @@ public async Task RunAsync(GeniusInvokationTaskParam taskParam)
5959

6060
public void Run(GeniusInvokationTaskParam taskParam)
6161
{
62+
var hasLock = false;
6263
Cts = taskParam.Cts;
6364
try
6465
{
66+
Monitor.TryEnter(TaskContext.TaskLocker, ref hasLock);
67+
if (!hasLock)
68+
{
69+
_logger.LogError("启动自动七圣召唤功能失败:当前存在正在运行中的独立任务,请不要重复执行任务!");
70+
return;
71+
}
72+
6573
LogScreenResolution();
6674
_logger.LogInformation("========================================");
6775
_logger.LogInformation("→ {Text}", "全自动七圣召唤,启动!");
@@ -312,6 +320,11 @@ public void Run(GeniusInvokationTaskParam taskParam)
312320
TaskSettingsPageViewModel.SetSwitchAutoGeniusInvokationButtonText(false);
313321
_logger.LogInformation("← {Text}", "退出全自动七圣召唤");
314322
taskParam.Dispatcher.StartTimer();
323+
324+
if (hasLock)
325+
{
326+
Monitor.Exit(TaskContext.TaskLocker);
327+
}
315328
}
316329
}
317330

BetterGenshinImpact/GameTask/AutoWood/AutoWoodTask.cs

+14
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using System;
1212
using System.Diagnostics;
1313
using System.Linq;
14+
using System.Threading;
1415
using static BetterGenshinImpact.GameTask.Common.TaskControl;
1516
using static Vanara.PInvoke.User32;
1617

@@ -41,8 +42,16 @@ public AutoWoodTask()
4142

4243
public void Start(WoodTaskParam taskParam)
4344
{
45+
var hasLock = false;
4446
try
4547
{
48+
Monitor.TryEnter(TaskContext.TaskLocker, ref hasLock);
49+
if (!hasLock)
50+
{
51+
Logger.LogError("启动自动伐木功能失败:当前存在正在运行中的独立任务,请不要重复执行任务!");
52+
return;
53+
}
54+
4655
TaskTriggerDispatcher.Instance().StopTimer();
4756
Logger.LogInformation("→ {Text} 设置伐木总次数:{Cnt}", "自动伐木,启动!", taskParam.WoodRoundNum);
4857

@@ -97,6 +106,11 @@ public void Start(WoodTaskParam taskParam)
97106
TaskSettingsPageViewModel.SetSwitchAutoWoodButtonText(false);
98107
Logger.LogInformation("← {Text}", "退出自动伐木");
99108
taskParam.Dispatcher.StartTimer();
109+
110+
if (hasLock)
111+
{
112+
Monitor.Exit(TaskContext.TaskLocker);
113+
}
100114
}
101115
}
102116

BetterGenshinImpact/GameTask/TaskContext.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace BetterGenshinImpact.GameTask
1313
public class TaskContext
1414
{
1515
private static TaskContext? _uniqueInstance;
16-
private static readonly object Locker = new();
16+
private static readonly object InstanceLocker = new();
1717

1818
private TaskContext()
1919
{
@@ -23,7 +23,7 @@ public static TaskContext Instance()
2323
{
2424
if (_uniqueInstance == null)
2525
{
26-
lock (Locker)
26+
lock (InstanceLocker)
2727
{
2828
_uniqueInstance ??= new TaskContext();
2929
}
@@ -41,6 +41,8 @@ public void Init(IntPtr hWnd)
4141
IsInitialized = true;
4242
}
4343

44+
public static readonly object TaskLocker = new();
45+
4446
public bool IsInitialized { get; set; }
4547

4648
public IntPtr GameHandle { get; set; }
@@ -49,10 +51,8 @@ public void Init(IntPtr hWnd)
4951

5052
public float DpiScale { get; set; }
5153

52-
5354
public SystemInfo SystemInfo { get; set; }
5455

55-
5656
public AllConfig Config
5757
{
5858
get
@@ -74,4 +74,4 @@ public AllConfig Config
7474
/// </summary>
7575
public DateTime LinkedStartGenshinTime { get; set; } = DateTime.MinValue;
7676
}
77-
}
77+
}

BetterGenshinImpact/GameTask/TaskTriggerDispatcher.cs

+7-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using BetterGenshinImpact.GameTask.AutoDomain;
1+
using BetterGenshinImpact.Core.Config;
2+
using BetterGenshinImpact.GameTask.AutoDomain;
23
using BetterGenshinImpact.GameTask.AutoFight;
34
using BetterGenshinImpact.GameTask.AutoGeniusInvokation;
45
using BetterGenshinImpact.GameTask.AutoWood;
@@ -9,21 +10,18 @@
910
using BetterGenshinImpact.View;
1011
using Fischless.GameCapture;
1112
using Microsoft.Extensions.Logging;
13+
using OpenCvSharp;
14+
using OpenCvSharp.Extensions;
1215
using System;
1316
using System.Collections.Generic;
1417
using System.Diagnostics;
1518
using System.Drawing;
19+
using System.Drawing.Imaging;
20+
using System.IO;
1621
using System.Linq;
1722
using System.Threading;
1823
using System.Threading.Tasks;
19-
using BetterGenshinImpact.Core.Config;
2024
using Vanara.PInvoke;
21-
using System.IO;
22-
using System.Drawing.Imaging;
23-
using OpenCvSharp;
24-
using OpenCvSharp.Extensions;
25-
using static System.Windows.Forms.VisualStyles.VisualStyleElement.TrackBar;
26-
using Point = OpenCvSharp.Point;
2725

2826
namespace BetterGenshinImpact.GameTask
2927
{
@@ -308,7 +306,6 @@ public void Tick(object? sender, EventArgs e)
308306
return;
309307
}
310308

311-
312309
var speedTimer = new SpeedTimer();
313310
// 捕获游戏画面
314311
var bitmap = GameCapture.Capture();
@@ -484,4 +481,4 @@ public void TakeScreenshot()
484481
}
485482
}
486483
}
487-
}
484+
}

0 commit comments

Comments
 (0)