AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Lazarus (IDE) CopyFile lässt die Anwendung hängen, wie umgehen?
Thema durchsuchen
Ansicht
Themen-Optionen

CopyFile lässt die Anwendung hängen, wie umgehen?

Ein Thema von AlexII · begonnen am 3. Jun 2015 · letzter Beitrag vom 5. Jun 2015
Antwort Antwort
Dejan Vu
(Gast)

n/a Beiträge
 
#1

AW: CopyFile lässt die Anwendung hängen, wie umgehen?

  Alt 4. Jun 2015, 21:55
+...aber in diesem Fall bringen mir Exceptions anstelle des String-Rückgabewertes überhaupt nicht weiter.
Und wie willst Du deine Rückgabefehlermeldungszeichenkette auswerten? Also, woher weißt Du, welcher Fehler genau aufgetreten ist? Ach, das ist Dir egal? Man kann ja streiten, ob Exceptions oder Rückgabewerte besser sind, aber wenn schon Rückgabewerte, dann wenigstens numerisch, oder als Enum.

Stell Dir mal vor, dein Programm soll mal im Ausland laufen...

Übrigens ist es keine Tugend, alles in eine Routine zu quetschen. Das ist sowas von gestern, ach was sag ich, vorvorvorgestern... Definier doch einfach eine Klasse, führe einfache kleine Methoden ein und schreibe das Ganze, das es verständlich ist. "Clean Code" nennt sich das. Probiere es mal aus.

Geändert von TBx ( 5. Jun 2015 um 06:05 Uhr) Grund: quote-Tag gefixt
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: CopyFile lässt die Anwendung hängen, wie umgehen?

  Alt 4. Jun 2015, 23:04
Übrigens ist es keine Tugend, alles in eine Routine zu quetschen. Das ist sowas von gestern, ach was sag ich, vorvorvorgestern... Definier doch einfach eine Klasse, führe einfache kleine Methoden ein und schreibe das Ganze, das es verständlich ist. "Clean Code" nennt sich das. Probiere es mal aus.
Prinzipiell bin ich deiner Meinung, aber bei dieser "Begründung" ziehst du niemanden aus dem Schatten der seitenlangen Prozeduren in säubernde Licht des blütenreinen Programmierens

Die Reaktionen sind imho leicht übertrieben (bis auf die zur Fehlerbehandlung ). Es gibt deutlich schlimmeren Code.
Der Hinweis auf den Workerpool ist für diese Aufgabe zwar legitim, man sollte das imho aber auch mal zu Fuß gemacht haben, damit man eine Vorstellung davon hat, was bei so einer asynchronen Ausführung so passiert.

Ein Fehler ist mir ins Auge gefallen: Der RuFileCopyExecute wird in Execute das falsche Callback übergeben. Eigentlich willst du ja die synchronisierte Variante.

Das CreateSuspended = true und das Konstrukt mit dem with kannst du dir sparen, wenn du die Eigenschaften, die du im with setzt, direkt im Konstruktor setzt.
OnTerminate wird im Hauptthread ausgeführt, das synchronize solltest du dir an der Stelle sparen; oder du lässt onTerminate leer und rufst ThreadCopyCallback(cRuFileCopyReady); direkt am Ende von Execute auf.

