carp-catcher
Goto Top

Programm vor Absturz bewahren

Ich möchte vermeiden das sich mein Programm beim Datei Upload aufhängt.

hallo zusm,

ich habe ein Programm welches einen Datei Upload macht erstellt.
Soweit auch kein Problem.
[code]My.Computer.Network.UploadFile(bildpfad.Text, "ftp://.de/data/" & name_endung , "", "***") [/code]
Funktioniert auch super.
Problem liegt jetzt darin, wenn der User schlechtes Internet hat und im Programm rumklickt stürtzt es ab.
Kann man diesen Absturz vermeiden ?

Fals es keine Lösung gibt muss ich halt ein
Me.Hide()
und ein
Me.Show()
einbauen um das Programm vor dem Absturz zu bewahren.

Aber ich denke das geht auch eleganter face-smile

Ich bin fün r jedeTipp Dankbar face-smile


Greez carp

Content-ID: 182042

Url: https://administrator.de/contentid/182042

Ausgedruckt am: 26.11.2024 um 08:11 Uhr

SlainteMhath
SlainteMhath 15.03.2012 um 15:48:56 Uhr
Goto Top
Moin,

was genau bedeutet denn
Programm [...] stürtzt [...] ab.
Fehlermeldung? Geht's einfach zu? BlueScreen?

Ohne den Code, die .NET Version oder gar die eingesetzte Programmiersprache zu kennen: Schon mal versucht ein bischen Errorhandling einzubauen?

lg,
Slainte
MrTrebron
MrTrebron 15.03.2012 um 15:57:38 Uhr
Goto Top
Hallo carp,

also ohne genaue Angabe der Programmiersprache schwierig da mehr zu sagen als Error Handling einbauen.
In .net
Try - Catch

Gruß
Norbert
dan0ne
dan0ne 15.03.2012 um 16:16:42 Uhr
Goto Top
Hallo,

wie Trebon schon richtig sagt kann man dir ohne Angaben der Sprache nicht helfen. Ich bezweifel aber das der Absturz nur mit der Internetverbindung zu tun hat!

Gruss
MrTrebron
MrTrebron 15.03.2012 um 16:20:01 Uhr
Goto Top
@dan0ne

Jetzt mal so in die Glaskugel geschaut:
Der Upload steht in einer Sub oder Function, ohne Errorhandling.
Hinzu kommt das die Form bedienbar bleibt, ohne das er den Upload in einen Background Thread startet.
Wenn dann der User in der Form Buttons klickt oder andere Events auslöst während der Upload noch läuft knallt es.

Norbert
SlainteMhath
SlainteMhath 15.03.2012 um 16:21:29 Uhr
Goto Top
Was vorstellbar wäre:
- "My.Computer.Network.UploadFile()" ist eine "blocking function"
- Wenn "das Internet schlecht ist" und der user "im Programm rumklickt"
Dann meint Windows "das Program reagiert nicht mehr"

Lösung wäre hier eine non-blocking Function zu benzutzen.

/EDIT: ah, MrTrebron war schneller face-smile
carp-catcher
carp-catcher 15.03.2012 um 16:27:41 Uhr
Goto Top
Programmiersprache ist vb.net
und upload ist in einer Funktion im Try-Catch block.

Der catch block nützt allerdings nicht viel, der zeigt mir nüx an wenn das ding abstürzt. face-sad

@MrTrebron
Du sagtest was von "Background Thread" kann man vll die funktion im Hintergrund aufrufen ?
Das dürfte vielleicht das abstürzen verhindern face-smile ?
carp-catcher
carp-catcher 15.03.2012 um 16:30:04 Uhr
Goto Top
ja eine non-blocking Funktion zu verwenden klingt auch gut,
habe das zwar noch nie so gehört aber ich frag mal die jungs von google face-smile
MrTrebron
MrTrebron 15.03.2012 um 16:32:01 Uhr
Goto Top
Hi

schau mal hier klick

Edit: oder hier klick

Gruß
carp-catcher
carp-catcher 15.03.2012 um 16:44:17 Uhr
Goto Top
http://www.dreamincode.net/code/snippet875.htm
ich krieg die seite nicht aufgerufen face-sad
ich weiß auch net warum, google chrome konnte seite net finden.
komisch ....
Skyemugen
Skyemugen 15.03.2012 um 16:57:42 Uhr
Goto Top
FireFox anyone 30 obligatorische Zeichen
mrtux
mrtux 15.03.2012 um 18:04:01 Uhr
Goto Top
Hi !

Warum versuchst Du das nicht über einen modalen Dialog (der solange den Focus hat, bis der Upload abgeschlossen ist) zu regeln? Dann kann der User in der Zeit auch keine Buttons und Menues anklicken. Damit der User sehen kann, dass noch etwas passiert, würde ich evt. dann noch eine Progessbar anzeigen....

mrtux
carp-catcher
carp-catcher 15.03.2012 um 20:35:28 Uhr
Goto Top
also die links gehen jetzt face-smile
komisch war vll auch das internet.

@mrtux klingt gut,...aber wie soll eine Progressbar erstellt werden, die genau anzeigt wann Upload fertig ist ?
MonoTone
MonoTone 16.03.2012 um 16:45:25 Uhr
Goto Top
Es gibt für solche Vorhaben eine Klasse WebClient.

Diese hat eine Methode UploadFileAsync

 Private WithEvents wc As New Net.WebClient

Sub Upload()
'Userdaten für den FTP Upload.  
'Hinweis. DU SOLLTEST KEINE ANMELDEDATEN IM CODE Hinterlegen, auf die KANN JEDER Der das TOOL hat ZUGREIFEN!!  
 wc.Credentials = New Net.NetworkCredential("user", "pass")  
'Upload ASYNC STARTEN (es wrid ein neuer Thread benutzt -> GUI wird nicht blockiert!  
 wc.UploadFileAsync(New Uri("ftp://ftp.bla.blalala/" & Dateiname), Dateipfad)  
End Sub
 Private Sub wc_UploadFileCompleted(ByVal sender As Object, ByVal e As System.Net.UploadFileCompletedEventArgs) Handles wc.UploadFileCompleted
'hier ist der Upload fertig  
' WICHTIG  
' über e.Error bekommst du mit, ob es einen FEHLER gab, und das entsprechend behandeln  
    End Sub
    Private Sub wc_UploadProgressChanged(ByVal sender As Object, ByVal e As System.Net.UploadProgressChangedEventArgs) Handles wc.UploadProgressChanged
  'Über e. kommst du auf BytesReceived usw. für deine Progressbar  
    End Sub

Du benötigst also keinen BGW


Gruss Mono
mrtux
mrtux 17.03.2012 um 02:12:23 Uhr
Goto Top
Hi !

Zitat von @carp-catcher:
@mrtux klingt gut,...aber wie soll eine Progressbar erstellt werden, die genau anzeigt wann Upload fertig ist ?

Das ist nicht so einfach, wenn Du keine Klassen (wie der Kollege MonoTone oben schon schreibt) verwendest. Eine Klasse bietet normalerweise dann Ereignisse, die Du auswerten kannst. Ich beziehe mich jetzt aber in meinem rein fiktiven Beispiel grob angenähert an die Syntax von Objekt Pascal (also Delphi oder Lazarus, denn VB ist bei mir schon ein paar Jährchen her).

Da gibt es dann z.B. ein Ereignis OnUpload(Complete: Integer). Der Wert der Variablen Complete könnte Dir dann beispielsweise angeben, wie viele Megabyte schon übertragen wurden. Das kannst Du dann umrechnen und in einer ProgressBar oder einem Label als Prozentwert anzeigen. Das VB Beispiel des Kollegen MonoTone verdeutlicht das ja schon ansatzweise.

Damit das Ereignis immer wieder von neuem ausgelöst werden kann, muss deine Anwendung "immer wieder mal" die Kontrolle an das OS zurückgeben. Unter Delphi mache ich das z.B. mit Application.ProcessMessages. Wenn Du dann einen modalen Dialog verwendest, verliert deine Anwendung, trotz der kurzfristigen Rückgabe an das OS, nicht den Fokus. So kann der User in dieser Zeit normalerweise auch keine anderen Buttons oder Menüs betätigen, bis der Upload-Dialog wieder geschlossen wird und durch die kurzfristige "Rückgabe" an das OS, kann dieses dann auch wieder "CPU Zeit" an andere Anwendungen vergeben und stellt so auch fest, dass deine Anwendung nicht "hängt", um es mal etwas laienhaft auszudrücken.

Den ganzen "Vorgang" kannst Du dann, wie es die Kollegen SlainteMhath und MrTrebron schon erwähnten, über ein Errorhandling (in Object Pascal mach ich das über einen try, except, finally - Block) absichern.

