[Delphi] eigen brouwsel hangt na focus out

Pagina: 1
Acties:

  • ThePriest
  • Registratie: Mei 2000
  • Laatst online: 30-01-2024

ThePriest

the one, the only

Topicstarter
Hallo,
Ik heb een (100% werkend) programmaatje gemaakt in Delphi dat een M3u (Winamp MP3 playlist) file sorteert op alfabet. Er is 1 probleem. Als ik 'm "start" (over een bestand met 2500+ songs doet hij 30 seconden) en ik ga naar ander venster in Windows (focus out dus) dan hangt hij helemaal. Iemand een idee hoe dat komt?

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 10:21

mulder

ik spuug op het trottoir

Doe eens een Application.ProcessMessages in de routine waar je die nummers doorloopt.

oogjes open, snaveltjes dicht


  • ThePriest
  • Registratie: Mei 2000
  • Laatst online: 30-01-2024

ThePriest

the one, the only

Topicstarter
Op woensdag 03 juli 2002 12:02 schreef Don Facundo het volgende:
Doe eens een Application.ProcessMessages in de routine waar je die nummers doorloopt.
Hey geniaal man! Dat werkt ook nog! Nu een 2e probleem. Het programma gaat wel "door", maar als je hem eerst minimaliseert en dan weer terughaalt refresht hij het form niet (net of hij gecrasht is, maar hij gaat nog wel door). Is dat nog te fixen?

Verwijderd

Hoogstwaarschijnlijk is het je sorteerroutine die er veel te lang over doet, of misschien zelfs eindeloos doorgaat.

Ik zou dat even checken en checken of je de sorteerroutine kunt optimaliseren. Probeer bijvoorbeeld een quicksort te implementeren.

Als de code al optimaal is moet je er misschien over denken de code in een aparte thread te runnen. Hierdoor heeft je programma de mogelijkheid te reageren op user input terwijl je aan het sorteren bent.

  • SiHiDa
  • Registratie: December 2001
  • Laatst online: 01-03-2023
Hoe werkt het sorteren? 30s is wel erg lang... Binnen een seconden moet hij het gedaan hebben.

  • ThePriest
  • Registratie: Mei 2000
  • Laatst online: 30-01-2024

ThePriest

the one, the only

Topicstarter
Op woensdag 03 juli 2002 13:46 schreef SiHiDa het volgende:
Hoe werkt het sorteren? 30s is wel erg lang... Binnen een seconden moet hij het gedaan hebben.
Kan vast wel netter, maar is effe snel in elkaar geknald. :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    Repeat
       Reset (fFile);
       ReadLn (fFile, sTmp1); {dummy}
       bFound:=False;
       for iLoop2:=0 to listbox1.Count -1
       do begin;
        if (bFound=False)
        then begin
           ReadLn (fFile, sTmp1);
           ReadLn (fFile, sTmp2);
           if (
            (Copy(sTmp1,Pos(',',sTmp1)+1,100)           
            AND
            (sTmp1=aSongs[iLoop2].Line1)
            AND
            (sTmp2=aSongs[iLoop2].Line2)
           )
           then begin
            WriteLn(fNewFile,aSongs[iLoop2].Line1);
            WriteLn(fNewFile,aSongs[iLoop2].Line2);
            { Listbox1.Selected[iLoop];
              Listbox1.DeleteSelected; }
            bFound:=True;
           end;
        end;
       end;
       iLoop:=iLoop+1;
       Edit3.Text:=inttostr(iloop);
       edit3.Update;
       ProgressBar1.Position:=iLoop;
    until iLoop=listbox1.count;
    CloseFile(fFile);
    CloseFile(fNewFile);
    Edit2.Text:=inttostr(listbox1.Count);
   end;

't Komt eropneer dat die M3U files uit twee regels per song bestaan. Alleen de onderste moet op alfabet worden gesorteerd. Maar ze moeten wel per "setje" van 2 bij elkaar blijven hangen. Daarom lees ik die shit eerst in een listbox. Vaag he? :D

Verwijderd

Ik zie dat je een listbox in je routine gebruikt. Mijn ervaring is dat deze erg traag is omdat hij het OnPaint event ook gebruikt. Het updaten hiervan vergt vrij veel tijd. Probeer es een Tstringlist. Deze heeft ingebouwde sorteerroutines die gemakkelijk aan te roepen zijn ook. Op het laatst Stringlist.free, application.processmesages, en klaar!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:52

Creepy

Tactical Espionage Splatterer

Op woensdag 03 juli 2002 15:05 schreef Prinz het volgende:
Ik zie dat je een listbox in je routine gebruikt. Mijn ervaring is dat deze erg traag is omdat hij het OnPaint event ook gebruikt. Het updaten hiervan vergt vrij veel tijd. Probeer es een Tstringlist. Deze heeft ingebouwde sorteerroutines die gemakkelijk aan te roepen zijn ook. Op het laatst Stringlist.free, application.processmesages, en klaar!
Als je een niet visuele TStringlist gebruikt gaat dat sneler ja.. Maar een TStringlist heeft twee methods om aan te geven dat er ff flink moet worden geupdate, maar nog niet visueel moet worden doorgevoerd. Dat kan je dus ook gebruiken op een TListbox.items.
code:
1
2
3
listbox1.items.beginupdate;
// Hoop code hier
listbox1.items.endupdate;

Dit werkt bijv. ook op een TListItems (voor in een TListview).
Pas na de .endupdate, zal het op het scherm in 1 keer aangepast worden, i.p.v. elke keer dat je iets met 1 item doet.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • ThePriest
  • Registratie: Mei 2000
  • Laatst online: 30-01-2024

ThePriest

the one, the only

Topicstarter
CRAP!
Ik kom er net achter dat je in Winamp gewoon kunt sorteren. Ik vond het al zo gek dat dat er niet inzat. Programma voor nop geschreven. Winamp doet 't trouwens binnen 1 seconde. :(

Maar wel bedankt voor de tips.

  • Woef
  • Registratie: Juni 2000
  • Niet online
Op woensdag 03 juli 2002 16:16 schreef ThePriest het volgende:
CRAP!
Ik kom er net achter dat je in Winamp gewoon kunt sorteren. Ik vond het al zo gek dat dat er niet inzat. Programma voor nop geschreven. Winamp doet 't trouwens binnen 1 seconde. :(

Maar wel bedankt voor de tips.
ja maar winamp heeft die id3v1 of id3v2 tags niet binnen 1 seconden uitegelezen en dan sorteerd hij dus een deel op filename en op de al ingelezen id3x tag. Ik denk dat jou programma wel eerst die tags uitleest en daarom duurt het waarschijnlijk zo lang!
Pagina: 1