Geändert von BUG ( 4. Jun 2015 um 23:19 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: CopyFile lässt die Anwendung hängen, wie umgehen?

  Alt 5. Jun 2015, 06:30
Prinzipiell bin ich deiner Meinung, aber bei dieser "Begründung" ziehst du niemanden aus dem Schatten der seitenlangen Prozeduren in säubernde Licht des blütenreinen Programmierens
Ash on my main.
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: CopyFile lässt die Anwendung hängen, wie umgehen?

  Alt 5. Jun 2015, 09:00
Hallo,

ich habe den Eindruck, dass ihr mit den Exceptions jetzt total am Ziel vorbei argumentiert. Fangen wir doch mal ganz von vorne an. Wozu bzw. in welchen Anwendungsfällen verwende ich überhaupt eine "eigene" Kopier-Routine? Immer dann, wenn die normale WinApi oder was auch immer nicht ausreicht, oder Probleme verursacht, oder die Funktionalität nicht ausreicht.

In diesem Fall geht es darum, dass dem TE die Mainform einfriert. Also gibt es zwei grundsätzliche Lösungsmöglichkeiten: Separater Thread und/oder eigene Kopier-Routine. Soweit so gut, nun mal zur praktischen Anwendung. Wenn ich eine oder mehrere Dateien kopiere, dann brauche ich eine Rückmeldung, wenn dabei etwas schief geht, z.B. Festplatte ist voll, Ziel-Datenträger ist schreibgeschützt...was auch immer. Aber eine Exception werfen, weil z.B. die Zieldatei neuer ist als die Quelldatei? Sorry, aber das ist meiner Meinung nach ganz schlechter Programmierstil. Wie will ich in dem Fall eine ich nenne sie mal fatale Exception (z.B. Datenträger ist voll) von einer ganz normalen Meldung "Zieldatei ist neuer" unterscheiden? Hinzu kommt, in manchen Situationen will ich eine Meldung vielleicht gar nicht anzeigen, sondern ganz einfach ältere Dateien durch neuere ersetzen. Wie sieht das dann in eurem Quellcode aus?

Delphi-Quellcode:
try
  Dateien kopieren...
except
  // hier den ganzen Rotz auswerten, weil, die ganz normalen User-Messages - wenn
  // ich sie denn überhaupt dem User anzeigen möchte, landen auch hier.
end;
Das kann nicht wirklich euer Ernst sein. So würde ich das machen:

Delphi-Quellcode:
try
  Dateien kopieren...
  Bei Bedarf dem User entsprechende Messages zeigen, oder bei vielen Dateien alle Messages
  in eine Liste und am Schluss des Kopiervorganges anzeigen
except
  // hier die "echten" Exceptions auswerten, z.B. Datenträger ist voll
end;
Jeder kann das halten wie er will. Für mich sind Exceptions "Ausnahmen" und wenn ich eine Ausnahme nicht behandeln kann, nach eurer Logik z.B. die Ausnahme "Die Zieldatei ist neuer als die Quelldatei", wozu muss ich sie dann überhaupt erst mal werfen? Das widerspricht dem Grundprinzip der Exceptionbehandlung. Ihr verwechselt da ganz einfach zwei grundverschiedene Situationen: Ein wahlweise nach Bedarf für den User anzuzeigendes Ergebnis eines Kopiervorganges und einer Exception die bei diesem Vorgang aufgetreten ist.

Zitat von Dejan Vu:
Und wie willst Du deine Rückgabefehlermeldungszeichenkette auswerten? Also, woher weißt Du, welcher Fehler genau aufgetreten ist? Ach, das ist Dir egal?
Das ist genau der Punkt wo du total daneben liegst. Wenn ich genau wissen will, was bei der Kopieraktion passiert ist, dann ist beispielsweise ein Enum die richtige Wahl. Doch, das will und muss ich in diesem Fall doch gar nicht.

Wenn ich der Meinung bin, dass dem User eine Meldung angezeigt werden muss, dann zeige ich sie ihm. Wenn ich für den Fall, dass der Kopiervorgang ohne Usermeldung ablaufen soll, dem User etwas zeigen will oder muss, dann ist es eine "echte" Exception, z.B. "deine Platte ist voll".

Zitat von Dejan Vu:
Stell Dir mal vor, dein Programm soll mal im Ausland laufen...
Muss ich mir das vorstellen, und ist diese Aufgabenstellung Bestandteil dieses Threads? Nein. Also wozu dieses "provokannte Argument". Ach ja, die Antwort gibst du ja selber: Es gibt Besserwisser....

Zitat von BUG:
Das CreateSuspended = true und das Konstrukt mit dem with kannst du dir sparen, wenn du die Eigenschaften, die du im with setzt, direkt im Konstruktor setzt.
OnTerminate wird im Hauptthread ausgeführt, das synchronize solltest du dir an der Stelle sparen; oder du lässt onTerminate leer und rufst ThreadCopyCallback(cRuFileCopyReady); direkt am Ende von Execute auf.
Vielen Dank für den - aus meiner Sicht leider einzigen - konstruktiven Hinweis.
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: CopyFile lässt die Anwendung hängen, wie umgehen?

  Alt 5. Jun 2015, 09:17
Wenn ich der Meinung bin, dass dem User eine Meldung angezeigt werden muss, dann zeige ich sie ihm. Wenn ich für den Fall, dass der Kopiervorgang ohne Usermeldung ablaufen soll, dem User etwas zeigen will oder muss, dann ist es eine "echte" Exception, z.B. "deine Platte ist voll".
Kann ich gut nachvollziehen, wobei es drei Arten von Ausnahmen/Fehlern gibt, die an die man vorher denkt und die man im Vorfeld vermeiden kann, die um die sich der Benutzer kümmern muß, und die an die man nicht gedacht hat.(und dafür sind exceptions wirklich was feines)


Zitat von Dejan Vu:
Stell Dir mal vor, dein Programm soll mal im Ausland laufen...
Muss ich mir das vorstellen, und ist diese Aufgabenstellung Bestandteil dieses Threads? Nein. Also wozu dieses "provokannte Argument". Ach ja, die Antwort gibst du ja selber: Es gibt Besserwisser....
Ich habe die Erfahrung gemacht, daß ein QuicknDirty Tool eine "internationale" Karriere gemacht hat. Darum Wirf den Einwand nicht zu weit weg. Zumindest rudimentär sollte man die Möglichkeit in Betracht ziehen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: CopyFile lässt die Anwendung hängen, wie umgehen?

  Alt 5. Jun 2015, 09:57
Zu Exceptions gibt es hier mehrere Themen und Beiträge und es wurde schon erschöpfend behandelt.

Und ich finde es wesentlich einfacher auf einen speziellen Exception-Typ zu reagieren, als einen String-Rückgabewert zu parsen um herauszufinden, was denn jetzt eigentlich los gewesen ist, und wie ich da am sinnvollsten reagieren könnte.

Und wenn dann noch unterschiedliche Sprachen mit ins Spiel kommen, dann brauche ich vor dem Parsen sogar noch G**gle-Translate ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

AW: CopyFile lässt die Anwendung hängen, wie umgehen?

  Alt 5. Jun 2015, 10:14
Zu Exceptions gibt es hier mehrere Themen und Beiträge und es wurde schon erschöpfend behandelt.

Und ich finde es wesentlich einfacher auf einen speziellen Exception-Typ zu reagieren, als einen String-Rückgabewert zu parsen um herauszufinden, was denn jetzt eigentlich los gewesen ist, und wie ich da am sinnvollsten reagieren könnte.

Und wenn dann noch unterschiedliche Sprachen mit ins Spiel kommen, dann brauche ich vor dem Parsen sogar noch G**gle-Translate ...
Sorry Sir Rufo, du hast es immer noch nicht verstanden. Ich parse keinen Rückgabe-String. Wenn ich - oder jemand anders - das für nötig empfinden würde, dann kann er das ja so machen wie er will. Ich würde dann einen ENUM nehmen. In diesem Fall geht es aber ausschließlich darum, den User bei Bedarf über einen Sachverhalt, z.B. "Datei ist neuer", zu informieren. Ob der User darauf reagieren will, und wie, das kann bzw. muss er dann schon selber entscheiden. Das Thema "Exceptionbehandlung" hat damit überhaupt nichts zu tun. Ich weiß, hart für dich als "Exception-Spezialisten", aber manchmal muss man(n) eben auch mal ganz einfach die Aufgabenstellung sehen.

[OT]
Ich habe die Erfahrung gemacht, daß ein QuicknDirty Tool eine "internationale" Karriere gemacht hat. Darum Wirf den Einwand nicht zu weit weg. Zumindest rudimentär sollte man die Möglichkeit in Betracht ziehen.

Gruß
K-H
"rudimentär" = Ja sicher. Wenn's denn mal wieder so sein sollte greife ich auf mein noch aus den 90-er Jahren stammendes Tool für die Internationalisierung zurück. Damals hatte ich eine KFZ-Software programmiert (die es übrigens immer noch gibt) mit welcher man zur Laufzeit auf Französisch, Englisch, Italienisch, Tschechisch und Polnisch umschalten konnte.
[/OT]
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz