我們正在開發一個軟件來控制一個科學的測量設備。它提供了一個COM-Interface定義了幾個功能來設置測量參數並在測量數據時觸發一個事件。C#COM跨線程
爲了測試我們的軟件,我正在實現該設備的模擬。
com對象運行一個定期觸發事件的循環。客戶端應用程序中的另一個循環現在應該使用給定的函數來設置com模擬器。
我創建了一個測量參數的類,它將在設置新測量時實例化。
// 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);
}
}
}
這兩個循環都在獨立線程中運行。當server.NewMeasurement()被調用時,服務器上的對象被設置爲一個新的實例。但在下一個函數中,該對象再次爲空。在處理服務器事件時做同樣的事情,它完美地工作,因爲方法在服務器線程中運行。如何使它從客戶端線程工作。
由於客戶端旨在與真實設備一起工作,因此我無法修改製造商提供的接口。我還需要設置獨立於事件處理程序的度量,該度量將不會定期觸發。
我認爲這個問題與多線程COM行爲有關,但是我沒有在這個主題上發現任何東西。
感謝。我錯過了明確地將服務器環路設置爲MTA。 – user364676 2010-06-11 16:40:35
當然你想這樣做?你的代碼不是線程安全的。 – 2010-06-11 16:44:04