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 - ]

28.06.2006, 14:42 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von thomas:
Sicher, wenn man Probleme hat, mit den 32 Signalen (oder 24, die man als User benutzen kann) auszukommen, dann muß man sparen.

16, zumindest als ich das letzte Mal eine Dokumentation des AmigaOS gelesen haben. 16 für die Anwendung, 16 für's System. Vielleicht hat man ja später ein paar von den unbenutzten System-Bits an die Anwendung abgegeben? Würde mich interessieren, vor allem ab wann.
Zitat:
Aber wann kommt das schonmal vor ?
Das erste geht schon für den MessagePort des Process drauf, noch bevor das eigene Programm läuft. Dann eins pro IORequest, eins pro Fenster, eins, wenn man mit der workbench.library kommunizieren will (D&D etc.), einen ARexx-Port, noch eins, wenn man asynchrone DOS-Operationen durchführen will...
Zitat:
Gut, ich habe noch keinen Word-Processor geschrieben, bei dem man beliebig viele Dokumenten-Fenster aufmachen kann. Aber bei sowas würde ich dann wohl auch jedem Fenster eine Sub-Task spendieren, ...
Ich nicht. Bei Fenstern kann man ruhig einen shared-MessagePort verwenden, da es grundsätzlich nur ein aktives Fenster gibt, bei dem User-Input (oder auch Ticks) ankommen. Zuordnen muß man sowieso.
Zitat:
Schon aus dem Grund, daß man, wenn mal einer abstürzt, die anderen noch sauber speichern und schließen kann.

Halte ich für die falsche Argumentation, Resourcen des Users zu verschwenden, um Fehler des Programmierers abzuschwächen. Lieber stabile Programme schreiben, statt so einen workaround. Außerdem funktioniert es im AmigaOS sowieso in 90% der Fälle nicht, weil das abstürzende Programm die anderen in Mitleidenschaft zieht.

Und wenn man schon einen Notfallplan implementiert, sollte es sich um einen zusätzlichen Task handeln, der die Anwendungsdaten komplett kennt und somit im Ernstfall alle Dokumente speichern kann, nicht wie bei Deinen 1 Fenster == 1 Task Ansatz alle Dokumente minus eins.

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

[ - Antworten - Zitieren - Direktlink - ]

28.06.2006, 14:44 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von gni:
timerequest enthält am Anfang einen engebetteten IORequest und genau den übergibt man mittels &req->tr_node. Damit hat man ohne cast den richtigen Typ. In Amiga-Programmen wird viel zu oft mit Casts gearbeitet...

Amen.

Zitat:
Original von whose:
So kann man es natürlich auch machen. Mit dem Cast geht es auch, noch dazu für beinahe jedes Device gleich, ohne jedesmal in den Strukturen schauen zu müssen, wie der eingebettete IORequest nun gerade heißt...


Wenn Du mit einem spezifischen IORequest arbeitest, dann im Allgemeinen, weil Du dessen erweiterte Struktur benötigst. Dann mußt Du so oder so in die Dokumentation der Struktur schauen. Wenn Du allerdings nur den Basistyp brauchst, kann Du auch den Basistyp benutzen.

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

[ - Antworten - Zitieren - Direktlink - ]

28.06.2006, 17:09 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Holger:
Zitat:
Original von gni:
timerequest enthält am Anfang einen engebetteten IORequest und genau den übergibt man mittels &req->tr_node. Damit hat man ohne cast den richtigen Typ. In Amiga-Programmen wird viel zu oft mit Casts gearbeitet...

Amen.

Zitat:
Original von whose:
So kann man es natürlich auch machen. Mit dem Cast geht es auch, noch dazu für beinahe jedes Device gleich, ohne jedesmal in den Strukturen schauen zu müssen, wie der eingebettete IORequest nun gerade heißt...


Wenn Du mit einem spezifischen IORequest arbeitest, dann im Allgemeinen, weil Du dessen erweiterte Struktur benötigst. Dann mußt Du so oder so in die Dokumentation der Struktur schauen. Wenn Du allerdings nur den Basistyp brauchst, kann Du auch den Basistyp benutzen.


Hm, ich sehe schon, die Vertreter der "reinen Lehre" gewinnen die Oberhand ;) Nun ja, die Leser dieses Threads werdens lesen und hoffentlich auffassen. Ich sehe das ganze zwar leicht anders (IORequest vs. IOStdRequest (da gibts keine Warnings? :D ), völlig unterschiedliche Bezeichner etc.), aber um solche Sachen will ich keinen Streit auslösen.

Ich kann ja das Beispiel entsprechend ergänzen, kein Problem.

Grüße

--
---

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

[ - Antworten - Zitieren - Direktlink - ]

29.06.2006, 19:52 Uhr

gni
Posts: 1106
Nutzer
Zitat:
whose:
Hm, ich sehe schon, die Vertreter der "reinen Lehre" gewinnen die Oberhand ;) Nun ja, die Leser dieses Threads werdens lesen und hoffentlich auffassen. Ich sehe das ganze zwar leicht anders (IORequest vs. IOStdRequest (da gibts keine Warnings? :D ), völlig unterschiedliche Bezeichner etc.), aber um solche Sachen will ich keinen Streit auslösen.

Warum mußt Du jetzt mit "Birnen" anfangen? Wir haben über "Äpfel" geredet :-( Das diese beiden Strukturen nicht zueinander passen, sollte klar sein. Warum mußt Du andere fragen. Eventuell kann Olsen ja was dazu sagen.

[ - Antworten - Zitieren - Direktlink - ]

30.06.2006, 15:39 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von gni:
Zitat:
whose:
Hm, ich sehe schon, die Vertreter der "reinen Lehre" gewinnen die Oberhand ;) Nun ja, die Leser dieses Threads werdens lesen und hoffentlich auffassen. Ich sehe das ganze zwar leicht anders (IORequest vs. IOStdRequest (da gibts keine Warnings? :D ), völlig unterschiedliche Bezeichner etc.), aber um solche Sachen will ich keinen Streit auslösen.

