Newsgroup: it.comp.lang.pascal
Titolo: delay non funziona correttamente

Ho notato che durante l'esecuzione di programmi Pascal che utilizzano la
procedura delay...quest'ultima non funziona correttamente.
All'avvio del programma infatti succede più volte che il ritardo da me
stabilito con il delay risulta superiore a quello effettivo(il problema
persiste per tutto il ciclo di esecuzione del programma).
Qualcuno mi sa aiutare?
Grazie
--
s...@gem.it
kin...@geocities.com



Ho notato la stessa cosa fino alla versione 6 del TP. Con la versione 7
sembra che la Borland sia riuscita a correggere il problema.
Ciao
   Carlo

 persiste per tutto il ciclo di esecuzione del programma).
E' capitato anche a me. Sembra che il delay vari a seconda della
macchina su cui gira il programma. Delay(5000) puo' far passare dai 2 ai
7 secondi!! Piu' veloce e' il pc, meno dura il delay.
-- 
Salvadori Danilo
 
ilb...@tin.it

 wrote in message
37E9DC04...@tin.it...

Rimanendo nell'ambiente Borland, suggerirei la riscrittura della procedura.
Un'indizio ?
procedure Delay(ms: Word);
var
    t_end: longint;
begin
    t_end := MemL[0:$46c]+longint(ms) div 55; { 0:46Ch contiene un valore di
32 bit }
    while MemL[0:$46c]>t_end do;
end;
L'ho scritta al volo, quindi sara' pieno di bug....tra cui "cosa accade se
viene lanciata alle 23:59.59 ?".
Ciao!
Simone.
_____________________________________________
"....c'e' vita su Marte ?"
"Giusto un po' il sabato sera...."
            C.Guzzanti
e-mail:  
drfa...@libero.it
 
drfa...@tiscalinet.it
 
drfa...@tin.it
web:     
http://www.tiscalinet.it/drfalken
 
http://free.prohosting.com/~drfalken
ICQ#:  19598133
_____________________________________________

> procedura delay...quest'ultima non funziona correttamente.
E' verio. L'ho notato anch'io. Ti conviene programmare un po' in asm e farti
una routinetta che gestisca il timer se vuoi il secondo spaccato.
Io uso il BP7 e non funzia.
andr...@libero.it

 Qualcuno mi sa aiutare?
La procedura delay cambia da processore a processore.
Un tempo stabilito risulta minore su una macchina più veloce rispetto a
quella in cui è stata fatta la prova.
Ti serve una procedura/funzione che ti calcoli esattamente un certo lasso
di tempo ?

#Qualcuno mi sa aiutare?
Ecco una unit (dovrebbe servire anche per l' RTE200):
----------------------------------
Unit Udelay;             { Use this before CRT }
interface
const dfix:word=1;       { call delay() dfix times }
implementation
{$ifdef msdos}
uses dos;
procedure oldints; assembler; { "variables" in the code segment }
          asm dd 0,0 end;
Procedure error;
begin
  runerror(200);
End;
Procedure Int0; assembler;
          asm
          cmp cx,55       { If CX<>55 we are at some other point }
          je @ok
          sti
          call error
@ok:
          shr dx,1        { divide dx:ax by 2 }
          rcr ax,1
          shl Dfix,1      { multiply Dfix by 2 }
          iret            { return to the DIV (286+) }
          end;
{ Int21h handler removes the int0 handler (as well as itself) from the
  memory when CtrlBreak vector is set by CRT right after calculating
  the delay counter. Note DS does NOT point to the data segment when
  this is called }
Procedure Int21h; assembler;
          asm
          cmp ax,$251B
          jne @old               { Not setint 1Bh? }
          push es; push si; push di
          mov si,offset oldints
          xor di,di
          mov es,di
          cld
          segcs; movsw
          segcs; movsw           { restore int 0 }
          mov di,$21*4
          segcs; movsw           { restore int 21h }
          segcs; movsw
          pop di; pop si; pop es
@old:     jmp dword ptr cs:[oldints+4]
          end;
type tr=record int0,int21:pointer; End;
     pr=^tr;
begin
  GetIntVec(0,pr(@oldints)^.int0);
  GetIntVec($21,pr(@oldints)^.int21);
  SetIntVec(0,@int0);
  SetIntVec($21,@int21h);
{$endif}
end.
Ciao
Andrea C