2016-08-08 35 views
0

Wie im Titel geschrieben, scheint etwas im Timer-Intervall ausgeschaltet zu sein. Der Timer sollte die Zeit von einem "DateTimePicker" nehmen, in Sekunden umwandeln & das Intervall auf die am DateTimePicker eingestellte Zeit ändern. Danach sollte es einen Tweet auf Twitter posten, obwohl es nicht funktioniert. Es hält nur Spam-Beiträge immer und immer wieder.C# Timer-Intervall funktioniert nicht

  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)"; 
    } 

Ergebnis:

Picture 1 Picture 2

wie auf den Bildern zu sehen ist, wird das Etikett nicht aktualisieren, noch die neu eingestellte Zeit verwendet wird. Es hat nur zufällig einen Text in zufälliger Zeit gepostet. Vielen Dank im Voraus für die Hilfe.

+4

verwenden Sie wissen, "Intervall" ist Millisekunden richtig?Verwenden Sie auch keinen Timer auf diese Weise. Setze es jede Sekunde auf "tick", dann überprüfe im "tick" -Ereignis, ob die geplante Zeit abgelaufen ist, wenn ja, dann sende und lösche die 'Aufgabe', ansonsten tue nichts – musefan

+0

Oder dass du den Zeitanteil von einer DateTime bekommst mithilfe der TimeOfDay-Eigenschaft? Das gibt ein TimeSpan zurück, dessen Eigenschaft 'TotalMilliseconds' die Zeit als Millisekunden zurückgibt? Sie können schreiben 'postInterval.Interval = (int) IntervalChoose.Value.TimeOfDay.TotalMilliseconds;' –

+0

lmao Ich habe total vergessen, es war MS; Ich werde versuchen @PanagiotisKanavos – DaiSuki53

Antwort

1

Wie bereits erwähnt, erwartet die Interval Eigenschaft Millisekunden, nicht Sekunden. In jedem Fall müssen Sie nicht müssen die Konvertierungen von Hand machen. Ein DateTimePicker gibt einen DateTime-Wert zurück. Sie können den Zeitabschnitt einer DateTime als TimeSpan mithilfe der DateTime.TimeOfDay-Eigenschaft abrufen. Die Eigenschaften der Zeitspanne geben die verschiedenen Zeitabschnitte oder die Gesamtdauer in einer bestimmten Einheit zurück. Beispiel: TimeSpan.TotalMilliseconds gibt den aktuellen Zeitwert als Millisekunden zurück.

Alles, was Sie schreiben müssen, ist:

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

, die Pflege des ungültigen Intervall Problem nimmt und funktioniert nur, wenn Sie zB wollen alle 10 Minuten eine Nachricht senden oder jede 1 Stunde.

Wenn Sie eine Nachricht zu einem festgelegten Zeitpunkt senden möchten, können Sie keine System.Windows.Forms.Timer verwenden, da Sie keine bestimmte Startzeit oder Startverzögerung festlegen können. In diesem Fall müssten Sie System.Threading.Timer

5

Die Timer.Interval Eigenschaft hat diese Dokumentation:

Die Zeit, in Millisekunden, zwischen Abgelaufene Veranstaltungen. Der Wert muss größer als Null und kleiner als oder gleich Int32.MaxValue sein. Der Standardwert ist 100 Millisekunden.

(Hervorhebung von mir)

So 3930 Millisekunden ist nur etwas schneller als alle 4 Sekunden.


Eine andere Möglichkeit, dies zu implementieren ist berechnen sollte die Datetime, wann die nächste Post eingereicht wird, dann den Timer „oft genug“ laufen, sagt einmal pro Sekunde, und prüfen Sie nur, wenn die aktuelle Computerzeit hat hat diesen berechneten DateTime-Wert übergeben.

Wenn es ist, was auch immer tun, dann berechnen Sie den nächsten Zeitpunkt, zu dem es laufen sollte.

0

Zuerst, dass ich sehe, setzen Sie Intervall in Sekunden. Aber Sie müssen es in Millisekunden setzen postInterval.Interval = ((IntervalChoose.Value.Hour * 3600) + (IntervalChoose.Value.Minute * 60) + IntervalChoose.Value.Second) * 1000;

+0

Nun, damit werden Sie eine interne basierend auf Mitternacht erstellen. Es wird also nur wie erwartet funktionieren, wenn der Benutzer den Bot genau um Mitternacht setzt. Ein korrektes Intervall müsste die aktuelle Zeit des Datums in die Berechnung einbeziehen – musefan