Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.
Backgroundworker Abbruch
- VB.NET
- .NET (FX) 4.5–4.8
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 78 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.
-
-
@Amelie Meine Fragen in Post #48, Deine Antworten in Post #49.
Jeder Start Deines Programms braucht Verzeichnisse (von, nach) und Parameter (Kopie, Zip).
Diese Daten schreibst Du in eine Text-Datei.
Jede Zeile entspricht einem Start.
Dann liest Du die Text-Datei zeilenweise aus.
Du liest 2 Verzeichnisse und einen Satz Parameter und tust das, was da steht: Kopie von nach bzw. Zippen von nach.
Und das ganze dan so lange, bis alle Zeilen der Textdatei abgearbeitet sind.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Hi
@Amelie: Verstehe ich. Jeder fängt mal klein an. Über kurz oder lang kommst Du aber an APIs und COM Interfaces nicht vorbei da das .NET-Framework auch nicht alles abdeckt. Evtl. lehne ich mich jetzt auch zu weit raus wenn ich sage das im .NET-Framework sogar noch APIs verwendet werden, die nicht wirklich zur Windowsversion passen. Bestes Bsp ist die API SHBrowseForFolder die auch im NET-Framework für den BrowseForFolder-Dialog verwendet wird. Ab WinVista sollte man diese API nicht mehr verwenden, sagt MS sogar selber, und stattdessen das COM Interface IFileDialog. Soweit ich mich erinnere ist das aber noch nicht im NET-Framework enthalten und es wird immer noch der asbach alte Dialog von vor Vista angezeigt. Also wenn Du was modernes brauchst, musst du es selbst programmieren.Mfg -Franky- -
@RodFromGermany
Ich glaube du hast mich falsch verstanden...
Das kopieren als solches habe ich ja....Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. -
Amelie schrieb:
Das kopieren als solches habe ich ja....
Das geht doch All In One.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
@RodFromGermany
Nein nicht 2 Programme. Gugg mal in meinen ersten Beitrag, dahabe ich schon "kopiert & gezipt" in einem durchgang.
Jetzt habe ich umgebaut auf Async ..
Im Moment hänge ich da, wo ich die Progressbar einbinden kann...
Ich habe die einzenlen Fils, die Anzahl der Files ... wie bekommt ich nun die Bar zum laufen?
Ein Codeabschnitt aus der Kopierroutine
VB.NET-Quellcode
-
- IO.Directory.CreateDirectory(mstrTempdir)
- For Each filename As String In Directory.GetFiles(classys.Source)
- If File.Exists(filename) Then
- Dim sourceFile As String = String.Empty
- Dim tempFilePath As String = String.Empty
- sourceFile = Path.GetFileName(filename)
- tempFilePath = mstrTempdir & "\" & sourceFile
- File.Copy(filename, tempFilePath, True)
- End If
- Me.Invoke(Sub() Result(filename & " von " & classys.countfiles & "Dateien wird kopiert"))
- Next
- MsgBox("Copy Successful", vbOKOnly, "Message")'<===== kommt später weg
- Else
- Me.Invoke(Sub() Result("blablabla."))
- ' Zip-Routine kommt später
- End If
- End Sub
- Private Sub Result(antwort As String)
- lbl_info.Text = (antwort)
- progbar.Visible = True
- progbar.Value += 1 '<========= hier hänge ich gerade...hmmm????
- End Sub
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. -
Amelie schrieb:
Im Moment hänge ich da, wo ich die Progressbar einbinden kann...
Die Progressbar läuft im GUI-Thread, das Zippen in einem anderen Thread.
Dieser andere Thread muss wie auch immer getaktet (Anzahl der Dateien, Anteil an der Speichergröße) ein Event an den GUI-Thread senden, dort kannst Du entsprechend des Wertes die Progressbar hochzählen.
Wegen Trennung von GUI und Daten würde ich nicht im Zipp-Thread die Progressbar invoken.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
@RodFromGermany
Genau da hänge ich, wie ich das Event an die ProgBar senden soll...????
Die Namensübergabe ( Dateinamen ) klappt ja schonAsperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. -
@Amelie Befindet sich der Async-Code in derselben Klasse wie die Progressbar?
Innerhalb einer Klasse kannst Du direkt eine Prozedur invoken.
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.
-
@Amelie So was:
VB.NET-Quellcode
- Public Class Form1
- Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Label2.Text = "starte Berechnung"
- Button1.Enabled = False
- Await Threading.Tasks.Task.Run(Sub() DoAny())
- Label2.Text = "puh, endlich fertig"
- Button1.Enabled = True
- End Sub
- Private Sub DoAny()
- Dim x As Integer = 0
- For i = 1 To 50000000
- If i Mod 10000 = 0 Then
- Dim ac = New Action(Of Integer)(AddressOf Me.UpdateProgressbar)
- Me.Invoke(ac, x)
- x += 1
- End If
- Next
- End Sub
- Private Sub UpdateProgressbar(value As Integer)
- Label1.Text = value.ToString
- End Sub
- End Class
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
So habe nun den BGW auf Async umgebaut und das mit dem " Abbruch " des Kopier,-Zip-Vorgangs und der Progressbar etc auch hinbekommen.
Hier mal meine Kopierroutine. Ist bestimmt zu verbessern oder?
countfiles kommt aus einer funktion und die Verzeichnisse speicher ich in den Einstellungen.
Spoiler anzeigen
Beispiel der Quelle.
VB.NET-Quellcode
- Private Sub dowork()
- If classys.Zip = False Then
- Me.Invoke(Sub() Result("Daten werden kopiert."))
- Dim zaehler As Integer = 0
- IO.Directory.CreateDirectory(mstrTempdir)
- For Each filename As String In Directory.GetFiles(classys.Source)
- If File.Exists(filename) Then
- Dim sourceFile As String = String.Empty
- Dim tempFilePath As String = String.Empty
- sourceFile = Path.GetFileName(filename)
- tempFilePath = mstrTempdir & "\" & sourceFile
- File.Copy(filename, tempFilePath, True)
- End If
- Me.Invoke(Sub() Result(filename))
- Dim wert = New Action(Of Integer)(AddressOf Me.UpdateAusgaben)
- Me.Invoke(wert, zaehler)
- zaehler += 1
- If Abbruch = True Then
- Exit Sub
- End If
- Next
- Else
- Me.Invoke(Sub() Result("Daten werden gezippt."))
- 'Zip-Routine
- End If
- End Sub
- Private Sub UpdateAusgaben(werte As Integer)
- lbl_zaehler.Visible = True
- lbl_zaehler.Text = werte.ToString & " von " & classys.countfiles & " Dateien verarbeitet."
- Dim prozent As String = CStr(werte / CDbl(classys.countfiles) * 100.0)
- progbar.Visible = True
- progbar.Value = CInt(prozent)
- End Sub
- Private Sub Result(antwort As String)
- lbl_info.Text = (antwort)
- End Sub
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. -
@ErfinderDesRades Mag sein, aber invoken muss ich trotzdem:
====
@Amelie Was soll das, numeerischen Weert in einen String und zurück in numerischen Wert konvertieren:
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Nope
VB.NET-Quellcode
- Imports System.Threading.Tasks
- Public Class FrmMain
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- TestTask().Start()
- End Sub
- Private Function TestTask() As Task
- Dim ProgressReporter As New Progress(Of Integer)(Sub(x) ReportProgress(x))
- Return New Task(Sub() TestJob(ProgressReporter))
- End Function
- Private Sub ReportProgress(x As Integer)
- Label1.Text = x.ToString
- End Sub
- Private Sub TestJob(ProgressReporter As IProgress(Of Integer))
- For i = 0 To 100
- ProgressReporter.Report(i)
- Next
- End Sub
- End Class
Der Progress darf nicht im selben "Nebenläufigkeitsbereich" wie der Task selber laufen.
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
@RodFromGermany
Ich bin mal wieder durcheinander gekommen mit "String" und "Integer" und dann schlug das VB diese Konvertierung vor.. grrr...
@VaporiZed
"Nebenläufigkeitsbereich" ????Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. -
@Amelie Nicht alles, was der vorschlägt, ist unbedingt richtig, noch weniger ist elegant.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
ErfinderDesRades schrieb:
falsch verwendet
VB.NET-Quellcode
- Public Class Form1
- Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Dim p As IProgress(Of Integer) = New Progress(Of Integer)(Sub(i)
- Label1.Text = i.ToString
- End Sub)
- Label2.Text = "starte Berechnung"
- Button1.Enabled = False
- Await Threading.Tasks.Task.Run(Sub() DoAny(p))
- Label2.Text = "puh, endlich fertig"
- Button1.Enabled = True
- End Sub
- Private Sub DoAny(p As IProgress(Of Integer))
- Dim x As Integer = 0
- For i = 1 To 500000000
- If i Mod 10000 = 0 Then
- p.Report(x)
- End If
- x += 1
- Next
- End Sub
- End Class
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!
-
Benutzer online 1
1 Besucher
-
Ähnliche Themen
-
_PASCAL_ - - Sonstige Problemstellungen
-
7 Benutzer haben hier geschrieben
- Amelie (33)
- RodFromGermany (25)
- VaporiZed (10)
- -Franky- (6)
- ErfinderDesRades (3)
- ThomasG82 (1)
- Fakiz (1)