Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Delay in C#
jofenchel
myCSharp.de - Member

Avatar #avatar-1735.gif


Dabei seit:
Beiträge: 117
Herkunft: 75389 Neuweiler

Themenstarter:

Delay in C#

beantworten | zitieren | melden

Hallo zusammen,

gibt es C# sowas aenliches wie Delay()?

Ich mochte in einer Schleife eion Delay einbauen um z. B. eine Progressbar zu testen.

Ich weiss ich koennte auch mit einem Timer arbeiten, was eventuell besser waere.
Aber ich wurde gerne wissen ob es sowas gibt.

Danke fuer eure Tips.

Gruss
JoFenchel
private Nachricht | Beiträge des Benutzers
S.H.-Teichhof
myCSharp.de - Member

Avatar #avatar-2460.jpg


Dabei seit:
Beiträge: 1552
Herkunft: Sindringen

beantworten | zitieren | melden

wäre vieleicht interesant zu wissen was den Delay machen soll über google bin ich nämlich nicht drauf gekommen
Wir Arbeiten eigendlich nicht wir nehmen nur das geld
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo jofenchel,

Thread.Sleep.

Allerdings ist die Oberfläche blockiert, solange du in der Schleife bist und sie wird auch nicht aktualisiert. Du könntest bei jedem Schleifendurchlauf DoEvents benutzen, um das Problem zu entschärfen. Die Oberfläche ist dann aber immer noch jeweils solange blockiert, wie du schläfst. Aber für den Test sollte es reichen.

Hallo S.H.-Teichhof,

http://dict.leo.org hätte in diesem Fall wohl mehr geholfen als google :-)

herbivore
private Nachricht | Beiträge des Benutzers
Paulo
myCSharp.de - Member



Dabei seit:
Beiträge: 172

beantworten | zitieren | melden

Gibts denn eigentlich keine Möglichkeit die Oberfläche dabei nicht zu blockieren?
private Nachricht | Beiträge des Benutzers
S.H.-Teichhof
myCSharp.de - Member

Avatar #avatar-2460.jpg


Dabei seit:
Beiträge: 1552
Herkunft: Sindringen

beantworten | zitieren | melden

doch die arbeit in einen seperaten Thread auslagern und diesen dann anhalten
Wir Arbeiten eigendlich nicht wir nehmen nur das geld
private Nachricht | Beiträge des Benutzers
Quallo
myCSharp.de - Member



Dabei seit:
Beiträge: 994
Herkunft: Nähe Bremen

beantworten | zitieren | melden

Ich glaube nur um ne progressbar zu testen ist es egal, ob Du dabei den GUI-Thread blockierst.
Wenn Du das produktiv in einem Programm einsetzen willst, dann nehm eine der drei Timer-Klassen.
private Nachricht | Beiträge des Benutzers
.unreal
myCSharp.de - Member

Avatar #avatar-1903.gif


Dabei seit:
Beiträge: 563
Herkunft: Nähe Zürich

beantworten | zitieren | melden

oder in 2.0 benutzst du den BackgroundWorker
private Nachricht | Beiträge des Benutzers
sublime
myCSharp.de - Member



Dabei seit:
Beiträge: 34
Herkunft: Braunschweig

beantworten | zitieren | melden

Hallo,

habe ein ähnliches Problem, benötige auch eine "zeitliche Pause", in welcher jedoch die für den Benutzer sichtbare Oberfläche aktualisiert werden soll.

Mich bringen keine der bisher gefundenen Möglichkeiten weiter, allerdings bin ich auch noch blutiger Anfänger, vielleicht kann mir hier jemand noch einen Tipp geben?

Danke schonmal im Voraus. =)
'Ich sag ja immer: "Wer nicht mit der Zeit geht, der muss halt mir der Zeit gehen ne...!"'
private Nachricht | Beiträge des Benutzers
jofenchel
myCSharp.de - Member

Avatar #avatar-1735.gif


Dabei seit:
Beiträge: 117
Herkunft: 75389 Neuweiler

Themenstarter:

Delay

beantworten | zitieren | melden

Hallo zusammen,

