Seite 2 von 3

Verfasst: 19.08.2005 12:09
von Kiffi
> Es wäre cool, wenn es einen Thread gebe, der schnellere Procedures
> vergleicht.....Denn Speed ist doch heutzutage wichtig ... --- .. Oder?

http://forums.purebasic.com/german/view ... 0324#50324

;-)

Grüße ... Kiffi

Verfasst: 19.08.2005 12:09
von bobobo
Falls die Applikation nur unter Windoof laufen soll geht auch folgendes.
Stell doch ne Kopierliste zusammen (Prüfroutinen hast du ja) und behandel die mit XCOPY statt mit copyfile(). Das sollte die DateiDatümmer in Ruhe lassen bzw. mitkopieren.

(Xcopy ist allerdings auf den unterschiedlichen WinVersionen auch immer etwas unterschiedlich)

Ich benutz xcopy auch für meine abendlichen Sicherungsjobs und hab damit noch nie Probs gehabt, die ich nicht selber verursacht habe ( :!: auch BatchJobs müssen ordentlich programiert werden.)

Ob das die schnellste aller Möglichkeiten ist weiß ich nicht und wage es auch zu bezweifeln. Aber im Zweifelsfall geht immer noch Sicherheit und geringe Kosten gegen Speed (ist doch letztlich vollkommen Piepegal ob so ein Kopierjob ne Minute oder etwas länge braucht) Mein abendliche SicherungjobRoutine z.B. (umfasst xcopy's diverstester Verzeichnisse auf Spiegelpartitionen und USB-Platte, dts-jobs in Datenbanken, Zip-routinen) dauert ca 2 Minuten. Dabei werden Daten im Umfang von schätzungweise 700MB zumidest angepackt und davon ca 100MB kopiert.

Verfasst: 19.08.2005 12:57
von Agent
Next Step:

Ich habe meine Copy-Routine so umgebaut, das nach erfolgreichem kopieren das Datum der Org.Datei gesetzt wird. Und? Was ratet ihr? Same shit.

Tja...was soll ich sagen. Ob das irgendwie mit der URURURalten HDD hier in der Firma zusammenhängt? C: und D: sind die gleiche Platte (hardware). Wenn beide auf C: liegen gehts. liegt das ziel auf D: - gehts nicht. 1-2 Sekunden versatz. TROTZ angeglichenem Datum!

Ich werd den kram jetzt compilieren und dann hier in der Firma auf verschiedenen Systemen testen. Heute abend dann zu Hause. Wenns überall funzt, schieb ichs auf die Hardware (die sowieso extrem alt ist).

Übrigens wäre es mir neu, wenn CopyFile() irgendwas an der Datei fummelt (wär ja auch sinnlos).

Verfasst: 19.08.2005 13:58
von PureLust
Hi Agent, ...

probier doch mal aus, was mit dem Datum passiert, wenn Du von D: nach C: kopierst.

Gruß, PL.

Verfasst: 19.08.2005 14:50
von Agent
Hi PL!

Wäre mal den Versuch wert. Habs auf anderen PCs probiert: läuft problemlos.

Kann mir einer erklären, warum der Fensteraufbau in PB immer so lahm ist??? Habs schon mit Callback probiert usw.
Jedesmal wenn ich ein Fenster mit ein paar Gadgets mache, es starte und dann ein anderes Fenster mein Programm überlagert und ich dann das überlagernde Fenster wieder wegziehe, wird mein Programmfenster relativ langsam aufgebaut (aufbau noch erkennbar - von oben nach unten)...

Hier mal ein Bsp:

Code: Alles auswählen


Enumeration ; Fenster
  #win_main
  #main_statusbar
EndEnumeration

Enumeration ; gadgets
  #main_image_icon
  
  #main_button_source
  #main_text_source
  #main_button_target
  #main_text_target
  
  #main_frame_options
  #main_checkbox_logging
  #main_checkbox_md5
  #main_checkbox_delete
  
  #main_text_sourcefiles
  #main_string_sourcefiles
  #main_text_targetfiles
  #main_string_targetfiles
  #main_text_differentfiles
  #main_string_differentfiles
  #main_text_neueordner
  #main_string_neueordner
  #main_text_deletedfiles
  #main_string_deletedfiles
  #main_text_bytes
  #main_string_bytes
  #main_listview
  
  #main_frame_statistic
  #main_progressbar
  #main_text_progress
  
  #main_button_about 
  #main_button_start
EndEnumeration

Procedure wait4win()
  Repeat
    Delay(1)
  Until WindowEvent()=0
EndProcedure
Procedure WindowCallback(hwnd, Message, wParam, lParam) 
  result = #PB_ProcessPureBasicEvents 
  Select Message  
    Case #WM_SIZE ; Größe ändern
      Debug "Size changed:"
      Select wParam 
        Case #SIZE_MINIMIZED
          Debug "MINIMIZED"
        Case #SIZE_RESTORED 
          Debug "RESTORED"
        Case #SIZE_MAXIMIZED
          Debug "MAXIMIZED"
      EndSelect  
      
    Case #WM_RButtonDown ; Rechte Maus
      Debug "Right Mousebutton"
      
    Case #WM_LButtonDown ; LInks Maus
      Debug "Left Mousebutton" 
      
    Case #WM_MButtonDown ; Mittlere Maus
      Debug "Middle Mousebutton"
      
    Case #WM_MOVE 
      Debug "Window moved"
  EndSelect 
  ProcedureReturn result 
EndProcedure 

win_main=OpenWindow(#win_main,0,0,400,475,#PB_Window_ScreenCentered | #PB_Window_SystemMenu,"TEST")
If win_main And CreateGadgetList(win_main) And CreateStatusBar(#main_statusbar,win_main)
  main_w=WindowWidth(): main_h=WindowHeight()
  oben=10 : links=20 : buttonbreite=100 : hoehe=20 : abstand=10 : abstand_klein=5: textbreite=100 : stringbreite=100

  TextGadget(#main_text_source, links, oben+5, main_w-links-buttonbreite-abstand*3, hoehe, "(Bitte Quell-Verzeichnis auswählen)", #PB_Text_Right)
  ButtonGadget(#main_button_source, main_w-buttonbreite-abstand*2, oben, buttonbreite, hoehe, "Quelle", $8000)
  
  oben+hoehe+abstand
  TextGadget(#main_text_target, links, oben+5, main_w-links-buttonbreite-abstand*3, hoehe, "(Bitte Ziel-Verzeichnis auswählen)", #PB_Text_Right)
  ButtonGadget(#main_button_target, main_w-buttonbreite-abstand*2, oben, buttonbreite, hoehe, "Ziel", $8000)
  
  oben+hoehe+abstand*2
  Frame3DGadget(#main_frame_options, links-10, oben, main_w-links, hoehe*4+abstand*3, "Optionen")
  oben+abstand*2
  CheckBoxGadget(#main_checkbox_logging, links, oben, main_w-links*2, hoehe, "Logging aktivieren (Datei: "+logfile$+")")
  oben+hoehe+abstand
  CheckBoxGadget(#main_checkbox_md5, links, oben, main_w-links*2, hoehe, "zusätzlich MD5-Fingerprint prüfen (hoher Zeitaufwand)")
  oben+hoehe+abstand
  CheckBoxGadget(#main_checkbox_delete, links, oben, main_w-links*2, hoehe, "Überflüssige Dateien auf Ziel löschen")
  
  oben+hoehe+abstand*2
  Frame3DGadget(#main_frame_statistic, links-10, oben, main_w-links, hoehe*6+abstand*6, "Statistik") 
  oben+abstand*2
  TextGadget(#main_text_sourcefiles, links, oben, textbreite*2, hoehe, "Quell-Dateien")
  StringGadget(#main_string_sourcefiles, main_w-textbreite-abstand*2, oben, stringbreite, hoehe, "0", #PB_String_ReadOnly | #PB_Text_Right)
  oben+hoehe+abstand_klein
  TextGadget(#main_text_targetfiles, links, oben, textbreite*2, hoehe, "Ziel-Dateien")
  StringGadget(#main_string_targetfiles, main_w-textbreite-abstand*2, oben, stringbreite, hoehe, "0", #PB_String_ReadOnly | #PB_Text_Right)
  oben+hoehe+abstand_klein
  TextGadget(#main_text_differentfiles, links, oben, textbreite*2, hoehe, "Datei-Differenzen")
  StringGadget(#main_string_differentfiles, main_w-textbreite-abstand*2, oben, stringbreite, hoehe, "0", #PB_String_ReadOnly | #PB_Text_Right)
  oben+hoehe+abstand_klein
  TextGadget(#main_text_neueordner, links, oben, textbreite*2, hoehe, "Neue Ordner angelegt")
  StringGadget(#main_string_neueordner, main_w-textbreite-abstand*2, oben, stringbreite, hoehe, "0", #PB_String_ReadOnly | #PB_Text_Right)
  oben+hoehe+abstand_klein
  TextGadget(#main_text_deletedfiles, links, oben, textbreite*2, hoehe, "Gelöschte Dateien")
  StringGadget(#main_string_deletedfiles, main_w-textbreite-abstand*2, oben, stringbreite, hoehe, "0", #PB_String_ReadOnly | #PB_Text_Right)
  oben+hoehe+abstand_klein
  TextGadget(#main_text_bytes, links, oben, textbreite*2, hoehe, "Bytes kopiert")
  StringGadget(#main_string_bytes, main_w-textbreite-abstand*2, oben, stringbreite, hoehe, "0", #PB_String_ReadOnly | #PB_Text_Right)
  
  oben+hoehe*2+abstand
  ProgressBarGadget(#main_progressbar, links-10, oben, main_w-links-(textbreite/2)-abstand, hoehe, 1, 100, #PB_ProgressBar_Smooth)
  TextGadget(#main_text_progress, main_w-(textbreite/2)-abstand*2, oben+5, textbreite/2, hoehe, "0%", #PB_Text_Right)
  
  ButtonGadget(#main_button_start, links-10, main_h-50, buttonbreite*2, hoehe, "Starte Synchronisation",$8000)
  ButtonGadget(#main_button_about, main_w-abstand-buttonbreite, main_h-50, buttonbreite, hoehe, "About", $8000)
  
  AddStatusBarField(250)
  StatusBarText(#main_statusbar,0,"Bitte Quell- und Zielverzeichnis wählen...")
  AddStatusBarField(150)
  StatusBarText(#main_statusbar,1,"(c) "+FormatDate(" %yyyy",Date()))
  wait4win()
Else
  MessageRequester(""+" FEHLER","Konnte Fenster nicht aufbauen!",#mb_iconerror)
  End
EndIf

SetWindowCallback(@WindowCallback()) 


Repeat
  Delay(1)
  winevent=WindowEvent()
  
Until winevent=#PB_Event_CloseWindow Or main_exit=#True Or nowin=#True

Verfasst: 19.08.2005 15:48
von Agent
Mir ist der Unterschied nicht klar, aber es gibt ihn....

Code: Alles auswählen

Repeat : Until WindowEvent()=0
ist NICHT gleich

Code: Alles auswählen

While WindowEvent() : Wend
:/

Any Ideas?
Wie ich drauf komme? Ganz einfach:
Ich hab folgende Procedure, die ich in alle Progs verwende, sobald was am Fenster passiert (grob gesagt):

Code: Alles auswählen

Procedure wait4win()
  Repeat : Delay(1) : Until WindowEvent()=0
EndProcedure
wenn ich in meiner Repeat Schleife ein wait4win() reinmache, passiet oben beschriebenes (langsamer Aufbau)....nehm ich aber diese Proc:

Code: Alles auswählen

Procedure wait4win()
  While WindowEvent() : Wend
EndProcedure
Geht das einwandfrei. Sobald man das überlappende Fenster wieder wegzieht ist mein Programmfenster komplett da. Null Aufbauzeit.

Man lernt noch dazu....

Das wait4win() steht bei mir in der Warteschleife des Programms, zb.

Code: Alles auswählen

Repeat
  Delay(1)
  wait4win()
  winevent=WindowEvent()
  
  ;....gadgets abfragen...
Until winevent=#PB_Event_CloseWindow
Alternativ im WindowCallBack ist das übrigens event 312....darunter sollte dann ein wait4win() stehen ;)

zb.
Procedure WindowCallBack(....)
select msg
case 312
wait4win()
endselect
endprocedure

Verfasst: 19.08.2005 16:37
von ts-soft
>> Mir ist der Unterschied nicht klar, aber es gibt ihn....
While ist eine Kopfgesteuerte Schleife, nur wenn die Bedingung zutrifft wird diese Schleife überhaupt jemals ausgeführt, im Gegensatz zur Repead-Schleife, diese ist Fußgesteuert, wird als in jedemfall einmal durchlaufen, da die Bedingung erst am Schluß geprüft wird

Verfasst: 19.08.2005 16:51
von Agent
Dieser Unterschied ist klar.
Warum sich das genau SO auf das Fenster auswirkt ist mir allerdings nicht klar...

Probleme mit GetFileDate() - FAT, NTFS

Verfasst: 03.08.2006 16:48
von AndyMars
Ist zwar schon 'ne Weile her - aber der Vollständigkeit halber schreib ich's trotzdem noch hin:

Das Phänomen, das hier beschrieben wird, kann auftreten bei Synchronisationen zwischen unterschiedlichen Dateisystemen, welche das Datum mit unterschiedlicher Präzision speichern. Dies ist nämlich genau bei FAT und NTFS der Fall - ich vermute jetzt einfach mal, dass die Festplatte mit NTFS und der USB-Stick mit FAT fomatiert war (ist zumindest so üblich).

Es gibt im Übrigen noch mehr Probleme zwischen diesen Dateisystemen - die Sommerzeitabweichung wird ebenfalls unterschiedlich gespeichert :twisted: - ganz gemein, denn man stellt dies in der Regel erst ca. 1/2 Jahr nach der Programmierung fest...

Die 1. Lösung wurde schon festgestellt - <=2 Sekunden Abweichung sind zu ignorieren...

Die Sommerzeitabweichung erfordert ein Ignorieren von Abweichungen von genau 1 und/oder 2 Stunden (+/- 2 Sekunden).

Wer das jetzt noch ganz raffiniert machen will, stellt vor irgendwelchen Abgleich-Prozessen das jeweilige Dateisystem fest...

Verfasst: 04.08.2006 10:41
von Agent
Hallo Andy.

Danke für den Hinweis. Das wusste ich nicht mit FAT und NTFS. Aber wie Du schon richtig vermutet hast, Platte NTFS und Stick FAT32.