Compare commits

..

1 Commits

Author SHA1 Message Date
56334d6a64 테스트 프로젝트 추가 2025-10-15 02:04:16 +09:00
6 changed files with 5 additions and 191 deletions

View File

@@ -7,8 +7,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WarhoundConsole", "Warhound
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WarhoundLib", "WarhoundLib\WarhoundLib.csproj", "{7E3472E9-86E9-4032-826C-0DA805C2EBCE}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WarhoundLib", "WarhoundLib\WarhoundLib.csproj", "{7E3472E9-86E9-4032-826C-0DA805C2EBCE}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WarhoundTest", "WarhoundTest\WarhoundTest.csproj", "{D22BEA2A-08E9-498A-A087-FEFB8FA2AD08}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@@ -23,10 +21,6 @@ Global
{7E3472E9-86E9-4032-826C-0DA805C2EBCE}.Debug|Any CPU.Build.0 = Debug|Any CPU {7E3472E9-86E9-4032-826C-0DA805C2EBCE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7E3472E9-86E9-4032-826C-0DA805C2EBCE}.Release|Any CPU.ActiveCfg = Release|Any CPU {7E3472E9-86E9-4032-826C-0DA805C2EBCE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7E3472E9-86E9-4032-826C-0DA805C2EBCE}.Release|Any CPU.Build.0 = Release|Any CPU {7E3472E9-86E9-4032-826C-0DA805C2EBCE}.Release|Any CPU.Build.0 = Release|Any CPU
{D22BEA2A-08E9-498A-A087-FEFB8FA2AD08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D22BEA2A-08E9-498A-A087-FEFB8FA2AD08}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D22BEA2A-08E9-498A-A087-FEFB8FA2AD08}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D22BEA2A-08E9-498A-A087-FEFB8FA2AD08}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@@ -1,61 +0,0 @@
namespace WarhoundConsole
{
public abstract class Job
{
private readonly TimeSpan interval;
private Task task;
private DateTime lastExecutedTime;
public Job(TimeSpan interval)
{
if (interval <= TimeSpan.Zero)
{
throw new ArgumentOutOfRangeException(nameof(interval));
}
this.interval = interval;
this.task = Task.CompletedTask;
this.lastExecutedTime = DateTime.MinValue;
}
public bool TryExecute()
{
try
{
var now = DateTime.Now;
if (now - this.lastExecutedTime < this.interval)
{
return false;
}
if (!this.task.IsCompleted)
{
// 이 경우 로그를 출력하도록 하고, 타이밍을 조절해야한다.
//Console.WriteLine($"Job skipped at {DateTime.Now}");
return false;
}
this.lastExecutedTime = now;
this.task = Task.Run(async () =>
{
await this.Execute();
});
}
catch (Exception e)
{
Console.WriteLine(e);
}
return true;
}
protected abstract Task Execute();
public void Wait()
{
this.task?.Wait();
}
}
}

View File

@@ -1,66 +1,10 @@
namespace WarhoundConsole
using System.Diagnostics;
namespace WarhoundConsole
{ {
public class Program internal class Program
{ {
public static int Main(string[] args) static void Main(string[] args)
{ {
try Console.WriteLine("Hello, World!");
{
MainInternal(args);
}
catch (Exception e)
{
Console.WriteLine(e);
return -1;
}
return 0;
}
private static void MainInternal(string[] args)
{
Singleton.I.Initialize(new());
var jobs = new List<Job>();
var sw = Stopwatch.StartNew();
while (!Singleton.I.ExitRequested)
{
try
{
sw.Restart();
foreach (var job in jobs)
{
_ = job.TryExecute();
}
sw.Stop();
const int targetFrameTimeMs = 10;
if (sw.Elapsed.Milliseconds < targetFrameTimeMs)
{
Thread.Sleep(targetFrameTimeMs - sw.Elapsed.Milliseconds);
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
foreach (var job in jobs)
{
job.Wait();
}
Shutdown();
}
private static void Shutdown()
{
// DO SOMETHING
} }
} }
} }

View File

@@ -1,57 +0,0 @@
namespace WarhoundConsole
{
public sealed class Singleton
{
public sealed class InitializeParams
{
// FILL SOMETHING
}
public static Singleton I => i ??= new();
private static Singleton? i = null;
private bool isInitialized;
public bool ExitRequested { get; private set; }
private Singleton()
{
this.isInitialized = false;
this.ExitRequested = false;
}
public bool Initialize(InitializeParams initializeParams)
{
try
{
if (this.isInitialized)
{
throw new InvalidOperationException("이미 초기화된 싱글톤");
}
if (initializeParams == null)
{
throw new ArgumentNullException(nameof(initializeParams));
}
this.InitializeInternal(initializeParams);
}
finally
{
this.isInitialized = true;
}
return true;
}
private void InitializeInternal(InitializeParams initializeParams)
{
// DO SOMETHING
}
public void Exit()
{
this.ExitRequested = true;
}
}
}

View File

@@ -8,9 +8,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\WarhoundLib\WarhoundLib.csproj" /> <ProjectReference Include="..\WarhoundLib\WarhoundLib.csproj" />
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.4" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -12,8 +12,4 @@
<TestingPlatformShowTestsFailure>true</TestingPlatformShowTestsFailure> <TestingPlatformShowTestsFailure>true</TestingPlatformShowTestsFailure>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\WarhoundLib\WarhoundLib.csproj" />
</ItemGroup>
</Project> </Project>