Warum mußt Du jetzt mit "Birnen" anfangen? Wir haben über "Äpfel" geredet :-( Das diese beiden Strukturen nicht zueinander passen, sollte klar sein. Warum mußt Du andere fragen. Eventuell kann Olsen ja was dazu sagen.

Hm, da unterscheiden sich vermutlich unsere Sichtweisen, deswegen vielleicht... ich sehe das Ganze als "Benutzen eines AmigaOS-Devices auf dem empfohlenen Weg" und nicht als "wir übermitteln ohne jeglichen Bezug zum API die Adresse einer Struktur" (woher weiß man auf Anhieb, daß tr_node eine struct IORequest ist, wenn man länger nichts mit dem timer.device zu tun hatte?).

Bei allem Verständnis für "formal korrekte" Wege, es wird oft vergessen, daß viele Leute kein fotographisches Gedächtnis besitzen und manche Dinge schlicht vergessen werden (weil selten benötigt).

Die IO-Funktionen für Devices erwarten nun einmal den Zeiger auf eine Struktur vom Typ "IORequest", da kann ich nichts für.

Ich hätte vermutlich weniger Probleme mit Deiner Sichtweise, wenn Deine Vorgehensweise für alle Device-bezogenen Strukturen zutreffend wäre. Das ist sie aber nun mal nicht. Deswegen mein Vergleich von IORequest und IOStdRequest (spätestens da muß man ja so oder so wieder casten,um die Warnings loszuwerden. Da kann man das auch gleich konsequent tun, finde ich).

Möglicherweise ist das aber ein Punkt, den man nun (mit OS4 z.B.) ändern könnte. Einheitliche Typen und Bezeichner für die IORequests, Erweiterungen der Strukturen dahin, wo sie hingehören. Ans Ende der Device-spezifischen Struktur.

Wenn bei allen Devices mit Erweiterungen der IORequest-Struktur diese zu Beginn mit (device-Kürzel)_Node stehen würde, dann wäre das kein Thema. Man weiß, daß bei jedem Device zu Beginn der IO-Struktur ein IORequest mit dem Bezeichner bla_Node steht und gut.

So verwirrt es aber nur beim Lesen (wie gesagt, wer weiß schon, das tr_node eine struct IORequest ist? Man kanns "vermuten", weil es sich um eine Device-IO-Funktion handelt, aber "Vermuten" beim Lesen eines Programms? Ich weiß ja nicht...).

Meiner Meinung nach sinds einfach nur zwei verschiedene Sichtweisen des (mehr oder weniger) gleichen Vorgangs, die uns hier beschäftigen.

Du siehst es mehr aus der formalen (und keineswegs falschen) Sicht, ich mehr aus der Sicht des "Otto Normal"-Entwicklers, der eben nicht die Zeit und die Möglichkeiten hat, sich bis in alle Einzelheiten in ein API einzuarbeiten (nicht falscher als die formale Sicht, meiner Meinung nach).

Fallstricke in Sachen Cast gibt es genug, zweifellos, aber genauso gibt es Fallstricke in Sachen "nichtssagende Bezeichner". Ich glaube, das gleicht sich irgendwo aus.

Um es auf den Punkt zu bringen: Ich sehe ein, daß Du (im Hinblick aufs reichliche Casten) Recht hast. Nur bringt uns das nicht weiter und den Anfängern hilft es relativ wenig bei dem Versuch, AmigaOS zu verstehen und zu verwenden, wenn sie mit Formalien zugeworfen werden.

Was nicht heißen soll, daß erfahrene Leute wie Du nicht darauf aufmerksam machen dürfen, daß da einiges im Argen liegt. Ich bin mir sicher, daß das von den Mitlesenden aufgenommen und verwertet wird.

Nur meine 2 Cent...

Grüße

--
---

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



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

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

[ - Antworten - Zitieren - Direktlink - ]

06.12.2011, 19:34 Uhr

bruZard
Posts: 307
Nutzer
Sorry wenn ich diesen Zombie-Thread nochmal rauskrame, aber ich bekomme das mit dem Timer Device einfach nicht auf die Reihe. Könnte mal ein Fachmann den hier gezeigten "Uhren-Source" eindampfen und mir zeigen wie ich die vergangenen Millisekunden erhalte?

Ich habe versucht den hier gezeigten Source anzupassen, bin aber kläglich gescheitert. Der Overkill an Strukturen und Funktionsaufrufen ist einfach irre und für einen Windows-Programmierer kaum verständlich :look:
--
PanzerZ |
methusalem | basic

[ - Antworten - Zitieren - Direktlink - ]

06.12.2011, 21:03 Uhr

thomas
Posts: 7716
Nutzer
code:
#include <proto/timer.h>
#include <proto/dos.h>

int main (void)

{
struct timeval start;
struct timeval ende;
struct timeval diff;

GetSysTime (&start);

Delay (50);

GetSysTime (&ende);

diff = ende;
SubTime (&diff,&start);

Printf ("Startzeit: %10lu.%06lu\n",start.tv_secs,start.tv_micro);
Printf ("Endezeit:  %10lu.%06lu\n",ende.tv_secs,ende.tv_micro);
Printf ("Differenz: %10lu.%06lu\n",diff.tv_secs,diff.tv_micro);

return (0);
}


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

[ - Antworten - Zitieren - Direktlink - ]

06.12.2011, 22:07 Uhr

bruZard
Posts: 307
Nutzer
GetSysTime existiert im OS3.x NDK nicht
--
PanzerZ |
methusalem | basic

[ - Antworten - Zitieren - Direktlink - ]

06.12.2011, 22:15 Uhr

thomas
Posts: 7716
Nutzer
@bruZard:

Schau nochmal genau hin.

code:
timer.device/GetSysTime                               timer.device/GetSysTime

   NAME
	GetSysTime -- Get the system time. (V36)

   SYNOPSIS
	GetSysTime( Dest )
	            A0

	void GetSysTime( struct timeval * );

   FUNCTION
	Ask the system what time it is.  The system time starts off at
	zero at power on, but may be initialized via the TR_SETSYSTIME
	timer.device command.

	System time is monotonocally increasing and guarenteed to be
	unique (except when the system time is set back).

	A0 will be left unchanged.

	This function is less expensive to use than the TR_GETSYSTIME
	IORequest.

   INPUTS
	Dest -- pointer to a timeval structure to hold the system time.

   RESULTS
	Dest -- the timeval structure will contain the system time.

   NOTES
	This function may be called from interrupts.

   SEE ALSO
	timer.device/TR_GETSYSTIME,
	timer.device/TR_SETSYSTIME,

   BUGS



V36 ist OS 2.0.

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

[ - Antworten - Zitieren - Direktlink - ]

06.12.2011, 22:19 Uhr

bruZard
Posts: 307
Nutzer
Dann hakelt der m68k Crosscompiler, oder das AmiDevCpp Paket ist nicht vollständig. Der g++ meckert jedenfalls dass GetSysTime() weder deklariert noch definiert wurde.
Ich mache mich da mal schlau. Trotzdem vielen Dank für Deine Hilfe!

--
PanzerZ |
methusalem | basic

[ - Antworten - Zitieren - Direktlink - ]

07.12.2011, 11:40 Uhr

thomas
Posts: 7716
Nutzer
So geht's auch:

code:
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/timer.h>

struct Library *TimerBase;

int main (void)

{
struct MsgPort *port = CreateMsgPort();
if (port)
	{
	struct timerequest *timer = (struct timerequest *) CreateIORequest (port,sizeof(struct timerequest));
	if (timer)
		{
		if (0 == OpenDevice ("timer.device",UNIT_MICROHZ,(struct IORequest *)timer,0))
			{
			struct timeval start;
			struct timeval ende;
			struct timeval diff;

			TimerBase = (struct Library *) timer->tr_node.io_Device;

			timer->tr_node.io_Command = TR_GETSYSTIME;
			timer->tr_node.io_Flags   = IOF_QUICK;
			DoIO ((struct IORequest *)timer);
			start = timer->tr_time;

			Delay (50);

			timer->tr_node.io_Command = TR_GETSYSTIME;
			timer->tr_node.io_Flags   = IOF_QUICK;
			DoIO ((struct IORequest *)timer);
			ende = timer->tr_time;

			diff = ende;
			SubTime (&diff,&start);

			Printf ("Startzeit: %10lu.%06lu\n",start.tv_secs,start.tv_micro);
			Printf ("Endezeit:  %10lu.%06lu\n",ende.tv_secs,ende.tv_micro);
			Printf ("Differenz: %10lu.%06lu\n",diff.tv_secs,diff.tv_micro);

			CloseDevice ((struct IORequest *)timer);
			}
		DeleteIORequest ((struct IORequest *)timer);
		}
	DeleteMsgPort (port);
	}

return (0);
}


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

[ - Antworten - Zitieren - Direktlink - ]

07.12.2011, 16:38 Uhr

bruZard
Posts: 307
Nutzer
Hey, danke thomas. Ich schaue mir das mal an.
--
PanzerZ |
methusalem | basic

[ - Antworten - Zitieren - Direktlink - ]

07.12.2011, 16:44 Uhr

bruZard
Posts: 307
Nutzer
ok, einfach mal kompilieren ist nicht:

Zitat:
m68k-amigaos-g++ timer.cpp -O6 -o timer

timer.cpp:5: error: conflicting declaration 'Library*TimerBase' /usr/local/amiga/lib/gcc/m68k-amigaos/3.4.0/../../../../m68k-amigaos/sys-include/proto/timer.h:12: error: 'TimerBase' has a previous declaration as 'Device*TimerBase'
timer.cpp:5: error: type mismatch with previous external decl of 'Library*TimerBase' /usr/local/amiga/lib/gcc/m68k-amigaos/3.4.0/../../../../m68k-amigaos/sys-include/proto/timer.h:12: error: previous external decl of 'Device*TimerBase'
timer.cpp:5: error: declaration of 'Library*TimerBase' /usr/local/amiga/lib/gcc/m68k-amigaos/3.4.0/../../../../m68k-amigaos/sys-include/proto/timer.h:12: error: conflicts with previous declaration 'Device*TimerBase'

timer.cpp: In function 'int main()':
timer.cpp:22: error: cannot convert 'Library*' to 'Device*' in assignment
timer.cpp:51:2: warning: no newline at end of file


--
PanzerZ |
methusalem | basic

[ - Antworten - Zitieren - Direktlink - ]

07.12.2011, 16:57 Uhr

bruZard
Posts: 307
Nutzer
Wenn ich auf struct Device* TimerBase; umstelle läufts. Vielen Dank nochmal!
--
PanzerZ |
methusalem | basic

[ - Antworten - Zitieren - Direktlink - ]

07.12.2011, 20:30 Uhr

bruZard
Posts: 307
Nutzer
Ich bekomme jetzt Daten aber die scheinen nicht zu stimmen. 9FPS in einem Programm das fast nichts tut? Zudem geht der Wert alle naselang in den negativen Bereich obwohl die Variable als unsigned deklariert ist.

Ich brauche doch einfach nur eine Möglichkeit zu jedem Zeitpunkt die Millisekunden zu erhalten der seit System- oder Programmstart vergangen sind :(
--
PanzerZ |
methusalem | basic

[ - 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.
.