Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Programm vor Absturz bewahren

Frage Entwicklung VB for Applications

Mitglied: carp-catcher

carp-catcher (Level 1) - Jetzt verbinden

15.03.2012 um 15:02 Uhr, 5183 Aufrufe, 19 Kommentare

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

Ich bin fün r jedeTipp Dankbar


Greez carp
Mitglied: SlainteMhath
15.03.2012 um 15:48 Uhr
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
Bitte warten ..
Mitglied: MrTrebron
15.03.2012 um 15:57 Uhr
Hallo carp,

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

Gruß
Norbert
Bitte warten ..
Mitglied: dan0ne
15.03.2012 um 16:16 Uhr
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
Bitte warten ..
Mitglied: MrTrebron
15.03.2012 um 16:20 Uhr
@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
Bitte warten ..
Mitglied: SlainteMhath
15.03.2012 um 16:21 Uhr
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
Bitte warten ..
Mitglied: carp-catcher
15.03.2012 um 16:27 Uhr
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.

@MrTrebron
Du sagtest was von "Background Thread" kann man vll die funktion im Hintergrund aufrufen ?
Das dürfte vielleicht das abstürzen verhindern ?
Bitte warten ..
Mitglied: carp-catcher
15.03.2012 um 16:30 Uhr
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
Bitte warten ..
Mitglied: MrTrebron
15.03.2012 um 16:32 Uhr
Hi

schau mal hier klick

Edit: oder hier klick

Gruß
Bitte warten ..
Mitglied: carp-catcher
15.03.2012 um 16:44 Uhr
http://www.dreamincode.net/code/snippet875.htm
ich krieg die seite nicht aufgerufen
ich weiß auch net warum, google chrome konnte seite net finden.
komisch ....
Bitte warten ..
Mitglied: Skyemugen
15.03.2012 um 16:57 Uhr
FireFox anyone 30 obligatorische Zeichen
Bitte warten ..
Mitglied: mrtux
15.03.2012 um 18:04 Uhr
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
Bitte warten ..
Mitglied: carp-catcher
15.03.2012 um 20:35 Uhr
also die links gehen jetzt
komisch war vll auch das internet.

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

Diese hat eine Methode UploadFileAsync

01.
 Private WithEvents wc As New Net.WebClient 
02.
 
03.
Sub Upload() 
04.
'Userdaten für den FTP Upload. 
05.
'Hinweis. DU SOLLTEST KEINE ANMELDEDATEN IM CODE Hinterlegen, auf die KANN JEDER Der das TOOL hat ZUGREIFEN!! 
06.
 wc.Credentials = New Net.NetworkCredential("user", "pass") 
07.
'Upload ASYNC STARTEN (es wrid ein neuer Thread benutzt -> GUI wird nicht blockiert! 
08.
 wc.UploadFileAsync(New Uri("ftp://ftp.bla.blalala/" & Dateiname), Dateipfad) 
09.
End Sub 
10.
 Private Sub wc_UploadFileCompleted(ByVal sender As Object, ByVal e As System.Net.UploadFileCompletedEventArgs) Handles wc.UploadFileCompleted 
11.
'hier ist der Upload fertig 
12.
' WICHTIG 
13.
' über e.Error bekommst du mit, ob es einen FEHLER gab, und das entsprechend behandeln 
14.
    End Sub 
15.
    Private Sub wc_UploadProgressChanged(ByVal sender As Object, ByVal e As System.Net.UploadProgressChangedEventArgs) Handles wc.UploadProgressChanged 
16.
  'Über e. kommst du auf BytesReceived usw. für deine Progressbar 
17.
    End Sub
Du benötigst also keinen BGW


Gruss Mono
Bitte warten ..
Mitglied: mrtux
17.03.2012 um 02:12 Uhr
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
Bitte warten ..
Mitglied: MonoTone
18.03.2012 um 13:51 Uhr
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.
Bitte warten ..
Mitglied: mrtux
18.03.2012 um 15:34 Uhr
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...

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..

mrtux
Bitte warten ..
Mitglied: carp-catcher
18.03.2012 um 16:09 Uhr
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.
01.
Private WithEvents wc As New Net.WebClient 
02.
 Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click 
03.
        Try 
04.
 
05.
            wc.Credentials = New Net.NetworkCredential("user", "pw") 
06.
            wc.UploadFileAsync(New Uri("ftp://ftp.meineseite.de/Wüstenlandschaft.jpg"), "C:\Users\Public\Pictures\Sample Pictures\Wüstenlandschaft.jpg") 
07.
 
08.
        Catch ex As Exception 
09.
            MsgBox(ex.Message) 
10.
        End Try 
11.
 
12.
End Sub
Ich währe dankbar wenn ihr mir helfen könntet

LG carp
Bitte warten ..
Mitglied: SlainteMhath
19.03.2012 um 09:02 Uhr
Moin,

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

lg,
Slainte
Bitte warten ..
Mitglied: carp-catcher
19.03.2012 um 22:44 Uhr
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.
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Windows Userverwaltung
Software Absturz bzw. fehlende Programm Teile (2)

Frage von Hardrockracer zum Thema Windows Userverwaltung ...

Microsoft Office
32 Bit CAD Programm und Excel 64 Bit geht nicht (5)

Frage von GrueneSosseMitSpeck zum Thema Microsoft Office ...

Internet
Alternative zu MS Autoroute Außendienst-Programm

Frage von Yannosch zum Thema Internet ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (22)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...