AddGadgetItem(1,-1,ReadString(0),0,0) voll langsam

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Auszug aus http://www.purebasic.fr/german/viewtopi ... highlight=

Code: Alles auswählen

Procedure Datei_Oeffnen()

;{ Procedure für Datei öffnen
;
;}

  Protected temp.s
  ; Bei änderung Speichern aufrufen
  If Speichern
    r1 = MessageRequester("Frage", "Änderung speichern?", #PB_MessageRequester_YesNoCancel | #MB_ICONQUESTION)
    If r1 = #PB_MessageRequester_Yes
      Datei_Speichern()
    EndIf
  EndIf
  If r1 = #PB_MessageRequester_Cancel
    ProcedureReturn 0
  EndIf
  ; Dateiname erfragen
  temp = OpenFileRequester("Datei öffnen", "", "Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*", 0)
  If temp = ""
    ProcedureReturn 0
  EndIf
  ; Datei öffnen
  Datei = temp
  If OpenFile(0, Datei)
    temp = ""
    ; Datei lesen bis zum ende
    While Eof(0) = 0
      temp + ReadString(0) + #CRLF$
    Wend
    ; Datei schliessen
    CloseFile(0)
    ; Text in Editorfeld eintragen
    SetGadgetText(#Edit, temp)
    temp = ""
    ; Variablen aktuallisieren
    Speichern = 0
    Neu = 0
    ; Titel und Status aktuallisieren
    Titel = "PB Editor - " + Datei
    SetWindowTitle(#Window, Titel)
    StatusBarText(#StatusBar, 0, "Geöffnet")
  Else
    MessageRequester("Fehler", "Datei konnte nicht geöffnet werden", #MB_ICONSTOP)
  EndIf
 
EndProcedure
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag von tobe »

@edel
stimmt, hat auf den ersten blick so ausgekuckt ;)

hab damit mal ein 1,5mb file geladen (140ms)
is echt ein feiner code ! :)

zum vergleich hab ich noch den code von mk-soft getestet aber die geschwindigkeitsunterschiede sind gigantisch

C:\Windows\setuplog.txt
813041 byte
stream: 47 ms
read: 29656 ms

hier noch mein test code:

Code: Alles auswählen

Procedure _StreamFileIn_Callback(hFile, pbBuff, cb, pcb)
  ProcedureReturn ReadFile_(hFile, pbBuff, cb, pcb, 0)!1
EndProcedure

Procedure Editor_Load(Gadget, File.s)
  Protected StreamData.EDITSTREAM
  Protected FileID.l
  FileID = ReadFile(#PB_Any, File)
  If FileID
    StreamData\dwCookie = FileID(FileID)
    StreamData\dwError = #Null
    StreamData\pfnCallback = @_StreamFileIn_Callback()
    If UCase(GetExtensionPart(File)) = "RTF"
      SendMessage_(GadgetID(Gadget), #EM_STREAMIN, #SF_RTF, @StreamData)
    Else
      SendMessage_(GadgetID(Gadget), #EM_STREAMIN, #SF_TEXT, @StreamData)
    EndIf
    CloseFile(FileID)
  EndIf
EndProcedure

Procedure Datei_Oeffnen(Gadget, Datei.s)
  Protected temp.s
  If OpenFile(0, Datei)
    ; Datei lesen bis zum ende
    While Eof(0) = 0
      temp + ReadString(0) + #CRLF$
    Wend
    ; Datei schliessen
    CloseFile(0)
    ; Text in Editorfeld eintragen
    SetGadgetText(Gadget, temp)
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  EditorGadget(0, 8, 8, 306, 133)
  Datei$ = OpenFileRequester("Datei öffnen", "", "Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*", 0)
  If Datei$
    Debug Datei$
    Debug Str(FileSize(Datei$)) + " byte"
    time = ElapsedMilliseconds()
    Editor_Load(0, Datei$)
    Debug "stream: " + Str(ElapsedMilliseconds() - time) + " ms"
    ClearGadgetItemList(0)
    time = ElapsedMilliseconds()
    Datei_Oeffnen(0, Datei$)
    Debug "read: " + Str(ElapsedMilliseconds() - time) + " ms"
    Debug "-----"
  EndIf
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
EndIf
PureBasic 4.40 (Windows - x86)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Wenn schon ohne Api dann besser so:

Code: Alles auswählen

Procedure Datei_Oeffnen(Gadget, Datei.s)
  Protected temp.s , Size.l , hFile.l
  hFile = ReadFile(#PB_Any, Datei)
  If hFile
    ; Datei lesen bis zum ende
    Size = Lof(hFile)
    temp = Space(Size)
    ReadData(hFile,@temp,Size)
    ; Datei schliessen
    CloseFile(hFile)
    ; Text in Editorfeld eintragen
    SetGadgetText(Gadget, temp)
  EndIf
EndProcedure
Geschwindigkeitstests nicht im Debug-Modus ausfuehren.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Stream ist schneller :allright:

Nicht vergessen

Code: Alles auswählen

SendMessage_(GadgetID(0), #EM_SETLIMITTEXT, 0, 0)
Sonst können nur 32kb bearbeitet werden

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Stimmt , damit werden dann ganze 64k angezeigt :lol:

'Etwas' groesser wird es mit :

Code: Alles auswählen

SendMessage_(GadgetId(Gadget),#EM_EXLIMITTEXT, 0,$7fffffff)
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

@edel
danke, werde den PB_Editor auf ReadData überarbeiten.

Mit "SendMessage_(GadgetID(#Edit), #EM_SETLIMITTEXT, 0, 0)" habe ich auch keine begrenzung mehr bei StringGadget. Mit EditorGadget nicht getestet :allright:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Da braucht man nicht testen :
lResult = SendMessage( // returns LRESULT in lResult
(HWND) hWndControl, // handle to destination control
(UINT) EM_SETLIMITTEXT, // message ID
(WPARAM) wParam, // = (WPARAM) () wParam;
(LPARAM) lParam // = 0; not used, must be zero );
Parameters

wParam
Specifies the maximum number of TCHARs the user can enter. For ANSI text, this is the number of bytes; for Unicode text, this is the number of characters. This number does not include the terminating null character.


Rich edit controls: If this parameter is zero, the text length is set to 64,000 characters.


Edit controls on Windows NT/2000/XP: If this parameter is zero, the text length is set to 0x7FFFFFFE characters for single-line edit controls or –1 for multiline edit controls.

Edit controls on Windows 95/98/Me: If this parameter is zero, the text length is set to 0x7FFE characters for single-line edit controls or 0xFFFF for multiline edit controls.

lParam
This parameter is not used.
Return Value

This message does not return a value.
[...]

Rich Edit: Supported in Rich Edit 1.0 and later. Use the message EM_EXLIMITTEXT for text length values greater than 64,000. For information about the compatibility of rich edit versions with the various system versions, see About Rich Edit Controls.

Muesste dann bei dir auch -1 sein.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

@edel

habe jetzt auf -1 gesetzt wegen kompalität

THX :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag von tobe »

@edel
dein Datei_Oeffnen() umbau ist ja (meistens) noch schneller als der stream :allright:

1637696 byte
stream: 140 ms
edel: 24 ms

813041 byte
stream: 45 ms
edel: 53 ms

270336 byte
stream: 19 ms
edel: 3 ms

ps: die geschwindigkeit ändert sich bei mir nicht, egal ob im Debug-Modus oder als exe
PureBasic 4.40 (Windows - x86)
Gesperrt