Forum: PC-Programmierung C#: Frage zu Sourcecode


von tigger (Gast)


Lesenswert?

Ich benötige für meine C' Applikationen eine Timeout-Funktionalität.
Folgender Beispielcode habe ich gefunden:
1
public class PModel
2
{
3
4
 private System.Timers.Timer watchDogTimer;
5
6
 public PModel()
7
 {
8
9
      watchDogTimer = new System.Timers.Timer(1000);   //1 second timeout
10
      watchDogTimer.Enabled = false;
11
      watchDogTimer.AutoReset = true;
12
13
      watchDogTimer.Elapsed+=new ElapsedEventHandler(OnWatchDogBark);
14
15
 }
16
17
 public void OnWatchDogBark(object source, ElapsedEventArgs e)
18
 {
19
20
      watchDogTimer.Enabled = false;
21
22
      /*do something here on a time out*/
23
24
      watchDogTimer.Enabled = true;
25
26
 }
27
}

Nun habe ich in meiner Applikation eine neue Instanz von dieser Klasse 
PMODEL erzeugt:
1
PModel test;
2
test.OnWatchDogBark(?,?);

Welche Parameter übergibt man der Methode "OnWatchDogBark"?

von Karl H. (kbuchegg)


Lesenswert?

tigger schrieb:

> Welche Parameter übergibt man der Methode "OnWatchDogBark"?

gar keine.
Die Funktion OnWatchDogBark wird vom System aufgerufen, wenn der Timer 
abgelaufen ist.

von tigger (Gast)


Lesenswert?

Und wie kann ich nun feststellen ob ein Timeout aufgetreten bzw. nicht 
aufgetreten ist ?

von Karl H. (kbuchegg)


Lesenswert?

tigger schrieb:
> Und wie kann ich nun feststellen ob ein Timeout aufgetreten bzw. nicht
> aufgetreten ist ?

In dem du dir in die Klasse zb eine bool Membervariable einbaust, die am 
Anfang auf false gesetzt wird und von besagter OnWatchDogBark auf true 
gesetzt wird.

von Martin (Gast)


Lesenswert?

tigger schrieb:
> Und wie kann ich nun feststellen ob ein Timeout aufgetreten bzw. nicht
> aufgetreten ist ?

Indem die Methode aufgerufen wird und du da drin etwas machst.

BTW., das Prinzip "Callback" sagt dir gar nichts? Und "Delegate" auch 
nicht?

von tigger (Gast)


Lesenswert?

Das sagt mir schon was, aber ich weiss nun nicht wie ich hierfür ein 
delegat anlege und auf das Ereignis reagieren kann.

von Arc N. (arc)


Lesenswert?

tigger schrieb:
> Das sagt mir schon was, aber ich weiss nun nicht wie ich hierfür ein
> delegat anlege und auf das Ereignis reagieren kann.

Das wird doch schon gemacht...
1
public void OnWatchDogBark(object source, ElapsedEventArgs e)
2
 {
3
    ...
4
 }

die Methode wird aufgerufen, wenn der Timer nach einer Sekunde 
abgelaufen ist und der Timer noch irgendwo gestartet werden würde...

von tigger (Gast)


Lesenswert?

Danke für die Hilfe. Ich benötige in meinem C# Code an mehreren Stellen 
eine Timeout-Funktionalität. Bin noch am überlegen wie ich dies am 
besten realisierne köönte.

von Karl H. (kbuchegg)


Lesenswert?

tigger schrieb:
> Danke für die Hilfe. Ich benötige in meinem C# Code an mehreren Stellen
> eine Timeout-Funktionalität. Bin noch am überlegen wie ich dies am
> besten realisierne köönte.

Mit mehreren derartigen Objekten?

von tigger (Gast)


Angehängte Dateien:

Lesenswert?

Müsste in dem oben gezeigten Code, der Timer nicht aktiv sein?
>>watchDogTimer.Enabled = false;

