Problem mit einer Queue
-
Hi!
In meiner Win-Form-Anwendung verschicke bei einem Klick auf einen Button Daten über eine Queue an einen Thread.// Thread: Befehle an COM-Port senden public: void BefehleSenden(){ try{ Object^ befehle = QueueBefehleSchicken->Dequeue(); MessageBox::Show("Queue: " + befehle); // _serialPort.Write(befehle, 0, 6); } catch(System::InvalidOperationException^ e){ MessageBox::Show("Die Queue ist leer!", e->GetType()->Name); } }
Beim Ausführen kommt dann folgende Fehlermeldung für Zeile 5:
Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in Form1.exe aufgetreten. Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
Kann mir dabei jemand helfen, ich komme mit der Fehlermeldung nicht zurecht.
Gruß
-
Vermutlich ist "QueueBefehleSchicken" null!?
Auch solltest Du das ganze natürlich durch einen Mutex/Lock sichern!
-
Upps verdammt, ich habe in meinem Code
QueueBefehleSchicken = gcnew Queue;
vergessen. Peinlich, peinlich...
Aber gut, dass Du mich an das Mutex erinnert hast! Werde ich auf jeden Fall noch einbauen! Danke!
-
Bzgl. Monitor (nicht Mutex!)/Lock: Da kannst Du
#include <msclr\lock.h>
einbinden und dies dann einfach mittels:
{ msclr::lock(syncObj); // Ab hier ist es nun synchronisiert: }
verwenden.
-
Danke für den Hinweis!
Ich habe aber vorher leider noch ein anderes kleines Problemchen. In die Queue wird so etwas geschrieben:
array<Byte>^befehlsbuffer = {7, 2, 0, 3, 4, 5}; QueueBefehleSchicken->Enqueue(befehlsbuffer);
Und auf der anderen Seite der Queue kommt so etwas raus:
Object^ befehle = QueueBefehleSchicken->Dequeue();
Da habe ich jetzt das Problem, dass aus meinem " array<Byte>^ " ein " Object^ " gemacht wird... (anders geht das wohl bei einer Queue nicht) Und ich habe es nicht hingekommen aus dem "Object^ befehle" die vorher definierten Werte einzeln wieder auszulesen.
-
Einfach casten... oder am besten eine Typ-Sichere Queue verwenden:
System::Collections::Generics::Queue<array<Byte>^> ^queue;
dann bekommst Du auch immer ein array<Byte>^ raus!
-
Nochmal 1000 Dank! Wusste gar nicht, dass es solche Queues gibt.
Was würde ich nur ohne Deine Hilfe machen?!