amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Gesucht: Sekundentakt [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- 2 3 4 [ - Beitrag schreiben - ]

19.06.2006, 20:44 Uhr

Ralf27
Posts: 2779
Nutzer
Mit MBasic-Mitteln war es immer recht einfach einen Sekundentakt zu bekommen. Aber wie mach ich das am besten systemfreundlich mit den Systembefehlen?

Ich vermute mal mit einem Takt via IDCMP. Wie geh ich da am besten vor?

Danke im vorraus
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

19.06.2006, 21:32 Uhr

ylf
Posts: 4112
Nutzer
Welche Sparche? C?
In C gibt es z.B. die time.h, worin du entsprechende Funktionen finden solltest.

bye, ylf

[ - Antworten - Zitieren - Direktlink - ]

19.06.2006, 21:40 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Ralf27:
Mit MBasic-Mitteln war es immer recht einfach einen Sekundentakt zu bekommen. Aber wie mach ich das am besten systemfreundlich mit den Systembefehlen?

Ich vermute mal mit einem Takt via IDCMP. Wie geh ich da am besten vor?

Danke im vorraus


Am schlauesten ist es eigentlich, das timer.device für diesen Zweck zu verwenden. Es ist im Grunde auch nicht so schwer, wie es anfangs vielleicht wirkt. Entsprechende Beispiele findest Du eigentlich überall, im Netz, auf der DevCD, in den RKMs (ich kann Dir aber, falls Du nichts passendes findest, einen Sourcecode-Schnipsel schicken, wahlweise auf Deutsch kommentiert ;) ).

Wissen mußt Du nur, wie man ein Device benutzt und auf das Signal von SendIO() wartet (mit DoIO() muß man zwar nicht ausdrücklich warten, kann allerdings mit dem eigenen Task/Prozess in dieser Zeit nichts machen, da dieser in den Wait-Zustand versetzt wird, bis das mit DoIO() ausgelöste Device-Kommando abgearbeitet ist. Hier "wartet" also DoIO() schon für Dich bzw. Deinen Prozess/Task).

Mit dem IDCMP (sprich: IntuiTicks) kannst Du zwar auch arbeiten, allerdings bekommst Du da einen (ungefähren!) 50tel-Sekunden-Takt, müßtest also einen Zähler aktualisieren, um zu wissen, wann die Sekunde (ungefähr!) vorbei ist. Ungefähr, weil die IntuiTicks je nach Systemlast/Menüauswahl und noch einigen anderen Ursachen verspätet/auf einem Haufen eintrudeln können.

Ganz nebenbei kannst Du mit dem timer.device die für Dich günstigste Genauigkeit des Timings wählen. Brauchst Du das Timing sehr langzeitstabil, ist UNIT_VBLANK die erste Wahl, bei sehr kurzen Intervallen (unter 1/50 Sekunde) wäre UNIT_MICROHZ besser, bei nicht so genauem (sprich: nicht zwingend langzeitstabilem und nicht besonders kurzem) Timing tuts UNIT_ECLOCK ganz gut.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

19.06.2006, 22:29 Uhr

thomas
Posts: 7717
Nutzer
@whose:

IntuiTicks kommen zehnmal pro Sekunde, nicht fünfzigmal und nur, wenn das Fenster aktiviert ist.

Des weiteren hat UNIT_ECLOCK exakt die gleiche Genauigkeit wie UNIT_MICROHZ, es wird nur eine andere Datenstruktur benutzt (bei UNIT_MICROHZ eine Struktur aus 32bit Sekunden und 32bit Mikrosekunden, bei UNIT_ECLOCK ein 64bit-Zähler, der sog. E-Clock-Ticks zählt).

Manchmal lohnt es sich, mal wieder in die Autodocs zu schauen, bevor man antwortet.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

19.06.2006, 22:39 Uhr

Ralf27
Posts: 2779
Nutzer
Danke für die Hilfe. Ich glaub ich hab das passende gefunden. Die 10 Impulse pro Sekunde von IDCMP ist eigentlich doch das richtige für mich.

Ich benutze diese Impulse nur um nur eine gewisse Zeit (ca. eine Sekunde) "abzuschätzen". Die genaue Zeit werde ich mit dem TIMER-Befehle von MBasic rausbekommen.

Via IDCMP ist es ideal um einen ca. Takt zu bekommen. Dabei ist es auch nicht so schlimm wenn der Takt weg bleibt, denn ich merke mir ja mit dem TIMER-Befehl von MBasic die Anfangszeit.

Zeitraum: ca. 1-10Minuten
Zeitabstand: ca. eine Sekunde

Ich werde mich auch später mal interessenhalber mit dem Systemtimer beschäftgen. Außerdem läuft ja das Programm in der Zwischenzeit und soll nicht insgesamt diese Zeit warten.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

19.06.2006, 22:43 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von whose:
...ich kann Dir aber, falls Du nichts passendes findest, einen Sourcecode-Schnipsel schicken, wahlweise auf Deutsch kommentiert ;)
...


Ich glaube dir ist bekannt wo meine Problemchen sind. Englisch mag mich als noch nicht. :D

Ich versuche es aber erst mal selbst mit der Hilfe hier von euch zu lösen und mein Programm um ein (systemfreundliches) Feature zu bereichern. :)
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

19.06.2006, 23:04 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von thomas:
@whose:

IntuiTicks kommen zehnmal pro Sekunde, nicht fünfzigmal und nur, wenn das Fenster aktiviert ist.

Des weiteren hat UNIT_ECLOCK exakt die gleiche Genauigkeit wie UNIT_MICROHZ, es wird nur eine andere Datenstruktur benutzt (bei UNIT_MICROHZ eine Struktur aus 32bit Sekunden und 32bit Mikrosekunden, bei UNIT_ECLOCK ein 64bit-Zähler, der sog. E-Clock-Ticks zählt).

Manchmal lohnt es sich, mal wieder in die Autodocs zu schauen, bevor man antwortet.


Das "Kompliment" kann ich zurückgeben...

Zitat:
"The ECLOCK timer unit uses the Amiga E-Clock to measure the time interval you request. This is the most precise time measure available through the timer.device"

Also schon mal keine "exakt gleiche" Genauigkeit. UNIT_MICROHZ hat sogar noch das Problem des größeren Overheads, ist aber als Kurzzeit-Timer doch besser zu gebrauchen (und in sehr kurzen Zeiträumen nicht schlechter in der Genauigkeit als UNIT_ECLOCK, dafür deutlich einfacher zu handhaben, Konstanten reichen meist. Siehe AmigaMail Vol.1 oder 2, das weiß ich aus dem Kopf nicht so genau). Dafür kann einem bei der UNIT_ECLOCK durch die Rechnerei mit Variablen schon mal ein Event entwischen, wenn man nur auf normaler Priorität "läuft".

Edit: Noch was vergessen: Bei hoher Systemlast kann sich der kleine Vorteil in Sachen Handhabung von UNIT_MICROHZ aber ins Gegenteil verkehren.

Bei den IntuiTicks hast Du aber Recht, da lag ich aus dem Stegreif falsch. Danke für die Korrektur.

@Ralf:

Dann hast Du ja schon mal einen Aufhänger. Wenn Du keine besonders exakten Zeiten brauchst und Dein Programm eh aktiv sein soll, langen IntuiTicks für den Anfang.

Abgesehen davon: Die ganze Zeit "abwarten" muß Dein Programm ja nicht, wenn Du das timer.device einsetzt. Streng genommen könntest Du das "Ende" der Wartezeit in einer Schleife abfragen (böse!). Allerdings müßte sich in Deinem Programm auch eine Stelle finden, wo Du in Erfahrung bringen willst, ob die gewünschte Zeit tatsächlich schon abgelaufen ist. Genau dann könntest Du darauf mittels Wait() warten. Das geht sogar im Zusammenspiel mit Intuition und dem IDCMP.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233


[ Dieser Beitrag wurde von whose am 20.06.2006 um 02:15 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

19.06.2006, 23:52 Uhr

Ralf27
Posts: 2779
Nutzer
Ich hab es eben implementiert und es läuft wunderbar. Es stimmt auch, das die IDCMPTicks etwas unterschiedlich kommen. Aber das ist nicht so wichtig, da ich nur ca. eine Sekunde abstand brauche(also +- 0.5 Sekunden). Die genaue Zeit berechne ich anderst (über die TIMER-Funktion).

Aber eins wundert mich jetzt doch:

Ich hab IDCMP_INTUITICKS& gleich beim Aufbauen des Fensters angegeben und eigenntlich würden mich die ticks doch gleich überrennenn, oder? Da ich am Anfang nach dem Bildaufbau noch ca. 1-2 Sekunden berechnunge habe, dürften dann doch ca. 10-20 Ticks über mich herfallen, was aber nicht der Fall ist. Das Fenster ist da auch aktiv.
Versteht mich jetzt bitte nicht falsch, aber so wie es gerade läuft ist es für mich genau richtig. Aber ich dachte wirklich das dann die Ticks immer über das Messagesystem rüberkommen (wenn das Fenster aktiv ist), egal was das Programm gerade macht.
Ich vermute aber, das die Ticks nur kommen und der 1/10 Sekundenabstand nur kommt, wenn das Programm in der Wartestellung (WaitPort) ist. Kann das sein? Jedenfalls scheint mir das so und es ist für mich dann wirklich recht ideal.

Insofern lief das jetzt wirklich viel einfacher als ich dachte. I-) :D
--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 19.06.2006 um 23:54 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 00:04 Uhr

whose
Posts: 2156
Nutzer
@Ralf27:

Da kann Dir Thomas sicher mehr zu sagen, Intuition ist definitiv sein Gebiet (ich habe mich mit den IntuiTicks nie tiefergehend beschäftigt). Aus meiner grauen Erinnerung heraus würd ich aber sagen, daß eine Warnung bezüglich des "überrannt Werdens" in den RKMs stand. Normal müßten auch Ticks auflaufen, wenn Du nicht wartest.

Es ist natürlich auch die Frage, wie Du die Ticks auswertest. Wenn Du z.B. immer nur ein Mal GetMsg() aufrufst und nicht, bis GetMsg() NULL zurückliefert (!), dann kennst Du im Grunde schon die Ursache. Du erwischst in dem Fall halt immer nur den "zuletzt" aufgelaufenen Tick, "übersiehst" aber alle anderen, bereits aufgelaufenen Ticks.

Beobachte doch mal das Zeitverhalten Deines Programms, indem Du irgendwelche eigentlich nutzlosen Schleifen durchzählen läßt und dann Wait()est. Normal müßten dann die Intervalle Deines Programms spürbar länger ausfallen als ca. 1 Sekunde, die IntuiTicks aber trotzdem "abgeholt" werden, halt nur später als sonst. Ich denke nämlich, daß Dein Programm zufällig ca. 1/10 Sekunde für seine Arbeiten braucht, bevor es wieder zum Wait() zurückkehrt. Da fällt es dann nicht auf, daß Ticks "verschlafen" werden.

Das kann man aber ohne den Code zu sehen schlecht sagen. Ist halt ne Vermutung von mir ;)

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233


[ Dieser Beitrag wurde von whose am 20.06.2006 um 00:06 Uhr geändert. ]

[ Dieser Beitrag wurde von whose am 20.06.2006 um 00:10 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 00:16 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von whose:
Es ist natürlich auch die Frage, wie Du die Ticks auswertest. Wenn Du z.B. immer nur ein Mal GetMsg() aufrufst und nicht, bis GetMsg() NULL zurückliefert (!), dann kennst Du im Grunde schon die Ursache. Du erwischst in dem Fall halt immer nur den "zuletzt" aufgelaufenen Tick, "übersiehst" aber alle anderen, bereits aufgelaufenen Ticks.


Ich rufe immer wieder GetMsg auf(nach dem Aufruf und dem auslesen der Class und IntuiMessageCode dann ReplyMsg) bis ich NULL zurück bekomme. Dann gehts zu WaitPort.

Aber teilweise kann es zwischen denn Spielen recht lange(nunja wie lange es halt dauert die Daten von der Festplatte zu laden und zu verarbeiten :D ) dauern bis ich wieder in die Schleife zurück komme und ich hoffe wirklich das dann kein Zähler oder sonstiges von Intuition überläuft.

Wärend des Spiels wird das Programm wohl die meiste Zeit bei WaitPort verbringen(schätze mal >90% der Zeit)und auch sonst ist die große Schleife (also die mit der Verarbeitung der Events) auch recht zügig und bestimmt unter 1/10 Sekunde pro Durchgang.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 00:22 Uhr

whose
Posts: 2156
Nutzer
@Ralf27:

Dann paßts ja. Aktualisierst Du mittels der Ticks zufällig einen Zähler, um die Sekunden zu ermitteln? Laß Dir den doch mal ausgeben, dann siehst Du, ob die Anzahl paßt oder ob Du irgendwo einen kleinen logischen Fehler eingebaut hast. Der Zähler müßte dann ja einen "Vorsprung" von ca. 20 haben, wenn Du beim Start knapp 2 Sekunden "verbrätst". Wenn Deine Vermutung stimmt und die Ticks erst kommen, wenn Du wartest, müßte in der 1. Sekunde nach Start der Zähler irgendwas um die 10 erreichen statt 30.

Ach ja: Soweit ich weiß, kann man den IDCMP auch "zwischendrin" modifizieren. Das würde bedeuten, daß Du die IntuiTicks "aussetzen" kannst, bis Deine Daten geladen und verwurstet sind und sie dann wieder "zulassen". Wie das genau und korrekt geht, erklärt aber besser Thomas, ich hab das RKM "Libraries" gerade nicht zur Hand.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233


[ Dieser Beitrag wurde von whose am 20.06.2006 um 00:27 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 00:26 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von whose:
@Ralf27:

Dann paßts ja. Aktualisierst Du mittels der Ticks zufällig einen Zähler, um die Sekunden zu ermitteln? Laß Dir den doch mal ausgeben, dann siehst Du, ob die Anzahl paßt oder ob Du irgendwo einen kleinen logischen Fehler eingebaut hast. Der Zähler müßte dann ja einen "Vorsprung" von ca. 20 haben, wenn Du beim Start knapp 2 Sekunden "verbrätst". Wenn Deine Vermutung stimmt und die Ticks erst kommen, wenn Du wartest, müßte in der 1. Sekunde nach Start der Zähler irgendwas um die 10 erreichen statt 30.


Genau diesen Test hab ich vorhin gemacht und deswegen bin ich zu dieser These weiter oben gekommen. Und genau das hat mich erstaunt. Denn genau sowas hab ich gebraucht, hab es aber eigentlich etwas komplizierter erwartet. :)
Für den Test hab ich einfach einen Zähler benutzt der einfach die Ticks zählt.
Im Programm schau ich nur wenn ein Tick rein kommt ob schon eine volle Sekunde (gerechnet vom Start aus) vergangen ist und gebe dann die vergangene Zeit vom Start aus aus.
Deswegen ist es auch egal ob mal ein Tick fehlt oder zu später/zu früh kommt.

--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 20.06.2006 um 00:28 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 00:31 Uhr

whose
Posts: 2156
Nutzer
@Ralf27:

Ach, so schwierig ist das alles nicht, wenn man erst einmal drin ist. Ich z.B. benutze nur noch das timer.device, nachdem ich einmal begriffen hatte, wie das funktioniert. Ist im Grunde genauso simpel wie mit den IntuiTicks. Auch die Geschichte mit den Datatypes ist, dank Thomas' wirklich guter Beispiele, nicht so schwierig. Kennst Du ja :D

Ach so, dann verwendest Du die Ticks quasi als "Metronom", auch nicht schlecht. Passieren kann da eigentlich nichts, da Du die Messages alle abholst. Kann nur mal sein, daß der "Start" nach dem Laden etwas länger dauert, als er müßte. Das müßte sich mit dem Modifizieren des IDCMP beheben lassen.

Edit: Vertippser.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233


[ Dieser Beitrag wurde von whose am 20.06.2006 um 00:34 Uhr geändert. ]

[ Dieser Beitrag wurde von whose am 20.06.2006 um 00:36 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 00:36 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von whose:
Ach, so schwierig ist das alles nicht, wenn man erst einmal drin ist. Ich z.B. benutze nur noch das timer.device, nachdem ich einmal begriffen hatte, wie das funktioniert. Ist im Grunde genauso simpel wie mit den IntuiTicks. Auch die Geschichte mit den Datatypes ist, dank Thomas' wirklich guter Beispiele, nicht so schwierig. Kennst Du ja :D


Genau das ist es ja. Bei den Tutorials zu MaxonBasic war auch ein Beispiel dabei zu den Datatypes. Und das sah dermaßen verzwackt und kompliziert aus das ich weiche Knie bekommen habe und es möglichst schnell wieder übersehn habe. :D Ich glaub wenn ich hier den Code von den Tutorials posten würde (die ich als noch nicht versteh), das würd kaum einer verstehn. Denn irgendwie ist das kein C, kein MaxonBasic sondern irgendwas seltsames.

Aber die Beispiele vom Thomas sind kurz, leicht zu verstehn und nicht überladen. Und vorallem mit einer guten Priese "Ahhh, so geht das" :D

Die Tutorials zu MBasic verkraulen einem nur und bringen Verwirrung. An diesem Punkt zieh ich mein Hut vor MaikG, der da wohl durchgestiegen ist. Respekt! :D
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 08:29 Uhr

thomas
Posts: 7717
Nutzer
@whose:
Zitat:
Das "Kompliment" kann ich zurückgeben...

Zitat:
"The ECLOCK timer unit uses the Amiga E-Clock to measure the time interval you request. This is the most precise time measure available through the timer.device"



Ich weiß nicht, was du da zitiert hast, aber das sind nicht die Autodocs. Da steht nämlich folgendes:

Zitat:
UNIT_MICROHZ
This unit uses the programmable timers in the 8520s to keep track
of its time. It has precision down to about 2 microseconds, but
will drift as system load increases. The accuracy of this unit
is the same as that of the master clock of the machine. This unit
uses a timeval in its timerequest.


UNIT_ECLOCK
This unit is exacly the same as UNIT_MICROHZ except that it uses
an eclockval instead of a timeval in its timerequest.


Hinzu kommt noch, daß di CIAs nur eine Art von Timern haben, es kann also gar keinen Unterschied geben.

Und Overhead hin oder her, bei den E-Clocks mußt du erstmal ermitteln, wie schnell denn die "Master-Clock" ist und dann dein Intervall umrechnen, bei MicroHz macht das das timer.device für dich.


@Ralf27:
Zitat:
Ich hab IDCMP_INTUITICKS& gleich beim Aufbauen des Fensters angegeben und eigenntlich würden mich die ticks doch gleich überrennenn, oder? Da ich am Anfang nach dem Bildaufbau noch ca. 1-2 Sekunden berechnunge habe, dürften dann doch ca. 10-20 Ticks über mich herfallen, was aber nicht der Fall ist. Das Fenster ist da auch aktiv.

Der nächste IntuiTick kommt erst, wenn du den vorherigen beantwortet hast. Es hat also nichts mit WaitPort() zu tun, sondern mit ReplyMsg().

Hier ist noch ein Beispiel, was man mit Intuiticks machen kann: http://thomas-rapp.homepage.t-online.de/examples/KeyJoy.c :-)

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 08:33 Uhr

Mad_Dog
Posts: 1944
Nutzer
In meinem C-Kurs gibt's auch ein Beispiel mit Intuiticks:

http://w3.norman-interactive.com/C-Kurs_8_7.html

...allerdings muß ich gestehen, daß ich mir auch nicht ganz sicher bin, wie oft die kommen. In dem Beispiel ist Intuiticks allerdings nicht die erste Wahl, denn somit wird die Grafik öfter neugezeichnet wie eigentlich notwendig, was natürlich unnötig Rechenzeit verbrät. Ich hab das an dieser Stelle nur deshalb gemacht, um nicht das Timer-Device erllären zu müssen - denn in diesem Beispiel geht's in erster Linie darum wie man die Funktion Text() zusammen mit formatiertem Text verwenden kann...
--
http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 11:35 Uhr

whose
Posts: 2156
Nutzer
@thomas:

RKM "Devices" Third Edition. Aber lies ruhig mal AmigaMail.

Schönes IntuiTick-Beispiel.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233


[ Dieser Beitrag wurde von whose am 20.06.2006 um 11:40 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 11:50 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Mad_Dog:
In meinem C-Kurs gibt's auch ein Beispiel mit Intuiticks:

http://w3.norman-interactive.com/C-Kurs_8_7.html

...allerdings muß ich gestehen, daß ich mir auch nicht ganz sicher bin, wie oft die kommen. In dem Beispiel ist Intuiticks allerdings nicht die erste Wahl, denn somit wird die Grafik öfter neugezeichnet wie eigentlich notwendig, was natürlich unnötig Rechenzeit verbrät. Ich hab das an dieser Stelle nur deshalb gemacht, um nicht das Timer-Device erllären zu müssen - denn in diesem Beispiel geht's in erster Linie darum wie man die Funktion Text() zusammen mit formatiertem Text verwenden kann...


Ist doch für den Zweck auch völlig ausreichend. Wenn Du es etwas "genauer" haben willst, kannst Du das Beispiel ja so abändern, wie Ralf es gemacht hat. IntuiTicks als "Metronom" und z.B. CurrentTime() (dos.library, wenn ich nicht irre) um herauszubekommen, ob sich bei den Sekunden etwas getan hat.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 12:00 Uhr

bubblebobble
Posts: 707
Nutzer
Der Unterschied zwischen UNIT_ECLOCK und UNIT_MICROHZ ist, dass die Representation der Zeit bei ECLOCK in systemabhängigen "Ticks" ist.
Bei MICROHZ wird das umgerechnet in die tatächliche Frequenz in micro Hz.
Solange der timer nicht genauer ist als 1 MICROHZ, sind die beiden Zähler wohl gleichwertig was die Genauigkeit angeht. MICROHZ ist aber von der Hardware abstrahiert und deshalb User-freundlicher.
Bei ECLOCK muss man immer noch die tatsächliche Timer Frequenz auslesen und dividieren, denn die Timer können sehr unterschiedlich sein (PAL vs. NTSC Amiga, sogar teilweise Modelabhängig, auch z.b. AmigaOne hat andere Freuqnzen).
Der "Drift" bei hoher CPU Last passiert nur bei einem Classic, bei EMUs nicht, vermutlich bei OS4/MOS auch nicht.

--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 12:01 Uhr

Mad_Dog
Posts: 1944
Nutzer
Original von whose:
Zitat:
Ist doch für den Zweck auch völlig ausreichend. Wenn Du es etwas "genauer" haben willst, kannst Du das Beispiel ja so abändern, wie Ralf es gemacht hat. IntuiTicks als "Metronom" und z.B. CurrentTime() (dos.library, wenn ich nicht irre) um herauszubekommen, ob sich bei den Sekunden etwas getan hat.

In einer "ernsthaften Anwendung" würde ich das eher mit dem timer.device machen. Dort kann man nämlich genau einstellen, in welchen Zeitabständen die Message gesendet werden soll. Ein Nachteil von Intuiticks ist hier auch, daß sie nur bei aktiviertem Fenster kommen.


--
http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 20.06.2006 um 12:01 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 12:08 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Mad_Dog:
Original von whose:
Zitat:
Ist doch für den Zweck auch völlig ausreichend. Wenn Du es etwas "genauer" haben willst, kannst Du das Beispiel ja so abändern, wie Ralf es gemacht hat. IntuiTicks als "Metronom" und z.B. CurrentTime() (dos.library, wenn ich nicht irre) um herauszubekommen, ob sich bei den Sekunden etwas getan hat.

In einer "ernsthaften Anwendung" würde ich das eher mit dem timer.device machen. Dort kann man nämlich genau einstellen, in welchen Zeitabständen die Message gesendet werden soll. Ein Nachteil von Intuiticks ist hier auch, daß sie nur bei aktiviertem Fenster kommen.


Das ist klar. Ich meinte halt, daß es für Dein Beispiel in Sachen Uhr völlig ausreichend ist, mit IntuiTicks zu arbeiten. Um das "öfter als nötig"-Zeichnen zu vermeiden, langt die Geschichte mit dem Vergleich, ob sich die Sekunden inzwischen verändert haben, auch völlig hin. Das timer.device bietet da schon andere Möglichkeiten, deshalb hab ich das zuerst auch angeregt. Ist halt die Frage, ob man derart genaues Timing wirklich braucht. Für Ralf scheinen die IntuiTicks ja auszureichen.

@bubblebobble:

Danke für die Klarstellung.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 12:24 Uhr

Mad_Dog
Posts: 1944
Nutzer
Naja... man könnte es auch in etwa so machen (übel):

code:
while(1)
{
   MachWas();
   Delay(50);
}

--
http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 12:26 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Mad_Dog:
Naja... man könnte es auch in etwa so machen (übel):

code:
while(1)
{
   MachWas();
   Delay(50);
}



Wenn Du virtuell gesteinigt werden möchtest... ;)

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 12:29 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von whose:

Wenn Du virtuell gesteinigt werden möchtest... ;)


Jehovah, Jehovah! ;)
--
http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 12:32 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Mad_Dog:
Zitat:
Original von whose:

Wenn Du virtuell gesteinigt werden möchtest... ;)


Jehovah, Jehovah! ;)


Sie war's, sie war's!!!... ermh, er war's, er war's! :D

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 12:35 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von whose:
Es ist natürlich auch die Frage, wie Du die Ticks auswertest. Wenn Du z.B. immer nur ein Mal GetMsg() aufrufst und nicht, bis GetMsg() NULL zurückliefert (!), dann kennst Du im Grunde schon die Ursache. Du erwischst in dem Fall halt immer nur den "zuletzt" aufgelaufenen Tick, "übersiehst" aber alle anderen, bereits aufgelaufenen Ticks.


Man kann keine Ticks übersehen. Messages hängen in einer Warteschlange und egal, ob man jedesmal WaitPort aufruft oder erst GetMsg bis NULL abholt, bleiben die nicht abgeholten in der Schlange.

Iss nich wie beim Supermarkt, wo die unzufriedenen Kunden irgendwann nach Hause gehen...

Wenn man Ticks nicht bekommt, dann liegt das daran, daß sie nicht versendet wurden. Wie bereits gesagt wurde, hängt das nur von ReplyMsg ab, nicht von WaitPort.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 12:38 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von whose:
Das ist klar. Ich meinte halt, daß es für Dein Beispiel in Sachen Uhr völlig ausreichend ist, mit IntuiTicks zu arbeiten. Um das "öfter als nötig"-Zeichnen zu vermeiden, langt die Geschichte mit dem Vergleich, ob sich die Sekunden inzwischen verändert haben, auch völlig hin.

