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.