using System;
using System.ComponentModel;
using System.Text.RegularExpressions;
namespace ReservedShutdown
{
class Program
{
static void Main(string[] args)
{
string timeString;
if (args.Length >= 1)
{
timeString = args[0];
}
else
{
Console.Write("종료 시각을 입력하세요(##:##:##): ");
timeString = Console.ReadLine().Trim();
}
Regex r = new Regex("^(\\d{2}:){2}\\d{2}$");
if (r.IsMatch(timeString))
{
r = new Regex("(\\d{2}):(\\d{2}):(\\d{2})");
var match = r.Match(timeString);
int h, m, s;
h = int.Parse(match.Groups[1].Value);
m = int.Parse(match.Groups[2].Value);
s = int.Parse(match.Groups[3].Value);
if (h < 0 || m < 0 || s < 0)
{
Console.WriteLine("잘못 입력하셨습니다.");
return;
}
if (s >= 60)
{
int tmp = s / 60;
m += tmp;
s -= 60;
}
if (m >= 60)
{
int tmp = m / 60;
h += tmp;
m -= 60;
}
int seconds = h * 3600 + m * 60 + s;
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += Tick;
worker.RunWorkerAsync(seconds);
Console.ReadLine();
}
else
{
Console.WriteLine("잘못 입력하셨습니다.");
System.Threading.Thread.Sleep(5000);
}
}
static long lastTick = 0;
private static void Tick(object sender, DoWorkEventArgs e)
{
int seconds = (int)e.Argument;
long now = DateTime.Now.Ticks / TimeSpan.TicksPerSecond;
long dest = now + seconds;
while ((now = DateTime.Now.Ticks / TimeSpan.TicksPerSecond) <= dest)
{
if (lastTick + 1 <= now)
{
Console.Clear();
int h, m, s;
int remain = (int)(dest - now);
h = remain / 3600;
m = remain / 60 % 60;
s = remain % 60;
Console.WriteLine($"종료까지 {h:00}시간 {m:00}분 {s:00}초 남았습니다.");
lastTick = now;
}
}
Console.Clear();
var process = new System.Diagnostics.Process();
process.StartInfo.UseShellExecute = true;
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/c shutdown -s -t 0";
process.Start();
}
}
}
C# 코딩 중 평소 볼 수 없던 생소한 현상이 발생했습니다. 분명 메모리는 남아도는데(32기가바이트 중 26기가바이트 사용 가능) 프로그램이 돌다가 OutOfMemory 예외를 던지며 죽어버리는 현상이었죠. List 에 수많은 파싱된 데이터를 넣는 작업 중이었습니다. 그래서 메모리 프로파일러를 잘 관찰해보니 2GB의 메모리를 사용하면 무조건 뻗어버리는 현상을 발견했고, 왜 그럴까 생각해보다가 문득 예전 XP에서 4기가 메모리를 달아도 32비트 운영체제의 한계 아닌 한계로 3기가 조금 넘게밖에 인식을 못 했던 것이 생각났습니다. 생각은 자연스럽게 컴파일이 32비트로 됐구나! 쪽으로 넘어갔고 프로젝트 설정에 보니 빌드 항목에 해당되는 체크박스가 있더군요. 현재 메모리가 남아도는데도 OutOfMemory 예외가 뜬다면 100% 저게 체크된 상태일 겁니다. 그림과 같이 체크 해제 하신 후 실행하시면 특별한 경우가 아닌 이상 컴퓨터 메모리가 바닥날 때까지 저 예외를 볼 일 없게 될겁니다.
블로그를 옮기면서 카드캡터 사쿠라 OST를 포함해 테일즈위버 OST 역시 까먹고 안 옮겼었네요. 소름... 블로그 조회수의 대부분을 차지하는 두 개를 안 옮겼었다니! 게임보다 OST들으러 들어간다는 테일즈 위버(Tales Weaver)의 모든 OST 모음집입니다. FLAC파일을 재생할 수 있는 플레이어가 필요합니다... 만 요새는 웬만해선 다 재생해주죠. 즐감하세요.
댓글
댓글 쓰기