Mir ist noch nicht klar wie ich diese Klasse verwenden könnte.
Wenn der Timeout zuschlägt, wie kann ich den Timeout dann abschalten?

Zum Beispiel: Siehe Datei im Anhang

von Arc N. (arc)


Lesenswert?


von bluppdidupp (Gast)


Lesenswert?

Willst du nur einen Timeout "feststellen" oder deine Funktionalität 
"abbrechen" wenn sie zu lange dauert?

Falls ersteres:
1
DateTime starttime=DateTime.Now;
2
TimeSpan erlaubteZeit=new TimeSpan(0,1,2); // 1min 2sek
3
4
  tueIrgendwas();
5
6
TimeSpan zeitGebraucht=DateTime.Now-starttime;
7
if (zeitGebraucht>erlaubteZeit)
8
{
9
    // Scheiße, hat zulange gedauert
10
}
11
else
12
{
13
    // Ist rechtzeitig fertig geworden
14
}

von tigger (Gast)


Lesenswert?

Zum einen möchte ich einen Timeout feststellen und zum anderen eine 
Funktionalität abbrechen.

von tigger (Gast)


Lesenswert?

Beispiel: Timeout fesstellen:
1
        
2
public Form1()
3
{
4
   InitializeComponent();
5
6
   // Create a timer with a ten second interval.
7
   aTimer = new System.Timers.Timer(2000);
8
9
   // Hook up the Elapsed event for the timer.
10
   aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
11
12
   // Set the Interval to 2 seconds (2000 milliseconds).
13
   //aTimer.Interval = 2000;
14
   aTimer.Enabled = true;
15
}
16
17
private static void OnTimedEvent(object source, ElapsedEventArgs e)
18
{
19
   aTimer.Enabled = false;
20
   MessageBox.Show("The Elapsed event was raised at {0}", e.SignalTime.ToString());
21
}

von bluppdidupp (Gast)


Lesenswert?

vllt. über nen Thread:
1
        private int ergebnis = 0;
2
3
        public void pseudomain()
4
        {
5
            // Thread anlegen und starten:
6
            Thread t = new Thread(this.tueWas);
7
            t.Start();
8
9
            // Auf Thread mit Timeout warten:
10
            TimeSpan erlaubteZeit=new TimeSpan(0,0,20); // 20s
11
            bool hasFinished=t.Join(erlaubteZeit);
12
            if (hasFinished)
13
            {
14
                // Thread wurde innerhalb 20s fertig, wir können mit dem Ergebnis was anfangen:
15
                tueWasMitErgebnis(ergebnis);
16
            }
17
            else
18
            {
19
                // Thread läuft noch weiter ;/
20
                // aber egal, verwenden wir halt das noch nicht vorhandene Ergebnis nicht ;D
21
                // Idealerweise sollten wir hier dem Thread noch signalisieren das er sich beenden soll
22
            }
23
        }
24
25
        private void tueWas()
26
        {
27
            // Hier steck die Funktionalität, in diesem Beispiel eine sehr simple ;D
28
            ergebnis = 1;
29
        }
30
31
        private void tueWasMitErgebnis(int ergebnis)
32
        {
33
            // Wir schreiben es einfach in die Konsole ;D
34
            Console.WriteLine("Ergebnis: " + ergebnis);
35
        }

von tigger (Gast)


Lesenswert?

Danke für die Unterstützung.
Ich finde folgenden Code besser:
1
public Form1()
2
{
3
   InitializeComponent();
4
5
   // Create a timer with a ten second interval.
6
   aTimer = new System.Timers.Timer(2000);
7
8
   // Hook up the Elapsed event for the timer.
9
   aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
10
11
   // Set the Interval to 2 seconds (2000 milliseconds).
12
   //aTimer.Interval = 2000;
13
   aTimer.Enabled = true;
14
}
15
16
private static void OnTimedEvent(object source, ElapsedEventArgs e)
17
{
18
   aTimer.Enabled = false;
19
   MessageBox.Show("The Elapsed event was raised at {0}",
20
e.SignalTime.ToString());
21
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.