Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.02.2010, 21:29

OIS und Multithreading

Ich wollte mal fragen ob sich jmd mit OIS(DirectInput) und Multithreading auskennt.
OIS braucht ja das HWND von dem erstellten Window und das Window müsste auch in dem Thread von OIS erstellt werden, damit man die MessagePump nutzen kann.
Nun kommt es aber zu dem Problem, das mein Renderthread ja auch mal auf das Window zugreiffen muss, das Problem entsteht dann wenn man das Fenster z.B. resizen lässt, dann macht es nämlich boom.

Naja nun war ich auf die Idee gekommen, 2 Windows zu nutzen, eins für das Input und das andere zum Rendern, hätte jmd eine Idee wie ich das realisieren kann? So das man auch nicht mit bekommt das es noch ein extra Window für den Input gibt?
Bin leider totaler Winapi Anfänger, Ogre hat das erstellen ja vorher alles übernommen.

Mit freundlichen Grüßen
Zero

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

2

14.02.2010, 22:24

Gut, ich denke das Problem hatte prinzipiell jeder schonmal mit den Threads.

Die Antwort nennt sich: Queues & Triggers.

Bei Funktionen wie Resize wo du kein Feedback benötigst, baust du dir einfach eine One-Way-Queue, die den Hauptthread triggert und das Resize dort ausführt.

Bei Funktionen wie GetClientSize o.ä. nimmst du nen Trigger, sprich Event unter Windows, pthread_cond bei Linux/Mac/iPhone, übergibst den Pointer dafür sowie Platz für die Antwort ebenfalls in der Queue und lässt den Hauptthread dort die Ergebnisse (Größe in dem Fall) reinfüllen und anschließend das Teil triggern, so dass der Parallel-Thread solange wartet, bis er den Wert hat.

Letzteres zerstört natürlich den Vorteil von Multithreading, aber ich gehe mal nicht davon aus, dass du 20mal die Sekunde die ClientSize abfragst, von daher ist das eigentliche eine der üblichsten Lösungen dafür.
Spätestens wenn das Fenster-System in einer anderen Sprache ist wie der Engine... wie vor allem bei Objective C (Mac) oder Android der Fall, geht an solchen Queues als Feedback-Kanal eh kein weg mehr vorbei, von daher kanns generell nicht schaden darauf aufzubauen.

LG
Alyx

3

16.02.2010, 20:02

Danke für deine Antwort, bei der hätte ich aber das ganze OgreRenderwindow auseinander pflücken müssen, nicht so meine Idee^^

Naja habe jetzt ne andere Lösung gefunden^^
Erstelle im Renderthread halt normal das RenderWindow und im InputThread das "InputWindow".
Dieses mache ich dann durchsichtig und hänge es als Child an das RenderWindow und dann klappt das alles :D:D

Zero

Werbeanzeige