Newsgroup: it.comp.lang.pascal
Titolo: non ho ancora capito...

L'unica certezza che ho è che delay (1000) sul mio computer corrisponde ad una
pausa di un centesimo di sewcondo.. altro che secondo!
Possibile che non esista n modo per risolvere il problema....
cosa c'entra la tpu???
Simone.

pausa di un centesimo di sewcondo.. altro che secondo!
1000 millisecondi equivalgono a 1 secondo (e questo e'
universalmente vero).   
Temo, pero', che Delay non si comporti in modo preciso.
--
CyberWalkie - walkietalkie(at)
libero.it

Ergo??? Come correggo il problema????

Heheheheh ....
incuriosito dalla cosa ho provato a fare qualche test sul delay
sul mio pc (650Mhz) e mi sono accorto che il mio delay lavora
al 148%, ovvero una pausa di 1 secondo da me dura in
media 1.48 sec... sotto Win con winamp che suona... chiudendo
invece winamp il tempo si dilata fino al 156% !!!
stupito da questi risultati relativistici (mmmh bastasse chiudere
winamp per rallentare il tempo.... mmmmmmmmhhhhh) ho fatto
un programmino di test e se qlcn e' interessato mi scriva che
glielo mando e vediamo di fare un po' di statistiche e vedere da
che dipende ( s.o. / processore / programmi )
direi cmq che il delay non e' molto affidabile, un po' per colpa
della velocita' "eccessiva" dei pc, un po' per colpa del multitasking
che assegna felicemente il processore ai vari processi: non e' che
intanto qlcn con buone conoscenze asm ha voglia di fare un delay
che funzioni? non e' che il gruppo di pas-os l'ha gia' fatto ?
saluti
--
Dreadnaut (dn)
drea...@liberoDALLASPAM.it
(Life would be easier if I had the source code)

"Dreadnaut" <drea...@liberoDALLASPAM.it> ha scritto nel messaggio
news:iSZ27.6918$2v6.2...@news.infostrada.it...

Se non si vuole troppa precisione (~1 centesimo di sec.; comunque
migliore di quella del delay classico) si potrebbe provare una cosa
del tipo:
procedure delay2(cs:integer);
var a:longint; h,m,s,c:word;
procedure gettime; assembler;
asm
      mov ah,2Ch
      int 21h
      mov h,ch
      mov m,cl
      mov s,dh
      mov c,dl
end;
begin
        gettime;
        a:=h*360000+m*6000+s*100+c+cs;
        repeat gettime until (h*360000+m*6000+s*100+c)>=a
end;
Unico problema: se si esegue in modo che la pausa inizi un giorno e
finisca il giorno dopo il programma si bloccherà. Per ovviarvi
bisognerebbe o aggiungere un controllo anche sul giorno(ma così si
potrebbe avere un rallentamento dell'esecuzione e quindi una
sfasatura) o generare un errore se a-cs> dell'ora attuale.
Ciao a tutti
Kyle
P.S. Non credo che ci siano altri sitemi oltre a quello del ciclo per
rallentare che però dipende direttamente dalla velocità di esecuzione


Simone >> <<<fa...@fake.org.asm> wrote in message
eWG27.41919$cd.2...@news1.tin.it...

La soluzione comune sta nell'usare una procedura ke determini la velocità
del processore...
Una volta creata questa procedura (in ASM ovviamente) si otterrebbe un
valore ke faccia da base alla nostra procedura DELAY. In pratica sapendo ke
alcune istruzioni assembler durano X cicli di clock si può decidere di fare
un ciclo ke termina quando i secondi dell'orario sono cambiati (ovviamente
il ciclo terminerà dopo un solo secondo). Così si saprà quanto è lungo il
periodo della CPU.
Solo a questo punto si potrebbe pensare di fare una procedura ke aspetti TOT
millisecondi... conoscendo la durata del nostro ciclo di clock si potrebbe
usare una serie di NOP o di MOV AX,CX o di CMP AX,00, o qualunque alta
istruzione di cui sappiamo la durata in cicli di clock. Il ciclo ke contiene
quest'unica istruzione dovrà durare tanto da impegnare il processore per il
tempo desiderato. Così facendo il nostro DELAY durerebbe un tempo + esatto.
Inoltre, avendo una procedura ke calcoli la velocità del processore si
potrebbe rikiamarla in momenti diversi per aggiornare il conteggio dei
millisecondi, non vi pare? Un po' come Random e Randomize.
Ci sono però dei problemi... già un P200 conta 200 MILIARDI di cicli clock
al secondo... e in ASM è un tantino difficile gestire una variabile cke
arrivi a 200 miliardi....
...e poi mi son ricordato ke grosso modo queste ke ho detto sono le
procedure ke usa il pascal con l'unità CRT. In pratica all'avvio di un
programma in cui è usata l'unità CRT automaticamente viene calcolata la
velocità del processore per poter adattare il DELAY a quel PC. Infatti non
usando il modulo CRT non si aveva nessun errore....
Il problema è sorto quando la velocità di calcolo è aumentata notevolmente.
Magari per contare oltre i 200 miliardi sono state usate 4 Word o 2... ora
non mi viene in mente quanto conta ua variabile a 2 word e quanto una a 4...
cmq dovendo poi eseguire una divisione per quel valore, si generava un
errore di DIVISION by ZERO perchè con l'overflow del conteggio si azzerava
la variabile. Quindi se riuscite a fare un DELAY in ASM ke scavalki tali
problemi.... fatemelo sapere... io ora ho la pulce nell'orekkio e mi sa ke
farò qualcosina....
Saluti dal Grande VEGETA PRINCIPE DEI SAIYAN
     /\    /\
\_/    V   \_/

 eWG27.41919$cd.2...@news1.tin.it...
Potresti fare in modo che le risposte siano Re: e non R: ?

 wrote in message
9ka03k$2ap$1...@fe2.cs.interbusiness.it...

Ti pesa tanto la cosa? E' di fondamentale importanza? Muore x caso
qualcuno???


Sia sbagasciano i thread :-)
[e non e' standard]


 --
Lamentati con Mamma Micro$oft ke ha fatto Outlook Express 5 cosě!!!!


 ha scritto nel messaggio
news:nJja7.92480$Qf6.6...@news2.tin.it...



fai prima ad aggiornare tutto a ie 5.5
--
Ciao
Marchese Gianfranco
e-mail dgruma@NOPUBBLICITA'
tin.it
 (Da togliere NOPUBBLICITA' se vuoi
rispondermi da qui)
sito internet personale: 
www.turbo-pascal.cjb.net
 Tutto sul turbo Pascal 7
per il reply togliere NOSPAZZATURA