| |
|
|
Michael Dell | Hallo,
folgender Code erzeugt im ersten Schritt eine 100Mb große Datei (erster Fortschrittsbalken), danach wird die Datei mittels einer kleinen DLL (auf zlib Basis) gezippt (zweiter Fortschrittsbalken).
Über eine CallBack- Funktion wird der zweite Fortschrittsbalken angesteuert, es wird der in den Speicher eingelesene Wert an die CallBack- Funktion übergeben (Endwert entspricht der Originalgröße der Datei).
In Profan läuft das sehr gut, doch über Profan2Cpp (v1.49d) verschwindet zweite Fortschrittsbalken um kurz darauf wieder am Anfang zu erscheinen, je größer die Datei desto häufiger wiederholt sich das. KompilierenMarkierenSeparierenDef PackRes(3) External("UP.DLL","ComprFile",&(1),&(2),&(3))
Def UnPackRes(2) External("UP.DLL","DecomprFile",&(1),&(2))
Def GSC(1) !"KERNEL32.DLL","GetSysColor"
Declare DATA#,CSID_Progre&,CDRFID_Progre&,Kfs&,DatNam1$,DatNam2$,xc&,Wert&
Proc cDRFStat
Parameters Anz&
SendMessage(CDRFID_Progre&,$0402,Anz&,0)
EndProc
Proc PackStat
Parameters PS_Quelle&
SendMessage(CSID_Progre&,$0402,Int((PS_Quelle& * 100) / Kfs&),0)
Return 0
EndProc
Proc CreateStatusInfoDlg
WindowStyle 528
Window ((%MaxX - 200) / 2),((%MaxY - 114) / 2)-200,114
CDRFID_Progre& = Control("msctls_progress32","",$50000001,20,18,160,24,%HWnd,9000,%hinstance,$010000)
CSID_Progre& = Control("msctls_progress32","",$50000001,20,52,160,24,%HWnd,9001,%hinstance,$010000)
SendMessage(CDRFID_Progre&,$0402,0,0)
EndProc
Proc KillInfoDlg
SetWindowPos %HWnd = (%MaxX + 10),0-200,114;-1
EndProc
CreateStatusInfoDlg()
DatNam1$ = "TEST.UDR"
DatNam2$ = "TEST.ZDR"
Wert& = (1024000 * 100)
Dim DATA#,((Wert&/100)+1)
Clear DATA#
String DATA#,0 = MkStr$("Z",(Wert&/100))
Assign #99,DatNam1$
OpenRW #99
WhileLoop 1,100,1
BlockWrite #99,DATA#,0,(Wert&/100)
cDRFStat(&Loop)
EndWhile
CloseRW #99
Dispose DATA#
Kfs& = FileSize(DatNam1$)
PackRes(Addr(DatNam1$),Addr(DatNam2$),ProcAddr("PackStat", 1))
Sleep 2000
KillInfoDlg()
End
Hier gibst die benötigte DLL: [...]
Keine Ahnung was da abläuft, vielleicht is das auch nur bei mir so (128Mb RAM) |
|
|
| Salu Michael...
Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! | 29.08.2005 ▲ |
|
|
|
|
| Das riecht nach einem Überlauf - vielleicht hat Roland irgendwo was als unsigned deklariert wo Sebastian von signed ausgeht. Mal sehen was Sebastian dazu sagt... |
|
|
| |
|
|
|
Sebastian König | Hallo,
[quote:21a53668e4]Das riecht nach einem Überlauf - vielleicht hat Roland irgendwo was als unsigned deklariert wo Sebastian von signed ausgeht. Mal sehen was Sebastian dazu sagt...[/quote:21a53668e4] sowas in der Art vermute ich auch... allerdings ist sowohl mit XProfan, als auch mit Profan2Cpp alles signed. Es kann also nur sein, dass C++ den Ausdruck etwas anders auswertet als XProfan...
Ich kann aber einen einfachen Workaround anbieten Einfach zuerst durch Kfs& teilen und dann mal 100 nehmen:
Sendmessage(Csid_progre&,$0402,Int((Ps_quelle& / Kfs&) * 100),0)
Damit funktionierts bei mir auch mit Profan2Cpp korrekt.
MfG
Sebastian |
|
|
| |
|
|
|
Sebastian König | Noch was seltsames: Wenn man den Slash durch einen Backslash, also Integer-Division, ersetzt, funktioniert es auch mit XProfan nicht mehr korrekt (gleicher Fehler...). Wahrscheinlich ist es am sichersten, die API-Funktion MulDiv() zu verwenden:
[quote:63db746ded]The MulDiv function multiplies two 32-bit values and then divides the 64-bit result by a third 32-bit value. The return value is rounded up or down to the nearest integer.[/quote:63db746ded] |
|
|
| |
|
|
|
Michael Dell | Prima, so läufts! Danke!!! |
|
|
| Salu Michael...
Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! | 29.08.2005 ▲ |
|
|
|