Anzeige

 C# - ProgressBar durch Threads steuern ?!


Alexander12

Erfahrenes Mitglied
#1
Hallo @ all:

Ich hab' ein kleines Programm gemacht, dass Dateien per File.Copy() kopiert.
Kann ich da eigentlich auch noch 'ne ProgressBar in mein Form machen, dass den Fortschritt anzeigt, weil bei großen Dateien bleibt das Form hängen ...
Kann man die Datei z.B. in 2 MB große Stücke teilen, die das Programm nacheinander kopiert un dann im Zielordner wieder zusammensetzt?
Hab' auch schon was von Threading gehört und auch schon im Forum gesucht, habe aber nichts gefunden.

Hat jemand ein paar Codefetzen, die mir helfen könnten? ;)

MfG Alexander12
 

zovax

Erfahrenes Mitglied
#2
Eine Progressbar aendert auch nichts an der Tatsache, dass dein Programm solange unerreichbar ist, bis die Datei kopiert ist. Das kopieren muss in einem Nebenthread erfolgen, egal ob mit oder ohen Progressbar. Ich denke, dass die Trhead Klasse (System.Threading.Thread) relativ selbsterklaerend ist.

Du instanziierst ein neues Thread-Objekt und uebergibst ihm die Methode die in diesem Thread ausgefuehrt werden soll (in deinem Fall die Kopier-Methode). Dann startest du den Thread via Thread.Start();

Sollte aehnlich dem hier aussehen (nicht hauen bei Fehlern, hab auch nicht die MSDN im Kopf und kein VS drauf :)):
Code:
Thread t = new Thread(new ThreadStart(CopyFiles));
t.Start();
//Weitere Anweisungen fuer den Hauptthread
 

Alexander12

Erfahrenes Mitglied
#3
Hallo,

Gut, das habe ich verstanden. Ich habe 'ne Datei (1,3 Gigabyte) kopiert. Das Programm bleibt jetzt nicht mehr hängen und es funktioniert perfekt! :)
Aber wie kriege ich jetzt die progressbar rein, die den Fortschritt des Kopiervorgangs abruft, denn bei so einer großen Datei dauert das schon sehr lange ...
Das Programm arbeitet zwar Perfekt weiter, aber man weiß ja dann nicht wie viel schon kopiert ist ... :(

Hier ist mein Code:

Code:
using System.Threading;
using System.IO;
[...]
Code:
public static void CopyFiles()
{
try
{
       string path = @"c:\Test.txt";
       string path2 = @"c:\Dokumente\Test.txt";
       System.IO.File.Copy(path, path2);
}
catch
{
       MessageBox.Show("Kopieren fehlgeschlagen!");
}
}


private void button1_Click(object sender, EventArgs e)
{
       Thread t = new Thread(new ThreadStart(CopyFiles));
       t.Start();
}
Danke schon Mal für die Antworten! ;)
 
#4
Hi.

Da wirst du dir eine eigene Copy Methode schreiben müssen.

Öffnest die Datei und dort wo die Kopie sein soll erstellst eine neue. In einer Schleife fürst dann die folgenden Aufgaben solange aus bis das letzte Bit übertragen ist. ;)

  • Gewisse Anzahl an Bytes lesen
  • Gelesenen Bytes die neue Datei schreiben
  • Step Methode von der Progressbar aufrufen

MfG,
Alex
 

Alexander12

Erfahrenes Mitglied
#5
Hi Alex,

Hast du da evtl. 'nen Code, der mir witerhelfen könnte, hab so was noch nicht gemacht,
bisher hab ich nämlich nur kleine Dateien (*.txt) mit dem einfachen File.Copy() kopiert ... :)

MfG Alexander12
 
#6
Schau dir einfach die Stream und alle davon abgeleiteten Klassen an.

In deinem Thread zum Dateiversand übers Netzwerk habe ich dir einen Thread verlinkt in dem sowas gemacht wurde. Dort wird auch mit Streams gearbeitet, ist so ziemlich das gleiche nur das du halt diesmal einen Stream hast der auf eine Datei zeigt.
 
#7
Hallo Alexander12!

Ich hab heut leider auch nicht so die Zeit.
Hier siehst, wie Du deinen Thread überwachen und stoppen kannst.
[thread=210935]Thread Hilfe, wie beenden - Thread[/thread]
Bau da ein Event ein damit Du den aktuellen AusführungsStatus überwachen kannst. ;)

MfG, cosmo
 

Alexander12

Erfahrenes Mitglied
#8
Hi.

Danke für eure Antworten, werde mir das gleich mal anschaun.

@Alexander Schuc:

Danke für den Tipp mit den Streams, haben mich echt weitergebracht! :)

@Cosmo:

Danke für die Infos für Threads, jetzt bin ich ja rund um versorgt! :p

MfG Alexander12
 
Anzeige

Neue Beiträge

Anzeige