Die obigen Angaben sind nur Beispiele um die Funktionsweise zu verdeutlichen! Eine Klasse WebClient, ein Ereignis OnUpload() und die Variable Complete gibt es unter Delphi natürlich nicht. Wie gesagt, nur um die Sache aus meiner Sicht "so einfach wie möglich" und an einem praktischen Beispiel zu verdeutlichen, denn was nützt einem das perfekte Wissen über eine Programmiersprache, wenn man die Arbeitsweise einer Methode oder die Abläufe hinter einem OS nicht verstanden hat. Erst muss man wissen wie etwas funktioniert (bzw. funktionieren soll), erst dann kann man sich an die programmiertechnische Umsetzung in der Praxis (mittels der "Sprache" seiner Wahl) machen.

mrtux
MonoTone
MonoTone 18.03.2012 um 13:51:49 Uhr
Goto Top
Grundsätzlich gebe ich mrtux recht.
Mein Beispiel benötigt allerdings keinen modalen Dialog und auch kein extra Try-catch-
Errorhandling und auch keine Meldung an das Os.
Ich persönlich finde modale Dialoge veraltet...
Man sollte m.E. die GUI immer ansprechbar belassen.
Sollte z.B. der upload sehr langsam vorwärts gehen, will ich den nicht zwingend abbrechen mussen aber
dennoch die GUI bedienen können.
Durch multithreading kann ein thread mit einer Aufgabe parallel und nahezu unabhängig von der Anwendung laufen.
Dadurch kann man die GUI auch problemlos weitet bedienen.
Man muss sich dann nur um die Rückführung der Ergebnisse in die GUI kümmern.
Beim webclient oder beim bgw ist da aber nicht einmal ein cross thread calling Problem vorhanden.
mrtux
mrtux 18.03.2012 um 15:34:54 Uhr
Goto Top
Hi !

Zitat von @MonoTone:
Durch multithreading kann ein thread mit einer Aufgabe parallel und nahezu unabhängig von der Anwendung laufen.

Ja natürlich und wenn Du damit Erfahrung hast, warum nicht? Mein Kommentar von oben ist ja nur ein Vorschlag... face-wink

Man muss sich dann nur um die Rückführung der Ergebnisse in die GUI kümmern.

Und dabei muss man aber sorgfältig vorgehen, dabei passieren oftmals Fehler, die dann zu Leaks führen können, daher arbeite ich bei ersten Versionen einer Applikation immer mit modalen Dialogen. Ich bin da eher konservativ und etwas in einen extra Thread "auslagern" kann man ja hinterher auch noch. Manche IDEs bieten dazu sogar schon vorgefertigte Templates, mit denen ich aber auch nicht arbeite...Eben konservativ halt.. face-wink

mrtux
carp-catcher
carp-catcher 18.03.2012 um 16:09:34 Uhr
Goto Top
hallo,
ich habe das mal ausprobiert und komme gerade nicht weiter.
Selbst wenn ich ein falsches Passwort eingebe gibt der try- catch block keine error Meldung aus, komisch eigentlich.
Private WithEvents wc As New Net.WebClient
 Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click
        Try

            wc.Credentials = New Net.NetworkCredential("user", "pw")  
            wc.UploadFileAsync(New Uri("ftp://ftp.meineseite.de/Wüstenlandschaft.jpg"), "C:\Users\Public\Pictures\Sample Pictures\Wüstenlandschaft.jpg")  

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

End Sub

Ich währe dankbar wenn ihr mir helfen könntet face-smile

LG carp
SlainteMhath
SlainteMhath 19.03.2012 um 09:02:56 Uhr
Goto Top
Moin,

nachdem der Aufruf Asynchron ist, wird keine Fehler geworfen. Das ganze wird per eventhandler erledigt. Siehe Zeile 10ff in MonoTone Codeschnipsel.

lg,
Slainte
carp-catcher
carp-catcher 19.03.2012 um 22:44:58 Uhr
Goto Top
abend,
stimmt den kricht man ja über e.error.tostring,
habs jetzt hinbekommen und das Programm hakt nicht mehr beim Upload und stürzt auch nicht mehr ab.
Ist echt klasse.
Ich danke euch für die Unterstützung.

greez carp


PS: das mit dem modalen Dialog und BGW habe ich nicht getestet, da es so am einfachsten ist wie ich finde.