Seite 1 von 1

Konsole thread-safe machen

Verfasst: 31.05.2009, 15:37
von BlueShark
Moin moin,
ich programmiere momentan an einer Konsole, die ich für meine Projekte verwenden will. Diese will ich nun thread-safe machen und bräuchte dabei Hilfe.

Ich habe die Konsole so geschrieben, dass es möglich ist die Ausgabe in eine Datei, ein Fenster oder sonst irgendwas zu schreiben. Im Endeffekt bekommt man einfach einen Verweis auf den Schreibpuffer der Konsole. Nun will ich jedoch in der Lage sein, dass man von überall in die Konsole schreiben soll. Also hab ich eine Basisklasse geschrieben, von der es nur eine Instanz geben darf. Nun gibt es eine "ConsoleObject" Klasse, der man einen Zeiger auf die Basisklasse übergibt. Danach schiebt man einfach munter Daten in dieses "ConsoleObject".

Intern läuft dabei folgendes ab : Das Objekt vom Typ "ConsoleObject" holt sich bei der Basisklasse einen Puffer, in den geschrieben wird. Ist dieser voll wird der Basisklasse gesagt, dass der Puffer voll ist und ein neuer leerer Puffer wird zurückgegeben.

Nun bin ich mir jedoch nicht sicher, wie ich das vernünftig umsetzten kann. Soll ich der Basisklasse nen Mutex verpassen und die einzelnen "ConsoleObject"-Objekte jedes Mal in einer Endlosschleife probieren lassen den Mutex zu locken? Oder gibt es eine bessere Möglichkeit wie ich diese Konsole umsetzen kann.

Mfg
BS

Re: Konsole thread-safe machen

Verfasst: 31.05.2009, 16:13
von Lord Delvin
Du könntest auch einfach MessageQueues aufmachen mit denen du dan Nachrichten an die Konsole schickst und die Konsole holt sich die Nachrichten und schreibt sie dann selbständig irgendwohin. Dann müsstest du die Konsole in einem neuen Thread laufen lassen, aber mehr threads ist ja ne ganze weile eher nützlich.

Ansonsten würde ich ein Lock um den Schreibpuffer der Konsole machen.
Gruß

Re: Konsole thread-safe machen

Verfasst: 31.05.2009, 17:26
von BlueShark
Klingt vernünftig. Gibt es da ein paar hilfreiche Funktionen von ner API oder muss ich das ganze selbst zusammenbasteln? Oder anders gesagt, sollte ich so etwas mit wxWidgets coden oder mich besser auf ein OS beschränken? Immerhin will ich nicht, dass die Konsole zu viel Performance frisst.

Mfg
BS

Re: Konsole thread-safe machen

Verfasst: 31.05.2009, 19:16
von Biolunar
Was für Funktionen brauchst du denn? Eine Messagequeue ließe sich z.B. einfach mit std::queue implementieren.

Re: Konsole thread-safe machen

Verfasst: 31.05.2009, 19:51
von Jörg
Wenn Du dich auf Windows beschraenkst, dann schau dir mal PostThreadMessage und GetMessage an. Mehr brauchst Du dann nicht. std::queue ist nicht thread-safe, dass muesstest du dann aussenrum basteln.

Re: Konsole thread-safe machen

Verfasst: 02.06.2009, 11:38
von BlueShark
OK, ich weiß nun, wie ich meine Konsole umsetzen werde. Ich benutze übrigens "pthreads", die gefallen mir irgendwie besser als das WinAPI-Zeugs, keine Ahnung warum eigentlich. Nun bin ich jedoch echt am grübeln, ob ich meine Konsole in einem extra Prozess oder in einem Thread auslagern soll? Vielleicht hat ja jemand nen Hinweis oder nee kleine Hilfestellung diesbezüglich? Wenn ich das in einem Thread auslagern würde, werde ich um das Objekt meiner Basisklasse einfach nen Mutex legen. Sollte ich das aber in einem extra Prozess auslagern, würde ich nen MessageQueue verwenden.

Mfg
Harry

Re: Konsole thread-safe machen

Verfasst: 02.06.2009, 15:13
von kimmi
Du könntest für so etwas auch auf ACE-Library zurückgreifen. Die bieten entsprechende Hilfsmittel an und du mußt dich nicht um die jeweilige API kümmern. Gerade für solche Zwecke habe ich ganz gute Erfahrungen mit ACE machen können. Damit kannst du deine Console dann auch prozessübergreifend absichern, wenn du das willst bzw. mußt.

Gruß Kimmi