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?!


Anmelden zum Antworten