| |
|
|
DeHarrow | Hallo an Alle! Zu meinem Problem: Habe unterschiedliche File, die ich mit Blockread/write kopieren möchte - doch nicht mit: @BlockRead(File$, Ber#, 0, FileSize(File$)), sondern meinetwegen mit 1024 Byte(weise).
Sinn soll sein: Habe eine Progressbar, die den Status des Kopierens Mostra soll. Wäre blöd, wenn dann Ruckzuck 100% angezeigt werden anstatt meinetwegen 10%, 15% kopiert etc.
Wenn ich die Filegröße durch 1024 teile, dann bekomme ich Nachkommastellen, die nicht beachtet werden - die File wird unvollständig kopiert. Aufrunden auf ganze Zahl ohne Kommastelle brachte auch nichts.
Weiß jemand wie ich es am besten anstellen/umrechnen potuto. Bei kleinen File klappt es ja mit dem Wert 1024, aber bei grande File ab MB eben nicht. Hoffe ihr wißt was ich meine.
Saluto Jürgen |
|
|
| Angefangen hat alles mit Profan 5.0 ...noch auf Diskette | 02.09.2009 ▲ |
|
|
|
|
| Hai, zunächst potuto BlockWrite so viele Byte schreiben, wie die Funktion BlockRead als gelesene Bytes zurückliefert. Die Puffergrösse hängt vom Zielmedium ab von/auf dem die File geladen/geschrieben wird - 1024Byte erscheint mir bei normalen Festplatten und heutigen OSsses als deutlich zu gering. Ich würde vlt. mit einer Puffergrösse von 256KB herantesten - macht ja keinen Sinn die CPU mehr zu quälen als notwendig weil Platte+Cache+OS das "eh" nochmals managen. |
|
|
| |
|
|
|
DeHarrow | Hallo IF - Danke erstmal per deine Antwort. Das Problem: ich muß einen Wert ohne Komma rausbekommen.
Habe z.B. eine File von 1079214 Bytes oder 1.02 MB. Wenn ich diesen Wert komplett in den Speicher lese und schreibe, dann ist der Fortschrittsbalken eben gleich bei 100%. Ok Statusbalken anpassen wäre kein Thema oder so... ...möchte halt nur kleinere Schritte im Statusbalken Mostra lassen (meinetwegen 10%, 20%, 30% kopiert etc.) Dividiere ich dann durch etwas z.B. FileSize(File$) / 1024 (oder eben größer) um eine andere Bytezahl zu bekommen, dann habe ich Nachkommastellen und es klappt dann eben nicht mit Blockwrite.
Ich müßte sozusagen per unterschiedliche Dateigrößen im Bereich Bytes, KB, MB etc. einen verlässlichen Wert haben.
Saluto Jürgen |
|
|
| Angefangen hat alles mit Profan 5.0 ...noch auf Diskette | 02.09.2009 ▲ |
|
|
|
|
Nico Madysa | Nehmen wir mal an, du habest eine File von 2049 Kilobytes, nur als Beispiel. Du könntest doch ganzzahlig durch 1024 teilen und dies kopieren. Die Prozentanzeige bekommst du dann nach 100 * GeleseneBytes% / FileSize(datei$). Nach der Schleife, die das macht, ermittelst du mit Modulo einfach die verbleibenden Bytes und kopierst diese auch. Die Prozente müssen danach nicht mehr ausgerechnet werden, es ergeben sich ja 100%. KompilierenMarkierenSeparieren |
|
|
| |
|
|
|
| Vlt. meint er sowas: [...]
(noch mal korrigiert) KompilierenMarkierenSeparierenCLS
MYFCOPY("csa.debug","map33.bmp")
WAITINPUT
proc MYFCOPY
PARAMETERS _FROM$,_TO$
IFNOT FILEEXISTS(_FROM$)
RETURN 0
ENDIF
IF FILEEXISTS(_TO$)
ERASE _TO$
IF FILEEXISTS(_TO$)
RETURN 0
ENDIF
ENDIF
var SZ!=FILESIZE(_FROM$)
IF SZ!<20
COPY _FROM$,_TO$
RETURN 1
ENDIF
var FHFROM%=ASSIGN(_FROM$)
var FHTO%=ASSIGN(_TO$)
IFNOT FHFROM% AND FHTO%
case FHFROM% : ASSIGN FHFROM%,""
case FHTO% : ASSIGN FHTO%,""
RETURN 0
ENDIF
OPENRW FHFROM%
OPENRW FHTO%
var LSZ&=INT(RANGE(SZ!*0.05,20,2048))
var RD&=0
var ACC&=0
DECLARE MYBUFF#
DIM MYBUFF#,LSZ&
WHILENOT EOF(FHFROM%)
RD&=BLOCKREAD(FHFROM%,MYBUFF#,0,LSZ&)
IFNOT RD&
BREAK
ENDIF
INC ACC&,RD&
BLOCKWRITE FHTO%,MYBUFF#,0,RD&
RECTANGLE 0,0 - (ACC&/SZ!*100),10
ENDWHILE
DISPOSE MYBUFF#
ASSIGN FHFROM%,""
ASSIGN FHTO%,""
RETURN FILEEXISTS(_TO$)
ss=s4 href='./../../funktionsreferenzen/xprofan/endproc/'>endproc
(achtung code nur hingeschmiert, unbedingt auf fehler checken) |
|
|
| |
|
|
|
DeHarrow | Hallo!
Danke per die Antworten! Sieht auf den ersten Blick spitze aus - werde es mal ausprobieren - besten Dank!
Saluto Jürgen |
|
|
| Angefangen hat alles mit Profan 5.0 ...noch auf Diskette | 02.09.2009 ▲ |
|
|
|
|
| |
|
| |
|
|
|
Andreas Miethe
| Zu dem Thema gehört vielleicht auch der System-Dialog, der einen Fortschritt beim Kopieren oder irgendwelchen Berechnungen anzeigt. Hierbei wird ein Fortschrittsbalken und eine Restdauer( die Windwos automatisch berechnet) angezeigt. KompilierenMarkierenSeparieren $H Windows.ph
Var ole& = ImportDll("ole32.dll","")
Var oleaut& = ImportDll("oleaut32.dll","")
Declare bString1$
Proc Ansi2Uni
Parameters s$
Var Unicode$ = Space$((Len(S$)*2)+1)
~MultiByteToWideChar(0,0,Addr(S$),-1,Addr(Unicode$),Len(Unicode$))
SysFreeString(bString1$)
SysFreeString(bString1$)
bString1$ = SysAllocString(addr(Unicode$))
Return bString1$
EndProc
DEF &CLSCTX_INPROC_SERVER 1
DEF &PROGDLG_NORMAL 0
DEF &PROGDLG_AUTOTIME 2
DEF &PROGDLG_MODAL 1
DEF &PDTIMER_RESET 1
DEF &IDA_COPY_ANIMATION 160
Interface IProgressDialog
DEF &QueryInterface 0
DEF &AddRef 4
DEF &Release 8
DEF &StartProgressDialog 12
DEF &StopProgressDialog 16
DEF &SetTitle 20
DEF &SetAnimation 24
DEF &HasUserCancelled 28
DEF &SetProgress 32
DEF &SetProgress64 36
DEF &SetLine 40
DEF &SetCancelMsg 44
DEF &Timer 48
Var ProgressLimit& = 5000
Declare CLSID_ProgressDialog#,IID_IProgressDialog#
Dim CLSID_ProgressDialog#,16
Dim IID_IProgressDialog#,16
LONG CLSID_ProgressDialog#,0 = $f8383852
WORD CLSID_ProgressDialog#,4 = $fcd3, $11d1
BYTE CLSID_ProgressDialog#,8 = $a6, $b9, 0, $60, $97, $df, $5b, $d4
LONG IID_IProgressDialog#,0 = $ebbc7c04
WORD IID_IProgressDialog#,4 = $315e, $11d2
BYTE IID_IProgressDialog#,8 = $b6, $2f, 0, $60, $97, $df, $5b, $d4
Var X& = 0
Var dwCompleted& = 0
Var ppv& = 0
cls
CoInitialize(0)
Var hr& = CoCreateInstance(CLSID_ProgressDialog#, 0, &CLSCTX_INPROC_SERVER, IID_IProgressDialog#,Addr(ppv&))
If hr& = ~S_OK
Var Command& = LONG(ppv&,0)
Call(Long(Command&,&SetTitle),ppv&,Ansi2Uni("System Fotschritt-Dialogbox"))
Var hShell& = UseDll("shell32.dll")
If hShell&
Call(Long(Command&,&SetAnimation),ppv&,hShell&,&IDA_COPY_ANIMATION)
EndIf
Call(Long(Command&,&Timer),ppv&,&PDTIMER_RESET,0)
Call(Long(Command&,&SetCancelMsg),ppv&,Ansi2Uni("Cancel"), 0)
Call(Long(Command&,&SetLine),ppv&,1, Ansi2Uni("System Fortschritt-Dialog Test mit XProfan"), 1,0)
Call(Long(Command&,&StartProgressDialog),ppv&,%hwnd, 0, &PROGDLG_NORMAL | &PROGDLG_AUTOTIME | &PROGDLG_MODAL, 0)
Repeat
If Call(Long(Command&,&HasUserCancelled),ppv&)
Call(Long(Command&,&StopProgressDialog),ppv&)
MessageBox("Fortschritt abgebrochen","Meldung",0)
Break
Else
Call(Long(Command&,&SetProgress),ppv&, dwCompleted&, ProgressLimit&)
If dwCompleted& >= ProgressLimit&
Call(Long(Command&,&StopProgressDialog),ppv&)
MessageBox("Fortschritt komplett","Meldung",0)
Break
Else
Call(Long(Command&,&SetLine),ppv&,2, Ansi2Uni("Wir sind jetzt hier : "+Str$(dwCompleted&)+" von "+str$(ProgressLimit&)), 1, 0)
an dieser Stelle könnte man eine Kopierfunktion
oder irgenwelche Berechnungen einbauen, statt nur einen Zähler laufen zu lassen.
Inc dwCompleted&
EndIf
EndIf
Sleep 10 je kleiner die Pause, umso schneller der Fortschritt
Until X& =1
Call(Long(Command&,&Release),ppv&)
Dispose CLSID_ProgressDialog#,IID_IProgressDialog#
SysFreeString(bString1$)
EndIf
CoUninitialize()
FreeDll Ole&
Freedll oleaut&
waitinput
end
|
|
|
| Gruss Andreas ________ ________ ________ ________ _ Profan 3.3 - XProfanX2 Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher Homepage : [...] | 05.09.2009 ▲ |
|
|
|
|
| |
|
| |
|
|