[delphi] printerpoort uitlezen versnellen

Pagina: 1
Acties:

  • snoei
  • Registratie: Maart 2001
  • Laatst online: 19:23

snoei

kabels... :D

Topicstarter
Ik ben bezig met uitlezen van mijn printerpoort. Dit lukt nu al, alleen het gaat vrij traag.

ik heb dus de volgende code:

Delphi:
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
   dummy:=0;
   i:=0;
   while (dummy <> 14) do
    begin
      if (dummy = 28) then
        begin
          if i = 0 then i:= form1.Listbox1.Count-1
            else i := i - 1;
        end;
      if (dummy = 26) then
        begin
          if (i = (form1.Listbox1.Count-1)) then i := 0
            else i := i + 1;
        end;
      if (dummy = 22) then
        begin
          form1.ListBox3.Items.Add(form1.ListBox1.Items[i]);
          SchrijfDisplay('','1 ' + form1.ListBox1.Items[i],'is toegevoegd','');
          Sleep(1000);
        end;

      SchrijfDisplay('','Product Kiezen:',form1.Listbox1.Items[i],'');
      dummy := (IOAccess.PortW[$378] div 1000);
      sleep(1);

    end;


ik zit dus in een while loop zolang nog niet 1 bepaalde knop is ingedrukt. En in ieder if statement wordt dus een handeling gedaan als een bepaalde knop is ingedrukt.

Mijn grote vraag is dan ook, kan ik dit op de een of andere manier versnellen, aangezien het nu wel 1,5 tot 2 seconde duurt voordat er response is.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Je vraagt de dummy op , en dan wacht je 1 seconde voordat je gaat kijken wat erin staat?

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 18:58

Tomatoman

Fulltime prutser

Dit programma is het overgrote deel van de tijd bezig met nutteloze zaken. Tijdens het uitvoeren van Sleep doet het programma niets, maar de rest van de tijd belast het de processor. Dat is natuurlijk zonde van de processorpower en ook van de stroom. Iets scherper gesteld: dit is een voorbeeld van slecht programmeren.

Overigens is het commando Sleep bijna altijd een indicatie dat er iets niet lekker is geprogrammeerd. Het is een gevaarlijk trucje om de timing van je programma op orde te krijgen - dat zou heel goed tot een ongewenst resultaat kunnen leiden op een andere (veel snellere of langzamere) computer.

Een paar tips.
  • Ten eerste wordt in de while loop iedere keer de functie SchrijfDisplay uitgevoerd, waarbij ik vermoed dat dit het gros van de processortijd opslokt. Ik weet niet precies wat hij doet, maar een paar duizend keer overbodige code uitvoeren kan veel tijd kosten.
  • Ten tweede kun je de code vereenvoudigen door de drie if statements te vervangen door één case statement.
  • Ten derde kun je alle timingproblemen en het onnodig doorlopen van de loop oplossen door een events te gebruiken. Misschien heeft TIOAcces zoiets als een OnChange event. Als alternatief kun je een TTimer gebruiken en in de OnTimer event handler de waarde van de poort uitlezen en verwerken. Let erop dat een TTimer een maximale resolutie bereikt van ongeveer 20 milliseconden. Als Windows heel druk bezig is, kunnen OnTimer messages wel eens verloren gaan. Daarom is het nog beter om een message-gebaseerde component te gebruiken, omdat je dan zeker weet dat alle messages worden afgehandeld.
  • Ten vierde is het een goede gewoonte om je variabelen duidelijke namen te geven - dummy is nietszeggend. Een naam als PoortWaarde maakt je code over het algemeen veel minder cryptisch. Die i als index is trouwens wél duidelijk (dat is een veelgebruikte variabele als teller in een loop).
Al is dit misschien een beetje veel kritiek in een keer, het is opbouwend bedoeld :)

[ Voor 0% gewijzigd door Tomatoman op 27-09-2002 20:36 . Reden: layout verbeterd ]

Een goede grap mag vrienden kosten.


  • snoei
  • Registratie: Maart 2001
  • Laatst online: 19:23

snoei

kabels... :D

Topicstarter
kritiek is nooit verkeerd. Hier heb ik tenminste wat aan.