2012-05-08 7 views
9

Piszę aplikację, która będzie miała opcję uruchamiania w Windows Startup.C# - Jak sprawdzić, czy system Windows jest "rozliczony" po uruchomieniu?

Nie mogę znieść, gdy aplikacje tłamszą mój komputer, zanim naprawdę się ustabilizuje, a to nie jest aplikacja o znaczeniu krytycznym. Chciałbym, aby moja aplikacja uprzejmie poczekała, aż wszystkie inne elementy startowe zakończą się, aby komputer użytkownika zaczął reagować, zanim zacznie wykonywać jakąkolwiek pracę.

Jak mógłbym wykryć ten stan? Przypuszczam, że mógłbym przejść przez rejestr i poszukać wszystkich uruchomionych procesów lub użyć długiego timera. Mam tylko nadzieję, że jest jeszcze jedna, mniej hackowska sztuczka, której mogę użyć.

EDYCJA: Aplikacja ma interfejs użytkownika i nie może działać jako usługa. Ma tryb podajnika. Wykonuje renderowanie obrazu.

+1

[Ten artykuł] (http://blogs.msdn.com/b/oldnewthing/archive/2005/03/11/394249.aspx) może Cię zainteresować – Vlad

+2

Brak konkretnego sygnału. Przypuszczam, że można próbkować liczniki wydajności dla obciążenia procesora i transferu dysków. –

+0

OK, musiałem dodać następujący komentarz: NIGDY nie utworzyłbym aplikacji, która domyślnie działałaby przy starcie. Musisz to wyraźnie określić. Jeśli zrobisz to w swoim zgłoszeniu, a nie ma żadnej firmy mówiącej, że cię zwolnią, jeśli nie, jesteś złym człowiekiem! –

Odpowiedz

4

"Długi" zegar to najlepsza trasa. Nie dotknę rejestru przy pomocy bargepole.

Jedną z rzeczy, które warto wziąć pod uwagę, jest to, co się stanie, jeśli użytkownik chce samodzielnie uruchomić swój program? Oczywiście nie chcesz powodować opóźnienia.

Zakładam, że Twoja aplikacja ma interfejs użytkownika? Jeśli nie, można rozważyć usługę z typu start ustawiony na „Automatycznie (opóźnione)” na Vista/7

Proszę zobaczyć także ten powiązane pytanie: How to create delay startup application in c#?

końcowego punktu, jeśli program jest nie- krytyczne, i obawiasz się, że może to spowolnić działanie, rozważ obniżenie priorytetu aplikacji.

+1

Zaakceptowana odpowiedź na dokładność.Myślę, że zakończę oczekiwanie na wykorzystanie procesora do rozstrzygnięcia, a następnie za pomocą wątku o najniższym możliwym priorytecie i umożliwiając konfigurację tego priorytetu.Muszę również docenić twoją uwagę na temat rejestru. była ostatnią deską ratunku: <) –

2

Wygląda na to, że jest to typ rzeczy najlepiej pozostawiony w rękach użytkownika, a system Windows już oferuje dobrą opcję kontrolowania tego, przynajmniej dla usług Windows.

Jeśli jest to usługa systemu Windows, usługa może być skonfigurowany do uruchamiania automatycznego (Opóźniony start)

Być może, że jest najlepszym rozwiązaniem?

Jeśli nie chcesz iść tą trasą lub jeśli Twój program nie jest usługą systemu Windows, wykrywanie, kiedy system Windows jest "rozliczony", jest dość subiektywne i podatne na błędy. Możesz monitorować Disk IO jako nieco wiarygodny wskaźnik. Dysk IO jest zwykle wąskim gardłem podczas uruchamiania (szczególnie w przypadku systemów bez napędów SSD OS). Możesz uzyskać rozsądne przybliżenie "rozstrzygnięcia", w którym dysk IO (wskazany przez liczniki wydajności) spadnie poniżej pewnego progu. Nie trzeba czekać dłużej niż konfigurowalny czas, a następnie uruchomić, ponieważ niektóre systemy mogą uruchamiać się i zacząć wykonywać niezwiązane, długotrwałe zadania, które obciążają podsystem IO.

+0

To także doskonałe podejście. Ostro zakończono używanie kombinacji odpytywania dysku IO, pobierania z wykorzystaniem procesora i maksymalnego czasu oczekiwania. –

1

dwie sugestie:

  1. użyć wątek o niskim priorytecie, aby zrobić swoją pracę. W końcu jest to niski priorytet, prawda? Już samo to ma szansę skutecznie zminimalizować wpływ na start-up.
  2. Jeśli naprawdę chcesz poczekać, aż sprawy się uspokoją - po prostu sprawdź wykorzystanie pamięci procesora &, zamiast robić cały ten odczyt rejestru lub czekać na dowolny czas. Instrukcje na ten temat są tutaj: How to get the CPU Usage in C#?

Powodzenia!

1

dość późno (przez cztery lata) do partii tutaj, ale w przypadku, ktoś inny potknięć na tej Q & jak ja ... I zapytał similar question ale moim celem było wiadomo, kiedy rzeczy ustatkować przed zalogowaniem użytkownika -w. Rozumiem, że aplikacja OP jest uruchamiana z pulpitu i zawiera elementy interfejsu użytkownika itp. Ale jeśli sprawdzisz ten wątek, zobaczysz, że istnieje sposób sprawdzenia, czy system Windows zakończył ładowanie usług. Tak więc usługa może zostać uruchomiona przy starcie, wyczyścić flagę "done", poczekać na uruchomienie usług, a następnie ustawić tę flagę. Teraz, gdy użytkownik się loguje, jeśli system jest jeszcze w drodze, aplikacja będzie wiedzieć i nie spieszyć się, aby zainicjować interfejs użytkownika. Jeśli ustawiona jest flaga "done", interfejs użytkownika może "czuć się komfortowo", zaczynając od wiedzy, że większość lub wszystkie inne aplikacje zrobiły swoje. Możliwe, że użytkownik uruchomi kolejną aplikację po zalogowaniu. W ten sposób zostanie zakończona flaga zakończona, ale wszystko może się nadal dziać. Jest to miejsce, w którym inne sugerowane kontrole, takie jak użycie procesora, miałyby wartość.