3 Stimmen

C# COM Cross Thread

Wir entwickeln eine software zur steuerung eines wissenschaftlichen messgeräts. sie bietet eine COM-schnittstelle, die verschiedene funktionen zur einstellung von messparametern definiert und ein ereignis auslöst, wenn sie daten gemessen hat.

Um unsere Software zu testen, implementiere ich eine Simulation dieses Geräts.

das com-objekt führt eine schleife aus, die periodisch das ereignis auslöst. eine weitere schleife in der client-app sollte nun den com-simulator mit den angegebenen funktionen einrichten.

Ich habe eine Klasse für Messparameter erstellt, die beim Einrichten einer neuen Messung instanziiert wird.

// COM-Object
public class MeasurementParams
{
    public double Param1;
    public double Param2;
}

public class COM_Sim : ICOMDevice
{
    public MeasurementParams newMeasurement;
    IClient client;

    public int NewMeasurement()
    {
        newMeasurment = new MeasurementParam();
    }

    public int SetParam1(double val)
    {
        // why is newMeasurement null when method is called from client loop
        newMeasurement.Param1 = val;
    }

    void loop()
    {
        while(true)
        {
            // fire event
            client.HandleEvent;
        }
    }
}

public class Client : IClient
{
    ICOMDevice server;

    public int HandleEvent()
    {
        // handle this event
        server.NewMeasurement();
        server.SetParam1(0.0);
    }

    void loop()
    {
        while(true)
        {
            // do some stuff...
            server.NewMeasurement();
            server.SetParam1(0.0);
        }
    }
}

beide Schleifen laufen in unabhängigen Threads. wenn server.NewMeasurement() aufgerufen wird, wird das Objekt auf dem Server auf eine neue Instanz gesetzt. aber in der nächsten Funktion ist das Objekt wieder null. tun das gleiche bei der Behandlung der Server-Ereignis, es funktioniert perfekt, weil die Methode in der Server-Thread läuft. wie man es von Client-Thread als auch arbeiten.

Da der Client mit dem echten Gerät arbeiten soll, kann ich die vom Hersteller vorgegebenen Schnittstellen nicht ändern. Außerdem muss ich Messungen unabhängig vom Event-Handler einrichten, der nicht regelmäßig ausgelöst wird.

Ich nehme an, dass dieses Problem mit dem Multithreaded-COM-Verhalten zusammenhängt, aber ich habe nichts zu diesem Thema gefunden.

1voto

JSBձոգչ Punkte 39615

In dem Code, den Sie gepostet haben, COM_Sim.client wird nie zugewiesen. Fehlt da etwas? Es ist schwer, eine Diagnose zu stellen, ohne zu sehen, wie die Objekte zugewiesen werden.

Zusätzlich: Sie haben derzeit newMeasurement deklariert als ein öffentliches Feld in COM_Sim mais newMeasurment (mit anderer Schreibweise) innerhalb der Methode. So wie er geschrieben ist, lässt sich dieser Code nicht kompilieren. Es ist möglich, dass ein ähnlicher Tippfehler in Ihrer eigentlichen Methode vorhanden ist, der dazu führt, dass Sie einem anderen Objekt zuweisen als dem, das Sie in NewMeasurement .

1voto

Franci Penov Punkte 73239

Welches ist das Threading-Modell des Clients und des Servers - STA oder MTA? (Zum Vergleich: STA sind Single-Thread-Com-Objekte, die den Zugriff auf ihre öffentlichen Methoden jeweils nur von einem Thread aus erlauben, während MTA Multi-Thread-Objekte sind, die den gleichzeitigen Zugriff auf ihre öffentlichen Methoden von mehreren Threads aus erlauben)

Wie viele Instanzen haben Sie von jeder von ihnen und wie erstellen Sie diese? Ich vermute, Sie wollen nur eine, aber stattdessen haben Sie mehrere.

Wie viele Threads haben Sie und welche Methode läuft auf welchem Thread? Wie erstellen Sie diese Threads und sind sie für die Ausführung von STA-Objekten oder MTA initialisiert?

Anmerkung: .NET ist intelligent genug, um zu erkennen, ob sowohl der Client als auch der Server verwaltet werden, und wird COM aus dem Bild nehmen. Ihre Simulation läuft also mit reinem verwaltetem Code. Wenn Sie einen richtigen Test-Client wollen, müssen Sie ihn in C++ schreiben (da ich vermute, dass Ihr Geräte-Controller nicht verwalteter Code ist).

Referenzdokumentation über COM-Threading-Modelle:

Verstehen und Verwenden von COM-Threading-Modellen
Prozesse, Threads und Anwendungen
Einführung in COM Interop

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X