das Delay soll mir nur ermoeglichen eine Progressbar zu testen.
Ich habe mehrere zur Auswahl aber die Optik ist immer anders.
Nun will ich mir die passende aussuchen bei der die Programmierung und die Optik am besten ist.
Das ganze lasse ich dann in einer Schleife laufen.

Hi .unreal: Was genau ist und macht der BackgroundWorker?
Ich habe noch 1.1 installiert.

Aber ich denke das ich doch mit Timern testen werde.
Ich sollte nur mehr ueber die TimerKlassen wissen.
Werde da mal das Forum durchforsten.


Gruss
JoFenchel
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Nur für einen Test müsste folgendes reichen...

Thread.Sleep(1000); //paust 1 Sekunde
Application.DoEvents(); // Events abarbeiten (damit das UI nicht einfriert)
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
sublime
myCSharp.de - Member



Dabei seit:
Beiträge: 34
Herkunft: Braunschweig

beantworten | zitieren | melden

Auch wenns vielleicht nicht für mich gedacht war, hat mir super weitergeholfen Programmierhans. Vielen Dank!
'Ich sag ja immer: "Wer nicht mit der Zeit geht, der muss halt mir der Zeit gehen ne...!"'
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Zitat
Original von sublime
Auch wenns vielleicht nicht für mich gedacht war, hat mir super weitergeholfen Programmierhans. Vielen Dank!

Wem's nützt für den isses
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
.unreal
myCSharp.de - Member

Avatar #avatar-1903.gif


Dabei seit:
Beiträge: 563
Herkunft: Nähe Zürich

beantworten | zitieren | melden

Zitat
Original von Programmierhans
Nur für einen Test müsste folgendes reichen...

Thread.Sleep(1000); //paust 1 Sekunde
Application.DoEvents(); // Events abarbeiten (damit das UI nicht einfriert)

wenn man

Thread.Sleep(10000);
++i;

machen würde, dann würde das ++i erst stattfinden, wenn der thread 10000 ms gesleept hat. warum ist das bei Application.DoEvents(); nicht so?
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Thread.Sleep legt den Thread schlafen.....

DoEvents hingegen zieht die nächste Message des MessageLoops und beginnt diese zu verarbeiten.... (z.B: eine Message dass irgendwas neu gezeichnet werden muss)....

Wenn du z.B: in einem Click ein DoEvents reinhaust und dann wie wild auf dem Button rumdrückst bringst Du es fertig, dass der Code in eine Methode (EventHandler) reinläuft obwohl er dort schon drin ist.....

Dieses reentrant-Problem kann voll tödlich sein, da man dieses nicht mit einem Lock oder Mutex blocken kann (es läuft ja ebenfalls im UI-Thread ab)....

DoEvents ist somit IMMER mit höchster Vorsicht zu geniessen.

--> eine Boardsuche "reentrant" sollte noch ein paar interessante Darstellungen dieses Problems an's Licht bringen.
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo jofenchel,
Zitat
Gibts denn eigentlich keine Möglichkeit die Oberfläche dabei nicht zu blockieren?
Nein, man kann unter Windows nur blockierende Oberflächen schreiben. :-) Davon abgesehen blockiert meine Lösung ja immer nur so kurz, dass es für den Test reicht.

Hallo sublime,
Zitat
Auch wenns vielleicht nicht für mich gedacht war, hat mir super weitergeholfen Programmierhans.
genau das, was Programmierhans als Code geschrieben hat, stand bei mir oben im Text. Sicher kann man mal was übersehen, aber hier hat es mich schon verblüfft.

Hallo .unreal,
Zitat
wenn man Thread.Sleep(10000); ++i; machen würde, dann würde das ++i erst stattfinden, wenn der thread 10000 ms gesleept hat. warum ist das bei Application.DoEvents(); nicht so?
Das ist bei DoEvents genauso. Das DoEvents wird erst ausgeführt, wenn das Sleep vorbei ist. Das weitere hat Programmierhans schon beschrieben.

herbivore
private Nachricht | Beiträge des Benutzers
thomas.at
myCSharp.de - Member



Dabei seit:
Beiträge: 102
Herkunft: Österreich / Wien

