Autor Beitrag
Trombone
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26
Erhaltene Danke: 1



BeitragVerfasst: Sa 08.10.11 02:58 
Moin moin,

ich benötige einen Ausstieg aus einer While schleife, wenn diese nicht durch ihre ursprüngliche Aufgabe beendet wird.
Dazu habe ich mir folgendes überlegt:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
bool exit = false

DateTime maxTime = new DateTime();
maxTime = DateTime.Now;
maxTime.Add(new TimeSpan(0,0,30));

while(!exit)
{
try{
    DateTime currentTime = new DateTime();
    currentTime = DateTime.Now;
    if(DateTime.Compare(maxTime,currentTime)<0)
     {
       exit = true;
       // MessageBox...
     }
    // try something
    exit = true;
   }
catch{}
}


Eigendlich sollte der code die Schleife 30 Sekunden nach dem Startzeitpunkt beenden,
leider funktioniert das nicht so wie ich mir das vorgestellt habe...
Die schleife läuft jedes maö in den Block der If bedingung und das schon deutlich eher.

Hat jemand ne idee was ich falsch mache? Gibts ne elegantere Lösung?

Würd mich über Rat freuen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 08.10.11 06:57 
Schau dir einmal dieses Beispiel an:
msdn.microsoft.com/d....datetime.ticks.aspx

Das Entscheidende davon für dich:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
long elapsedTicks = currentDate.Ticks - centuryBegin.Ticks;
TimeSpan elapsedSpan = new TimeSpan(elapsedTicks);

[...]
Console.WriteLine("   {0:N2} seconds", elapsedSpan.TotalSeconds);
Auf diese Weise kannst du die vergangenen Sekunden direkt prüfen.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 08.10.11 10:18 
Hallo Trombone,

dein eigentlicher Fehler ist diese Zeile
ausblenden C#-Quelltext
1:
maxTime.Add(new TimeSpan(0,0,30));					

Diese bewirkt bei dir gar nichts, da diese Methode ein neues DateTime-Objekt zurückgibt (und nicht die aktuelle Instanz verändert - dies gilt für alle Methoden der DateTime-Struktur).
Richtig wäre also
ausblenden C#-Quelltext
1:
maxTime = maxTime.Add(new TimeSpan(0,0,30));					


Und noch ein Tipp:
du brauchst nicht zuerst ein DateTime-Objekt mit "new" erstellen um es in der nächsten Zeile wieder mit einem neuen Wert zu überschreiben. Dies kannst du gleich in einer Zeile machen:
ausblenden C#-Quelltext
1:
DateTime maxTime = DateTime.Now;					
Trombone Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26
Erhaltene Danke: 1



BeitragVerfasst: So 09.10.11 18:03 
Danke für die Hilfe, nun gehts:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
            bool folderCreated = false;

            DateTime startTime = DateTime.Now;

            // Wait max. 5 seconds 

            while (!folderCreated)
            {
                try
                {
                    DateTime currentTime = DateTime.Now;
                    
                    if (currentTime.Ticks - startTime.Ticks > 50000000)
                    {
                        MessageBox.Show("bla");

                        folderCreated = true;
                    }

       
                 // try something
                 folderCreated = true;

                }
                catch
                {
                }
            }
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: So 09.10.11 19:17 
Hm. Das kannst du doch mit Stopwatch leichter machen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
using System.Diagnostics;
//...

Stopwatch timer = new Stopwatch();
bool folderCreated = false//kannst du dir übrigens schenken, der Standartwert von bool ist immer false

            // Wait max. 5 seconds 
timer.Start();
            while (!folderCreated)
            {
                try
                {                    
                    if (timer.ElapsedMilliseconds > 5000//das sind 5 Sekunden "50000000" sind ca. 840 Minuten
                    {
                        MessageBox.Show("bla");

                        folderCreated = true;
                    }

       
                 // try something
                 folderCreated = true;

                }
                catch
                {
                }
            }
timer.Reset(); //Stoppt die Stoppuhr und setzt sie wieder auf 0

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler