2016-08-08 2 views
0

Как указано в заголовке, что-то в таймерном интервала кажется выключенным. Таймер должен занять время от «DateTimePicker», преобразовать его в секунды &, чтобы изменить интервал на время, установленное на DateTimePicker. Впоследствии он должен опубликовать твиттер в твиттере, хотя он не работает. Он просто держит спам-сообщения снова и снова.C# Таймер Интервал не работает

  private void IntervalChoose_ValueChanged(object sender, EventArgs e) //DateTimePicker 
    { 
     postInterval.Interval = (IntervalChoose.Value.Hour * 3600) + (IntervalChoose.Value.Minute * 60) + IntervalChoose.Value.Second; 
     saveTimerInterval = postInterval.Interval; //saveTimerInterval is set 0 at the beginning 
     MessageBox.Show("Current Interval in Seconds: " + postInterval.Interval.ToString()); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (button1.Text == "Start Bot") //Starts program (works) 
     { 
      IntervalChoose.Enabled = false; 
      MessageBox.Show(saveTimerInterval.ToString()); 
      postInterval.Interval = saveTimerInterval; //Sets the interval (once again, safecall) 
      postInterval.Start(); //starts posting. 
      button1.Text = "Stop Bot"; 
     } 
    private void postInterval_Tick(object sender, EventArgs e) 
    { 
     var service = new TwitterService("", "", "", ""); //Auth Keys 
     var twitterStatus = service.SendTweet(new SendTweetOptions() { Status = "Hi" + counter }); 
     if (twitterStatus != null) 
     { 
      MessageBox.Show("Your Message:\n\n\"" + "Hi" + counter + "\"\n\n has been successfully tweeted.", "Success!", MessageBoxButtons.OK); 
      counter++; 

     } 
     else 
     { 
      //MessageBox.Show("An Error occured while the Bot was running. Please Contact the Developer.", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     } 
    label2.Text = "Next Post in:\n" + (postInterval.Interval/3600) + " Hour(s) " + ((postInterval.Interval/3600)/60) + " Minute(s) " + (((postInterval.Interval/3600)/60)/60) + " Second(s)"; 
    } 

Результат:

Picture 1 Picture 2

Как видно из картинки, метка не будет обновляться, и новое время набора используется. Он просто случайно помещал текст в случайное время. Заранее благодарим за помощь.

+4

Вы знаете, что 'Интервал' равен миллисекундам?Кроме того, не используйте таймер таким образом. Установите его «галочку» каждую секунду, затем в событии «tick» проверьте, прошло ли запланированное время, если да, то отправьте и очистите «задачу», в противном случае ничего не сделайте – musefan

+0

Или вы можете получить временную часть из DateTime используя свойство TimeOfDay? Это возвращает TimeSpan, чье свойство TotalMilliseconds возвращает время в миллисекундах? Вы можете написать 'postInterval.Interval = (int) IntervalChoose.Value.TimeOfDay.TotalMilliseconds;' –

+0

lmao Я полностью забыл, что это MS; Я попробую @PanagiotisKanavos – DaiSuki53

ответ

1

Как уже упоминалось, свойство Interval предполагает миллисекунды, а не секунды. В любом случае вам не нужно сделать конверсии вручную. DateTimePicker возвращает значение DateTime. Вы можете получить временную часть DateTime как TimeSpan, используя свойство DateTime.TimeOfDay. Свойства timespan возвращают различные временные части или общую продолжительность, измеренную в определенном блоке. Например, TimeSpan.TotalMilliseconds возвращает текущее значение времени в миллисекундах.

Все, что вам нужно написать это:

postInterval.Interval = (int)IntervalChoose.Value.TimeOfDay.TotalMilliseconds; 

Это заботится о недействительной задаче интервальной и работает только если вы хотите, например, чтобы отправить сообщение через каждые 10 минут или каждые 1 часы.

Если вы хотите отправить сообщение в установленное время, вы не можете использовать System.Windows.Forms.Timer, потому что он не позволяет вам установить конкретное время начала или начальную задержку. В этом случае вам придется использовать System.Threading.Timer

5

Timer.Interval свойство имеет эту документацию:

Время, в миллисекундах, между событиями Время с начала. Значение должно быть больше нуля и меньше или равно Int32.MaxValue. Значение по умолчанию - 100 миллисекунд.

(курсив мой)

Так 3930 миллисекунды лишь немного быстрее, чем через каждые 4 секунды.


Другой способ реализовать это вычислить DateTime, когда следующий пост должен быть представлен, а затем запустить таймер «достаточно часто», скажем, один раз в секунду, а просто проверить, если текущее время компьютера имеет которое вычисленное значение DateTime.

Если это так, сделайте что угодно, а затем вычислите следующий момент времени, в который он должен работать.

0

Сначала, что я вижу, вы устанавливаете интервал в секундах. Но вам нужно установить его в миллисекундах postInterval.Interval = ((IntervalChoose.Value.Hour * 3600) + (IntervalChoose.Value.Minute * 60) + IntervalChoose.Value.Second) * 1000;

+0

Ну, даже с этим вы собираетесь создавать Внутренний, основанный на полночь. Таким образом, он будет работать только так, как ожидается, если пользователь установит бота ровно в полночь. Правильный интервал должен был бы учитывать текущее время даты в расчете – musefan