Ich bekomme folgende Fehlermeldung:<br>
'Eine Schnittstelle, die fuer einen anderen Thread marshalled war, wurde von der Anwendung aufgerufen.'<br>
Ich werde mal versuchen, den Programmaufbau zu erklaeren:<br>
Meine Anwendung hat einen TCP/IP-Socket, der von einer Javaanwendung eines Kollegen angesprochen wird. Fuer jede Verbindung wird in meiner Applikation eine Instanz der selbstgebauten Klasse TSession erzeugt. Jede Session wiederum baut eine DCOM-Verbingung zu einer weiteren Applikation auf, die letztendlich die eigentliche Arbeit verrichten soll. Jede Session erzeugt also eine private Instanz dieses COM-Servers. Es sollen aber mehrere Anfragen der Java-Applikation gleichzeitig verarbeitet werden koennen. Dazu habe ich die Methode TSession.Process gebaut. Diese Methode erzeugt einen eigenen Thread und fuehrt ihn aus. Hier der Code:<pre>
procedure TSession.Process(...)
begin
{...}
Thread := TSessionThread.Create(true);
Thread.OnTerminate := OnThreadTerminated;
Thread.OnExecute := OnExecuteThread;
Thread.Resume;
end;
</pre>
Die Methode TThread.Execute wiederum ruft eine Ereignisroutine auf, die TSession ueberschrieben hat. Die Methode CoInitialize wird dabei ebenfalls aufgerufen. Der Code von TThread.Execute sieht so aus:<pre>
procedure TSessionThread.Execute;
OleCheck(CoInitialize(nil));
FThreadId := GetCurrentThreadId;
try
if Assigned(FOnExecute) then FOnExecute(Self);
finally
CoUnInitialize;
end;
end;
</pre>
Es wird also zu einer Methode von TSession gesprungen. Dort wird dann eine COM-Eigenschaft der privaten DCOM-Anwendung gelesen. Dabei tritt dann die oben erwaehnte Fehlermeldung auf. Wenn ich diese Eigenschaft direkt vom einer Methode von TSession aufrufe (also nicht den Umweg ueber den Thread gehe), gibt es keine Probleme.<br>
Ich hoffe, dass ich den Programmaufbau einigermassen verstaendlich erlautern konnte.<br>
Gibt es jemanden, der dieses Problem nachvollziehen konnte und auch noch eine Loesung kennt?
'Eine Schnittstelle, die fuer einen anderen Thread marshalled war, wurde von der Anwendung aufgerufen.'<br>
Ich werde mal versuchen, den Programmaufbau zu erklaeren:<br>
Meine Anwendung hat einen TCP/IP-Socket, der von einer Javaanwendung eines Kollegen angesprochen wird. Fuer jede Verbindung wird in meiner Applikation eine Instanz der selbstgebauten Klasse TSession erzeugt. Jede Session wiederum baut eine DCOM-Verbingung zu einer weiteren Applikation auf, die letztendlich die eigentliche Arbeit verrichten soll. Jede Session erzeugt also eine private Instanz dieses COM-Servers. Es sollen aber mehrere Anfragen der Java-Applikation gleichzeitig verarbeitet werden koennen. Dazu habe ich die Methode TSession.Process gebaut. Diese Methode erzeugt einen eigenen Thread und fuehrt ihn aus. Hier der Code:<pre>
procedure TSession.Process(...)
begin
{...}
Thread := TSessionThread.Create(true);
Thread.OnTerminate := OnThreadTerminated;
Thread.OnExecute := OnExecuteThread;
Thread.Resume;
end;
</pre>
Die Methode TThread.Execute wiederum ruft eine Ereignisroutine auf, die TSession ueberschrieben hat. Die Methode CoInitialize wird dabei ebenfalls aufgerufen. Der Code von TThread.Execute sieht so aus:<pre>
procedure TSessionThread.Execute;
OleCheck(CoInitialize(nil));
FThreadId := GetCurrentThreadId;
try
if Assigned(FOnExecute) then FOnExecute(Self);
finally
CoUnInitialize;
end;
end;
</pre>
Es wird also zu einer Methode von TSession gesprungen. Dort wird dann eine COM-Eigenschaft der privaten DCOM-Anwendung gelesen. Dabei tritt dann die oben erwaehnte Fehlermeldung auf. Wenn ich diese Eigenschaft direkt vom einer Methode von TSession aufrufe (also nicht den Umweg ueber den Thread gehe), gibt es keine Probleme.<br>
Ich hoffe, dass ich den Programmaufbau einigermassen verstaendlich erlautern konnte.<br>
Gibt es jemanden, der dieses Problem nachvollziehen konnte und auch noch eine Loesung kennt?
Comment