Software > Coding
Nicht blockierendes evnt_multi
m0n0:
Ich musste das einfach mal probieren, denn - soweit ich weiss ist der kleinste timeout wert bei einem evnt_multi 20ms ( jedenfalls ist es das bei evnt_timer laut Profibuch für den ST).
Es geht ganz einfach... vor dem aufruf zu event_multi einfach ein appl_write mit einer "Benutzerdefinierten" Nachricht schicken, schon kehrt evnt_multi sofort zurück.
pseudo C code:
--- Code: --- /* Definition einer Nachricht, 80 ist der groesste von GEM genutzt Wert..., also sollte es ok sein 100 fuer eigene zwecke zu nutzen, wer's wissen will, muss im Kompendium schauen :) */
#define WM_USER_1 100
int app_id;
WORD mymsg[8]; /*8 WORDS = 16 bytes)
app_id = appl_init();
...
mymsg[0] = app_id;
mymsg[1] = WM_USER_1;
mymsg[2] = 0; /* keine ueberlaenge */
while( !quit)
{
appl_write( app_id, 16, &mymsg);
evnt_mult( ... ) ; /* kehrt sofort zurueck, EVNT_TIMER muss nicht angegeben werden, jedoch MU_MESG */
}
--- Ende Code ---
Es ist natürlich so, das diese Methode zur höchstmöglichen Prozessorauslastung führt solange der Prozess noch nicht vom Prozessmanager "pausiert" wurde. Ich weiss nicht genau wie relevant das auf den Multi-Tasking OS beim Atari ist... bei Windows würde diese Verfahren, sofern evnt_multi in einer endlos-schleife aufgerufen wird zu 100% prozessorauslastung führen. Aber ich glaube auf dem Atari ist das nicht ganz so schlimm, evnt_multi mit dem normalen timeout wird ja auch irgendwas in der zwischezeit machen, bevor der timeout auftritt...
Tortzdem sollte man den Prozess schlafen legen - , auf dem FreeMint system geht das mit z.B: usleep( 5*1000); für 5 ms.
Wofür man das braucht... ? Wenn man wirklich nur sehr kleine Delays haben will, bevor ein Event ausgewertet wird.
Ich zumindest finde es gut zu wissen...
Gruß,...
Arthur:
Ist OT aber evtl. hast Du meine PN (NVRAM) nicht bekommen? Dann scheint es im Forum auch bei den PN's nicht so recht zu klappen und hängt evtl. auch hiermit zusammen.
m0n0:
doch, PN ist jetzt beantwortet ::)
gstoll:
Leer
m0n0:
--- Zitat ---Könntest Du mal ein Beispiel nennen? Ich versteh i.M. nicht was Du meinst.
--- Ende Zitat ---
Hallo!
Also, ich könnte es mir bei Spielen Sinnvoll vorstellen.
Normalerweise wuerde ein Aufruf von evnt_multi() maximal 20ms dauern... auch wenn man ein timeout von 5 ms gesetzt hat ( wie gesagt, Profi Buch sagt der GEM timer hat eine Auflösung von 20ms ). Wenn man Glück hat, kehrt die Funktion vorher zurueck, weil ein Event Anliegt.
Sinnvoll koennte ich es mir bei Spielen vorstellen, in der man z.b. keine Zeit mit Nichts-tun verschwenden will. (Evt. koennte man z.B, ein Animations-Frame mehr in dieser Zeit berechnen? )
Eine anderes Beispiel wäre das Abrufen von Netzwerk-Daten... eine Netzwerkkarte kann ja durchaus sehr schnell Daten liefern - ich weiss nicht ob diese Beführchtung richtig ist, aber ich könnte mir vorstellen das ein Buffer innerhalb eines Netzwerk-Stacks durchaus in 20ms voll-laufen kann, wenn man aber die Daten innerhalb der 20 ms auslesen kann, geht nichts verloren... bzw. der Netzwerkstack muss keine Daten ablehnen.
Beispiele genug ? =)
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln