vorgehensweise: inputverarbeitung mit message queue
-
hallo...
ich mach mir grad nen plan wie ich ne eigene message loop bastel in meinem 32bit code im pmode.
folgender vorschlag von mir, ich bräuchte dann eure meinung :ich erstell zunächst ne idt mit interrupthandler für die tastatur.
wird also eine taste gedrückt spring er in die funktion und übersetzt erstmal den scancode in ascii, danach bastelt er sich selber ne kleine msg-struct und legt die eigenständig auf einen sog. msg-stack. mit iret verlässt er den int und macht mitm code weiter. dieser code bastelt sich auch ne msg-struct die gleich aufgebaut ist und holt sich die aktuelle msg die aufm msgstack liegt über ne unterfunktion Getmessage (so windows mäßig). Das ganze ist dann in so einer art schleife drin, also er guckt die ganze zeit aufm msg-stack und vergleicht. dieser msg stack hat ne feste startadresse und wird immer erhöt sobald ein hardware interrupt kommt. damit es zu keinen overflow kommt, muss der pointer nach jeder Getmessage verarbeitung wieder in den ausgangszustand gebracht werden.
ähnlich wie unter SDL kann ich dann so ungefähr die messages verarbeiten:struct message msg;
while(run == 1)
{
Getmessage(&msg);
switch(message)
case:
..
case:
..draw sprites
draw text
}Getmessage sorgt dafür dass der pointer immer am anfang bleibt.
ich weiss nur nicht ob ich die message queue auf eine feste adresse legen soll, oder ob ich dass aufm stack machen soll oder oder..
meinung ?
dann hät ich noch ne zusatzfrage:
wie kann ich bei der tastatur abfragen, ob ne taste gedrückt worden ist oder losgelassen worden ist... (per in/out)? die os devs bin ich schon durch, kein plan..mfg
haMMer
-
Hi.
Da du ja im PMode bist und evtl auch Multitasking betreiben willst, würde ich für jeden Task eine eigene MessageQueue einrichten.
Wenn dann die Funktion GetMessage aufgrufen wird, muß geprüft werden ob eine Nachricht vorhanden ist. Ist das nicht der Fall, dann muss der Thread pausiert werden.
Sobald dann eine Message an den thread geschickt wird, muss dieser wieder aufgeweckt werden, damit er die Message abholt und mit seiner Arbeit fortfährt.
So ähnlich zumindest verfährt Windows.
Daher beendet die WinAPI-Funktion GetMessage ja auch erst, wenn eine nachricht eingetroffen ist.Ob eine taste losgelassen wurde oder gedrückt wurde, kannst du anhand eines Bits feststellen das gesetzt wird. Welches das genau ist kann ich dir aber nicht sagen. Musst mal googeln
-
also vorerst will ich erst ne einfache loop hinbekommen, die auch funktioniert.
wenn mal alles geht und ich einen zweiten thread nebenher laufen lassen will, dann bastel ichs wieder bisle um
der kernel is zunächst nur ein befehlsinterpreter, aus dem heraus per eingabe andere routinen gestartet werden, er aber dann unterbrochen wird.
d.h. in dem moment übernimmt die 2te routine die GetMessage() Aufgabe.im falle des multitaskings würd ichs dann wirklich so machen, dass jede message eine art lieferadresse bekommt (handle) , mit dem der thread identifiziert werden kann.
Unter Windows machen die es ja mit ner Callback funktion, wo dann am ende noch mit DefWindowProc() sichergestellt wird, dass alle msgs verarbeitet werden.