Таймер на обоях Cycler - PullRequest
       13

Таймер на обоях Cycler

1 голос
/ 06 февраля 2009

Я только что добавил некоторые дополнительные функции в проект Coding4Fun . У меня есть проект с дополнительной опцией, позволяющей автоматически менять фон по истечении X времени. X устанавливается из ComboBox. Однако я знаю, что сделал это ужасным образом, так как я создал новый класс таймера с System.Timers.Timer в качестве родителя, поэтому, когда вызывается статический метод в ElapsedEventHandler, я могу вернуться к форма и вызов ChangeDesktopBackground ().

Как лучше вызывать ChangeDesktopBackground () через определенный пользователем интервал?

Вот мое текущее решение, которое включает в себя приведение отправителя в качестве моего унаследованного таймера, который затем получает ссылку на форму, которая затем вызывает метод ChangeDesktopBackground.

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

Редактировать: добавлен пример кодирования для отображения текущего решения

Ответы [ 3 ]

0 голосов
/ 12 февраля 2009

Я написал что-то подобное перед собой. System.Timers.Timer излишне для этого. Возможно, вам следует использовать System.Windows.Forms.Timer по нескольким причинам:

  1. Вы делаете что-то, что не должно быть слишком точным. Таймер Windows - это просто сообщение WM_TIMER, отправляемое в насос сообщений вашего приложения Windows, так что вы не получаете супер высокой точности, но менять обои один раз в секунду нереально. (Я написал мой, чтобы изменить каждые 6 часов или около того)
  2. При использовании приложения Windows Forms, которое выполняет какое-то задание на основе таймера, вы столкнетесь со всеми видами проблем сходства потоков, если перейдете к System.Timers.Timer. Любой элемент управления Windows имеет сходство с потоком, в котором он был создан, что означает, что вы можете изменять только элемент управления в этом потоке. Windows.Forms.Timer сделает все это за вас. (Для будущих придирщиков изменение обоев на самом деле не считается, потому что это изменение в реестре, но правило в целом справедливо)
0 голосов
/ 09 января 2016

Я бы использовал Microsoft Reactive Framework для этого. Просто NuGet "Rx-WinForms".

Вот код:

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

Чтобы остановить это, просто сделайте subscription.Dispose().

Simple.

0 голосов
/ 06 февраля 2009

Таймеры, вероятно, самый простой способ сделать это, хотя я не уверен, что вы используете таймер правильно. Вот как я использовал таймеры в своих проектах:

// 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    
}

Затем вы должны подключить ваш обработчик ComboBox onChange так, чтобы вы меняли timer.Interval.

...