2009-02-06 12 views
1

J'ai ajouté quelques fonctionnalités supplémentaires à un projet Coding4Fun. J'ai mon projet mis en place avec une option supplémentaire pour lui permettre de changer automatiquement l'arrière-plan après X quantité de temps. X est défini à partir d'un ComboBox. Cependant, je sais que je l'ai fait d'une manière terrible, comme j'ai créé une nouvelle classe minuterie avec System.Timers.Timer en tant que parent ainsi quand la méthode statique dans le ElapsedEventHandler est appelée, je suis en mesure de revenir à le formulaire et appelez ChangeDesktopBackground().Minuterie sur le papier peint Cycler

Quelle est une meilleure façon d'appeler ChangeDesktopBackground() à un intervalle défini par l'utilisateur?

Voici ma solution actuelle, qui consiste à transformer l'expéditeur en mon horodateur hérité, qui obtient alors une référence au formulaire, qui appelle ensuite la méthode ChangeDesktopBackground.

private static void timerEvent(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    ((newTimer)sender).getCycleSettingsForm().ChangeDesktopBackground(); 
} 

Edit: exemple de codage Ajouté à montrer solution actuelle

Répondre

0

minuteries sont probablement le moyen le plus avant-droit de le faire, même si je ne suis pas sûr que vous utilisez correctement une minuterie. Voici comment je l'ai utilisé des minuteries dans mes projets:

// here we declare the timer that this class will use. 
private Timer timer; 

//I've shown the timer creation inside the constructor of a main form, 
//but it may be done elsewhere depending on your needs 
public Main() 
{ 

    // other init stuff omitted 

    timer = new Timer();  
    timer.Interval = 10000; // 10 seconds between images 
    timer.Tick += timer_Tick; // attach the event handler (defined below) 
} 


void timer_Tick(object sender, EventArgs e) 
{ 
    // this is where you'd show your next image  
} 

Ensuite, vous souhaitez connecter votre gestionnaire ComboBox onChange tel que vous changerez timer.Interval souhaitez.

0

J'ai écrit quelque chose comme ça avant moi-même. System.Timers.Timer est trop puissant pour cela. Vous devriez probablement utiliser System.Windows.Forms.Timer, pour plusieurs raisons:

  1. Vous faites quelque chose qui n'a pas besoin d'être trop précis. La minuterie Windows est juste un message WM_TIMER envoyé à la pompe de message de votre application Windows, de sorte que vous n'obtenez pas une très grande précision, mais changer votre fond d'écran une fois par seconde est irréaliste. (J'ai écrit le mien pour changer toutes les 6 heures environ)
  2. Lorsque vous utilisez une application Windows Forms qui effectue une sorte de tâche basée sur le minuteur, vous allez rencontrer toutes sortes de problèmes d'affinité de threads avec System. Timers.Timer. Tout contrôle Windows a une affinité pour le thread sur lequel il a été créé, ce qui signifie que vous pouvez uniquement modifier le contrôle sur ce thread. Un Windows.Forms.Timer fera tout cela pour vous. (Pour les futurs nitpickers, changer de fond d'écran ne compte pas vraiment, car c'est un changement de valeur de registre, mais la règle s'applique généralement)
0

J'utiliserais Microsoft Reactive Framework pour cela. Juste NuGet "Rx-WinForms".

Voici le code:

var subscription = 
    Observable 
     .Interval(TimeSpan.FromMinutes(1.0)) 
     .ObserveOn(this) 
     .Subscribe(n => this.getCycleSettingsForm().ChangeDesktopBackground()); 

Pour arrêter le faire juste subscription.Dispose().

Simple.

Questions connexes