Thread::Sleep



  • Hallo Leute,

    ich habe folgendes vor.

    Ich möchte Daten kopieren und den Verlauf mittels Progressbar anzeigen.

    Nun habe ich aber ein Problem mit der Sleep Funktion.

    Wenn ich mein BackGrounworker für nur 1 Millisekunde in den Schlaf schicke, kann ich in der Zwischenzeit duschen gehen, eine Inspektion an mein Auto machen und danach noch für 2 Tage an den Strand fahren.
    Ok bisschen übertrieben, aber das dauert ewig.

    Ohne Sleep hat er die Daten in ca. 5-6 Sekunden geschrieben.

    Woran kann das liegen?
    Ist der BackgroundWorker nicht so gut?
    Sollte ich lieber ein eigenes Thread schreiben?

    Hier noch ein wenig Code...

    while (true)
    		{
    			if(abort == true)
    			{
    				break;
    			}
    			int bytesRead = gzDecompressed->Read(buffer, readOffset, 100);
    			// Wenn Ende der Daten erreicht ist:
    			if (bytesRead == 0)
    			{
    				break;//Schleife verlassen:
    			}
    			readOffset += bytesRead;
    			totalBytes += bytesRead;
    			InvokeSetLoopValue(totalBytes);//Wert von y an den Thread übergeben
                //Thread::Sleep(1); //1 Millisekunde für den Thread.
    		}
    

    Danke für jede Hilfe

    Gruß Gerry



  • Warum benutzt du überhaupt Sleep?



  • Ohne Sleep kann ich diesen Thread nicht abbrechen...
    Aber die Möglichkeit muss ich haben...



  • Der BackgroundWorker hat schon einen Weg um Operationen abzubrechen:
    http://msdn.microsoft.com/de-de/library/cc221403(VS.95).aspx

    Simon



  • Thx Simon für die Antwort.
    Aber ich kann keinen Button klicken der den BackGroundWorker zum aussteigen bewegen kann.
    Geht nicht, wie in einer Schleife die in ein und dem selben Thread läuft. Nix zu machen.
    Noch einen Tip?
    Sonst werde ich das ganze Projekt vergessen...

    Thx

    Gerry



  • Mit dem Button abort setzen.

    Sonst werde ich das ganze Projekt vergessen...

    Vllt. keine schlechte Idee - außer Du meinst es erst mit der Softwareentwicklung.



  • Knuddlbaer schrieb:

    Mit dem Button abort setzen.

    Der Button ist doch blockiert, daas ist doch mein Problem.
    Ich kann da raufklicken wie ein Bekloppter, aber nix passiert.
    Weil er blockiert ist.
    Oder soll ich lieber Thread^ benutzen satt den Backgroundworker?
    aber ist doch das gleich oder nicht?

    Natürlich ist mir die Softwareentwicklung wichtig... 👍

    Gruß

    Gerry LG



  • Gerry LG schrieb:

    Der Button ist doch blockiert, daas ist doch mein Problem.
    Ich kann da raufklicken wie ein Bekloppter, aber nix passiert.
    Weil er blockiert ist.

    Dann hast du den BackgroundWorker falsch eingesetzt. Die Arbeit lagert man durch den Backgroundworker aus und die GUI blockiert nicht mehr. Das ist ja die Absicht hinter dem ganzen. Was relativ oft passiert ist, dass man ausversehen die Arbeit wieder zurück in die GUI verlagert.

    Deine gepostete While Schleife ist in dem DoWork vom BackgroundWorker oder?
    Was machst du in InvokeSetLoopValue(totalBytes)?



  • Hallo,

    ja die Arbeit wird in DoWork() verrichtet.
    Mit totalBytes wird die Progressbar aufgezogen.
    Ich werde nochmal alles durchgehen um sicher zugehen das ich nicht wieder in der GUI lande...
    War erstmal gut der Tip.

    Komm dann nochmal durch und gebe Meldung ab.

    Thx

    Gruß


Anmelden zum Antworten