Asynchron Dateien kopieren

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

judos

Betreff: Asynchron Dateien kopieren

BeitragSo, Nov 08, 2009 18:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

Ich habe mich gerade gefragt ob es irgendwie möglich ist mit Blitzbasic Dateien zu kopieren ohne, dass das ganze Programm davon aufgehalten wird.
Also gibt es vielleicht eine Möglichkeit über userlibs oder dll's eine Funktion in BB zu implementieren, die eine Datei nebenbei kopiert. Wäre natürlich noch schön wenn man den Status abrufen könnte, also wieviel % bereits kopiert sind oder so.
Aber zuerst nur mal die Existenzfrage, wäre sowas möglich?

Vielen Dank für die Antworten!
Grüsse,
judos

BladeRunner

Moderator

BeitragSo, Nov 08, 2009 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst dir das blitzintern über eine Funktion regeln die einen internen Counter erhält und sich selbst unterbricht. Diese Funktion rufst Du in deiner Main auf und überträgst so die Daten häppchenweise.
Ansonsten müsstest Du multithreading benutzen, da scheint ja grade was am Start zu sein, die Suche hilft.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

judos

BeitragSo, Nov 08, 2009 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
ok thx!

Mal schauen ob ich da was nützliches finde... Wink

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Nov 08, 2009 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn es nur ums kopieren geht, kann man CMD dafür anschmeissen. Diese sollte dann parallel zu BB laufen (habs nicht ausprobiert).

Wenn man selber Dateien schreiben will, dann kann man größere Datenmengen einer Bank mit einem Befehl in eine Datei schieben. Das sollte relativ schnell sein. Siehe dazu: WriteBytes

Ansonsten kann man das ganze auch aufteilen un häppchenweise erledigen. Dazu kommt einem SeekFile gelegen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

judos

BeitragSo, Nov 08, 2009 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm ok habs mal ausprobiert, das Ergebnis sieht so aus:

CopyFile: 30MB/s
Mein eigenes (kopiert x MB am Stück, wobei x eingestellt werden kann): 6MB/s

Zwar nicht schlecht, aber kann man das vielleicht noch optimieren?
Hier mal der Code:

BlitzBasic: [AUSKLAPPEN]
create() ;Erstellt 10MB grosse Datei
copy_test() ;Kopiert diese 50Mal mit CopyFile und mit CopyFile2
; CopyFile2 = eigenes Copy, das unterbrochen werden könnte


Function copy_test()
test_anz=50
m=MilliSecs()
For i=1 To test_anz
CopyFile "test1.dat", "test1-copy"+i+".dat"
Next
n=MilliSecs()
DebugLog "Average per copy: "+(Float(n-m)/test_anz)+" ms"

For i=1 To test_anz
DeleteFile "test1-copy"+i+".dat"
Next

m=MilliSecs()
For i=1 To test_anz
CopyFile2 "test1.dat", "test1-copy"+i+".dat"
Next
n=MilliSecs()
DebugLog "Average per copy with CopyFile2: "+(Float(n-m)/test_anz)+" ms"

For i=1 To test_anz
DeleteFile "test1-copy"+i+".dat"
Next
End Function



Function CopyFile2(x$,y$)
;DebugLog "start "+x$+","+y$
blocksize=5 ;MB

file=ReadFile(x$)
;DebugLog "file1:"+file
If file=0 Then Return 0
file2=WriteFile(y$)
bank=CreateBank(blocksize*1024*1024)

copied=0
total=FileSize(x$)
Repeat
;DebugLog "offset: "+offset
amount=ReadBytes(bank,file,0,blocksize*1024*1024)
WriteBytes bank,file2,0,amount
copied=copiedset+amount
If amount=0 Then Exit
Forever

CloseFile file
CloseFile file2
FreeBank bank
End Function


Function create(size=1024*1024*10)
file=WriteFile("test1.dat")
SeekFile file,size-1
WriteByte file,0
CloseFile file
End Function


Wäre euch sehr Verbunden für weitere Anregungen...

Grüsse,
judos

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Nov 08, 2009 23:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Und warum hast du nun mein Vorschlag mit CMD nicht ausprobiert? Habs jetzt selbst ausprobiert und eine über 200MB -Datei von D:\ nach E:\ kopiert, und das Blitzprogramm lies sich nicht eine Millisekunde davon aufhalten. Denn CMD läuft dann als eigenständiger Prozess, und das mit ganz altmodischen Methoden parallel zu Blitz3D.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

judos

BeitragSo, Nov 08, 2009 23:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm sorry, wollte nur mein bisherigen Stand mitteilen Wink
Klar ich probiers auch noch aus.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Nov 08, 2009 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, will ja nicht so sein: Wink

Code: [AUSKLAPPEN]
Graphics 400,300,0,2
SetBuffer BackBuffer()
Local XP,Q,Timer=CreateTimer(60)
AppTitle "Drücke Space"


While Not KeyHit(1)
   
   If KeyHit(57) Then CopyFile3("d:\t.t","e:\t.t")
   
   XP=(XP+1) Mod 20
   For Q=0 To 400 Step 20
      Rect Q+XP,0,1,300,1
   Next
   
   WaitTimer Timer
   Flip 0
   Cls
Wend


Function CopyFile3(x$,y$)
   ExecFile "cmd.exe /c copy "+Chr(34)+x$+Chr(34)+" "+Chr(34)+y$+Chr(34)
End Function


Leider erscheint ein zweites Fenster und der Fokus geht erstmal flöten, so lange der Kopiervorgang andauert. Diesen könnte man eventuell durch ein eigenes Zusatzprogramm mit verstekten Rahmen unterbinden. Aber die einfachste Lösung ist erstmal mit CMD. Danach kann man ja weiter sehen, ob es für eigene Zwecke ausreicht.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

judos

BeitragSo, Nov 08, 2009 23:31
Antworten mit Zitat
Benutzer-Profile anzeigen
ok thx! ^^

Mit meinem TestProgramm läuft dies etwa gleich schnell. Da aber der Fokus verlohren geht, bzw. ein neues Fenster aufgetan wird, das genau nichts anzeigt (oder wenigstens nicht sinnvolles) finde ich das auch nicht wirklich besser.
Mal schauen ob man das irgendwie silent machen könnte. Also so dass kein Fenster aufgetan wird. Dann wäre dies eine gute Lösung. Smile

grüsse,
judos

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Nov 09, 2009 9:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Komisch, CopyFile2 hat mein Rechner für etwa eine Minute K.O. gestellt. Also Sanduhr und nichts weiter. War ne >200MB Datei.

Das mit dem Fokusverlust beim CopyFile3 ist ärgerlich. Allerdings, wenn dein Programm im Vollbild läuft ja kein Problem.

Wenn du lediglich eine Information im CMD-Fenster ausgeben willst, dann geht das mit echo. Außerdem kann man auch das echo variabel halten, indem man Parameter übergibt. Diese werden dann mit %1 ... %2 ... empfangen. Dafür müsste aber das ganze dann über eine Batchdatei geregelt werden.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group