próbuję zrobić wyłącznik czasowy komputera w Visual Studio.
w c++ konsolowo wystarczylo wywolac sleep(1000) i wyszstko dzialalo, natomiast w C# uzycie System.Threading.Thread.Sleep(1000) sprawia ze program sie zupelnie zawiesza, lub nie reaguje. dla przykladu uzywajac System.Threading.Thread.Sleep(0) jest ok, ale jesli czas wynosi wiecej niz 0 to programik się sypie.
prosze o pomoc jak to rozwiazac
jeśli chcesz wyłączyć kompa o konkretnej godzinie to wrzuć na formę timer, ustaw mu Interval
na np. 500
(0.5 sekundy) a w obsłudze Tick
sprawdzaj czy czas bieżący jest taki sam jak czas wyłączenia i jak tak to uruchom kod od wyłączenia.
abrakadaber napisał(a):
jeśli chcesz wyłączyć kompa o konkretnej godzinie to wrzuć na formę timer, ustaw mu
Interval
na np.500
(0.5 sekundy) a w obsłudzeTick
sprawdzaj czy czas bieżący jest taki sam jak czas wyłączenia i jak tak to uruchom kod od wyłączenia.
Do takich zastosowań w zupełności wystarczy 1000. Tylko nie sprawdzaj, czy czas jest identyczny. Czas na kompie ma być równy lub większy z tym zadanym.
A może uruchomić timer w osobnym wątku i wtedy nie będzie zawieszało GUI.
async static Task PutTaskDelay(int i)
{
await Task.Delay(i);
}
Przykład:
async static Task PutTaskDelay(int i)
{
await Task.Delay(i);
Console.WriteLine("delay");
}
static void Main(string[] args)
{
for (int i=0; i<5; i++)
{
Console.WriteLine("test");
PutTaskDelay(500);
}
Console.WriteLine("koniec");
Console.ReadKey();
}
test
test
test
test
test
koniec
delay
delay
delay
delay
delay
Shutdown:
async static Task ShutdownWithCountDown(int i)
{
await Task.Delay(i);
Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();
cmd.StandardInput.WriteLine("shutdown /s /t 0");
cmd.StandardInput.Flush();
cmd.StandardInput.Close();
cmd.WaitForExit();
}
static void Main(string[] args)
{
ShutdownWithCountDown(5000);
Console.ReadLine(); /// żeby program się nie skończył przed upływem czasu.
}
dzięki wielkie za podpowiedzi. jest ktoś w stanie wytłumaczyc dlaczego moja metoda zwiesza działanie ? prosze tez o dokladniejsza instrukcje jak wykorzystac ** Inteval**.
chce w programie wpisać np. 120minut, nie konkretna godzinę np. 16:30
Kolego "WeiXiao" - bardzo mi pomogłeś, dziękuję za jasno zobrazowane rozwiązanie problemu. Niezły skill, tylko pozazdrościć :)
wyrzuca błąd:
await Task.Delay(i); // 'Task' does not contain a definition for 'Delay'.
oczywiście jest "using System.Threading.Tasks;"
Wybitny Pomidor napisał(a):
wyrzuca błąd:
await Task.Delay(i); // 'Task' does not contain a definition for 'Delay'.oczywiście jest "using System.Threading.Tasks;"
Naciśnij (w Visual Studio) prawym na projekt > Properties > Application > Target Framework > I ustaw na .NET Framework 4.5 lub wyższy
Ewentualnie
znacznie prostsze jest uzycie komendy "Process.Start("Shutdown", "/s /t 0");"