Datenübergabe zwischen zwei Threads
-
Nur dann, wennauch Nachrichten in der Queue waren...
-
junix schrieb:
Nur dann, wennauch Nachrichten in der Queue waren...
Ja eben! Und für jede Nachricht neu. Also steht entweder "nix" drin oder eben das Ergebnis aus dem temp.SubString(), wobei in temp doch die letzte Nachricht enthält.
Irgendwie erschließt sich mir grad der Sinn nicht wirklich!
-
Er will entweder die Nachricht oder "nix" drinne stehen haben. Wenn er jetzt die Datagramme überprüft wird das Ergbenis zunächst mit "nix" initialisiert. Geht dann aber alle datagramme durch. Wenn er den header findet, weist er diesen dem Ergebnis zu. Ansonsten kommt nix zurück.?
-
junix schrieb:
Er will entweder die Nachricht oder "nix" drinne stehen haben. Wenn er jetzt die Datagramme überprüft wird das Ergbenis zunächst mit "nix" initialisiert. Geht dann aber alle datagramme durch. Wenn er den header findet, weist er diesen dem Ergebnis zu. Ansonsten kommt nix zurück.?
Und wenn mehrere Header drin sind?
-
Dann scheint ihn offensichtlich nur der letzte Header zu interessieren... Nicht sauber aber machbar...?
-
So, jetzt muss ich mich auch mal wieder zu Wort melden:
Ich habe mal ein
Application->ProcessMessages();eingebaut, und siehe da, es wirkt tatsächlich Wunder! Auch wenn ich keine Ahnung habe warum...
Ich werde aber trotzdem den Tipp von junix realisieren, und eine threadsichere Klasse von der Queue ableiten. Schon allein wegen des Lerneffektes.
Vielen Dank erst mal
Winzler
-
Winzler schrieb:
und siehe da, es wirkt tatsächlich Wunder!
Na sag ich ja!

-
Jetzt habe ich versucht, eine threadsichere Queue zu erstellen.
So sieht die Definition aus:
class MessageQueue : private deque<MostMessage> { private: TCriticalSection* Sperre; public: MessageQueue(void); void push(MostMessage); MostMessage at(int i); void clear(void); int size(void); MessageQueue get(void); };Und so die Implementierung:
MessageQueue::MessageQueue(void) { Sperre = new TCriticalSection; } void MessageQueue::push(MostMessage message) { Sperre->Acquire(); push_back(message); Sperre->Release(); } MostMessage MessageQueue::at(int i) { Sperre->Acquire(); MostMessage erg = deque<MostMessage>::at(i); Sperre->Release(); return erg; } MessageQueue MessageQueue::get(void) { Sperre->Acquire(); MessageQueue erg; erg = *this; Sperre->Release(); return erg; } void MessageQueue::clear(void) { Sperre->Acquire(); deque<MostMessage>::clear(); Sperre->Release(); } int MessageQueue::size(void) { int erg; Sperre->Acquire(); erg = deque<MostMessage>::size(); Sperre->Release(); return erg; }Die so erstellte Queue zeigt allerdings nicht die gewünschte Wirkung. Ich habe auch schon versucht, TCriticalSection *Sperre global zu machen, also quasi so:
TCriticalSection *s; //globale Variable MessageQueue::MessageQueue(void) { Sperre = s; }Dann krieg ich folgende Warnung...
[Linker Warnung] Public symbol '_s' defined in both module C:\PROGRAMME\CBUILDER6\PROJECTS\DLLCALL.OBJ and C:\PROGRAMME\CBUILDER6\PROJECTS\MOST.OBJ
...und lauter Exceptions wenn ich mein Programm aufrufe.
Kann mir einer sagen, was ich da falsch mache? Wäre es möglich, die TCriticalSection static zu machen, damit sie für alle MessageQueues gilt?
-
Wozu brauchst du die Sperre Public machen? Sie dient ja nur dazu, deine klassen-Internen Ressourcen zu schützen.
Es reicht also völlig, die Sperre als privates Klassenelement zu implementieren. Die Einzigen die Aquire und Release aufrufen sind ja die Funktionen die auf die klasseninterne Liste zugreifen?
Was heisst "zeigt nicht die gewünschte Wirkung"?
-
Hast du im Übrigen irgendwelche Schleifenbildungen in deiner Hauptanwendung? Wie sieht die CPU-belastung aus?
-
"Nicht die gewünschte Wirkung" heisst, dass ich wieder Nachrichten in der Queue vermisse, die definitiv bereits empfangen wurden und die kurz darauf auch plötzlich da sind.
In meiner Hauptanwendung gibts keine Schleifen. Meine Hauptanwendung ist lediglich ein Fenster mit Buttons, mit denen verschiedene Nachrichten verschickt werden können, deren Antwort dann ausgewertet wird.
Die CPU-Belastung schwankt so zwischen 5 und 10 Prozent.
-
Wartet die Hauptanwendung auf irgendwas? Z.b. die Antwort?