beantworten | zitieren | melden

Hallo

was würde passieren, wenn ich das Delay folgender weise erstelle:



for (i=1; i≤1000; i++)
{
    Thread.Sleep(1);
    Application.DoEvents();
}

Dies sollte doch eigentlich eine Pause von 1 Sekunde erzeugen, das Programm aber nicht blockieren (ich mache dies in Delphi zumindestens so)

mfG Thomas
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo thomas.at,

in C# musst du die Zeit in Millisekunden angeben, also 1000 für eine Sekunde. Das Programm ist dann jeweils auch für eine Sekunde blockiert.

herbivore
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Zitat
Original von herbivore
Hallo thomas.at,

in C# musst du die Zeit in Millisekunden angeben, also 1000 für eine Sekunde. Das Programm ist dann jeweils auch für eine Sekunde blockiert.

herbivore

1000 Durchläufe a 1 Milli (theoretisch ) ergibt auch ne Sekunde ... und dem Prozessor wird's garantiert nicht langweilig
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Programmierhans,

oh, so hatte ich das gar nicht verstanden. Aber das kommt natürlich überhaupt nicht hin, weil es ja stark von der Zeit abhängt, die für die Thread-Wechsel (ausgelöst durch das Thread-Sleep) und die DoEvents benötigt wird. Außerdem wird - wie du schon sagst - vermutlich heftig Prozessorlast erzeugt. Ist auf jeden Fall keine gute Methode. Für diesen Fall würde ich einen Timer verwenden.

herbivore
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Oder so :-)



	public class MethodsWhoNoOneNeeds
	{
		public static void Block(TimeSpan pTimeToBlock)
		{
			DateTime dtStart=DateTime.Now;
			while(dtStart+pTimeToBlock>DateTime.Now)
			{
				Application.DoEvents();
			}
		}
	}


Ganz ohne Thread.Sleep.... da ruckelt auch nix :-) aber der Prozessor wird auf 100% sein nehme ich an.
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
jofenchel
myCSharp.de - Member

Avatar #avatar-1735.gif


Dabei seit:
Beiträge: 117
Herkunft: 75389 Neuweiler

Themenstarter:

beantworten | zitieren | melden

Hallo Programmierhans,

deinen Vorschlag habe ich ausprobiert.
Geht leider nicht. Bei mir ist dann das ganze System tot.
Musste danach meinen Laptop neu boote.


Thread.Sleep(1000); //paust 1 Sekunde
Application.DoEvents(); // Events abarbeiten (damit das UI nicht einfriert) 

JoFenchel
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo jofenchel,

das kann eigentlich nicht an den beiden Zeilen liegen. Die Anweisungen sind ok. Und selbst wenn du durch ein langes Sleep deine ganze Anwendung blockierst, sollte dadurch nicht das Betriebssystem blockiert werden (oder hast du Windows ME?).

Auch irgendwelcher Mist, den du in deinem Programm machst, sollte nicht diese Auswirkung haben können. Ich würde das erstmal für ein zufälliges Zusammentreffen halten oder für ein grundsätzliches Problem deines Betriebssystems.

herbivore
private Nachricht | Beiträge des Benutzers
.unreal
myCSharp.de - Member

Avatar #avatar-1903.gif


Dabei seit:
Beiträge: 563
Herkunft: Nähe Zürich

beantworten | zitieren | melden

Zitat
Original von jofenchel
Hallo Programmierhans,

deinen Vorschlag habe ich ausprobiert.
Geht leider nicht. Bei mir ist dann das ganze System tot.
Musste danach meinen Laptop neu boote.


Thread.Sleep(1000); //paust 1 Sekunde
Application.DoEvents(); // Events abarbeiten (damit das UI nicht einfriert) 

JoFenchel

das funktioniet doch nicht, weil der zuesrt sleept, und dann das gui aktualisiert, somit ist das gui auch ne sekunde gefreezed...
private Nachricht | Beiträge des Benutzers
sublime
myCSharp.de - Member



Dabei seit:
Beiträge: 34
Herkunft: Braunschweig

beantworten | zitieren | melden

Hallo herbivore,

sorry habs nochmal nachgeguckt und du hattst schon recht, dass der Tipp in deinem Post derselbe war wie von Programmierhans, habs anfangs auch damit probiert, aber das dann noch mit Teilen aus der MSDN vermischt und dadurch gings net. Stand einfach ein wenig aufm Schlauch.
'Ich sag ja immer: "Wer nicht mit der Zeit geht, der muss halt mir der Zeit gehen ne...!"'
private Nachricht | Beiträge des Benutzers
jofenchel
myCSharp.de - Member

Avatar #avatar-1735.gif


Dabei seit:
Beiträge: 117
Herkunft: 75389 Neuweiler

Themenstarter:

beantworten | zitieren | melden

Hallo zusammen,

ich habe es nochmal probiert.
Mein Laptop ist dann wieder eingefroren.
Ich fahre Xp SP2.
Hatte eigentlich nie Probleme.
Aber ich egal. ich habe meine Tests sehr gut mit einem Timer hinbekommen und weis nun welche Progressbar ich neheme.

Aber nun habe ich ein neues Problem.
Das mit dem Timer hat gut geklappt und ich konnte die Optik und das Aussehen der verschiedenen P-Bars sauber testen.
Nun will ich aber diese P-Bar einsetzten. Und zwar waehrend ich eine etwa 5 MB grosse Datei einlese.
Ich komme aber nicht damit klar wie ich die Fortschrittsanzeige der P-Bar in Bezug zum Fortschitt des Einlesens der Datei bringen soll.
Null Idee. Mit einem Timmer kann ich da wohl nicht arbeiten.
Ich denke das ich vorher die Zeilen der Datei ermitteln sollte und daraus die Prozentzahl errechne. Oder nach der Groesse der Datei?

Eventuell mache ich auch alles zu kompliziert.
Werde heute abend mal testen, falls hier in den USA kein Eishockey kommt :-)).

JoFenchel
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Kommt darauf an wie Du das File einliest....

Wenn mit this.TextBoxXY.Text=StreamReader.ReadToEnd(); dann wirds schwierig mit Progressbar... dann gehts aber auch so schnell dass es keine Progressbar braucht....
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
jofenchel
myCSharp.de - Member

Avatar #avatar-1735.gif


Dabei seit:
Beiträge: 117
Herkunft: 75389 Neuweiler

Themenstarter:

beantworten | zitieren | melden

Hallo Programmierhans,

ich lese das File Zeile fuer Zeile ein.
Weil ich jede Zeile mit einem Regex parsen muss.
Deshalb haette ich gerne die P-Bar um den Fortschritt zu sehen.

JoFenchel
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Dann kannst Du ja die Progressbar nach n-Zeilen aktualisieren
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo jofenchel,

eine Fortschrittsanzeige für 5MB? Was sind denn das für aufwändige Regex. Sollte doch eigentlich schwupps gehen. Die Festplatte alleine liest 5MB jedenfalls in Sekundenbruchteilen.

Ansonsten ist doch zeilenweises Einlesen für die Fortschrittsanzeige sehr praktisch, weil du aufs Byte genau wissen kannst, wie weit du schon bist.

Hallo .unreal,

naja, eine Sekunde einfrieren der Anwendung ist doch nicht das gleiche, wie rebooten müssen, weil alles hängt. Außerdem war ja das sekundenweise Blockieren schon ausführlich diskutiert worden.

herbivore
private Nachricht | Beiträge des Benutzers
jofenchel
myCSharp.de - Member

Avatar #avatar-1735.gif


Dabei seit:
Beiträge: 117
Herkunft: 75389 Neuweiler

Themenstarter:

beantworten | zitieren | melden

Hallo herbivore,
Zitat
Ansonsten ist doch zeilenweises Einlesen für die Fortschrittsanzeige sehr praktisch, weil du aufs Byte genau wissen kannst, wie weit du schon bist.

Sorry, aber ich habe null Ahnung was du meinst oder wie das gehen soll.
Habe schon im Forum gesucht aber nichts gefunden.


JoFenchel
private Nachricht | Beiträge des Benutzers