Kommt drauf an. Wenn man eine Workbench-Uhr programmieren will, soll die sich natürlich auch aktualisieren, wenn das Fenster nicht aktiv ist.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 12:43 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Mad_Dog:
Naja... man könnte es auch in etwa so machen (übel):
code:
while(1)
{
   MachWas();
   Delay(50);
}


Delay macht auch nichts anderes als das timer.device um eine Nacricht zu bitten und auf diese Nachricht zu warten. Warum die exakt gleiche Aktion jetzt auf einmal übel sein sollte, nur weil man eine Funktion aufruft, die den Vorgang kapselt, erschließt sich mir nicht.

Natürlich sollte man wenige Angriffsfläche bieten und
code:
quit=MachWas();
while(!quit)
{
   Delay(50);
   quit=MachWas();
}

schreiben.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 12:48 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Holger:
Zitat:
Original von whose:
Es ist natürlich auch die Frage, wie Du die Ticks auswertest. Wenn Du z.B. immer nur ein Mal GetMsg() aufrufst und nicht, bis GetMsg() NULL zurückliefert (!), dann kennst Du im Grunde schon die Ursache. Du erwischst in dem Fall halt immer nur den "zuletzt" aufgelaufenen Tick, "übersiehst" aber alle anderen, bereits aufgelaufenen Ticks.


Man kann keine Ticks übersehen. Messages hängen in einer Warteschlange und egal, ob man jedesmal WaitPort aufruft oder erst GetMsg bis NULL abholt, bleiben die nicht abgeholten in der Schlange.


Was will uns der Autor damit sagen?

Also, daß der nächste Tick erst dann wieder kommt, wenn ein Tick beantwortet wurde, ist inzwischen klar. Bis zu dem Zeitpunkt, da Thomas das klarstellte, waren das nur Vermutungen. Steht auch dabei.

Zitat:
Iss nich wie beim Supermarkt, wo die unzufriedenen Kunden irgendwann nach Hause gehen...

Bei den IntuiTicks wohl nicht, bei Messages im Allgemeinen schon. Laß doch mal Messages von z.B. dem timer.device eintrudeln, hole die Messages nicht bzw. nur sehr selten ab und beende das Programm irgendwann einfach. Dann hast Du viele, unzufriedenen Kunden. Ein paar sind inzwischen sogar schon nach Hause gegangen ;)

Zitat:
Wenn man Ticks nicht bekommt, dann liegt das daran, daß sie nicht versendet wurden. Wie bereits gesagt wurde, hängt das nur von ReplyMsg ab, nicht von WaitPort.

Ja, das ist nun klar.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233


[ Dieser Beitrag wurde von whose am 20.06.2006 um 13:01 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

20.06.2006, 12:53 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Holger:
Zitat:
Original von whose:
Das ist klar. Ich meinte halt, daß es für Dein Beispiel in Sachen Uhr völlig ausreichend ist, mit IntuiTicks zu arbeiten. Um das "öfter als nötig"-Zeichnen zu vermeiden, langt die Geschichte mit dem Vergleich, ob sich die Sekunden inzwischen verändert haben, auch völlig hin.

Kommt drauf an. Wenn man eine Workbench-Uhr programmieren will, soll die sich natürlich auch aktualisieren, wenn das Fenster nicht aktiv ist.

Auch das ist klar. Für ein simples Beispiel, was man mit IntuiTicks machen kann, langt es allerdings. Er kann ja z.B. das Uhr-Beispiel wieder aufgreifen, wenn der Kurs zum timer.device kommt. Denkbare Überschrift: "So baut man eine wirklich brauchbare WB-Uhr"...

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]


-1- 2 3 4 [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Gesucht: Sekundentakt [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.