Hallo;<br>
<br>
das Problem beschreibt sich wie folgt:<br>
<br>
Multi- Threading- System, Datenaustausch sowie Methoden aufrufe erfolgen <br>
über: PostThreadMessage, Parameter sind die Thread ID des MessageThread<br>
die MessageID und ein Pointer auf die Daten(wParam).<br>
Datenaustausch und InterProcesskomunikation erfolgen einzig und allein <br>
über das PostThreadMessage. Gut.<br>
Eine Modul DLL enthält eine Ocx-Componente die auf einem Formular<br>
ist. Dynamisches erstellen und ansprechen der Methoden funktioniert.<br>
jedoch! werden die Signale der Komponente an meinen Messagethread gesendet,<br>
ergo empfängt die komponente nicht Signale auf die ich dort warte.<br>
Ich habe heraus gefunden, dass wenn ich die komponente anders aufrufe beim erstellen<br>
funktioniert alles wunderbar.<br>
Nun mal ein PseudoCode Beispiel um das ganze zu veranschaulichen:<br>
AA Ablauf so das nur Methoden aufrufe Funktionieren<br>
(also eigentlich der Falsche )<br>
zu erst:<br>
ProgStart<br>
MessageThreadID=Init(MessageThread);//ist ein Thread-Object mehr dazu später<br>
Ende ProgStart<br>
<br>
dann passiert:<br>
Useraktion//Bewirkt die Initialisierung des Forms mit OCX drauf )<br>
Erstelle DatenPaket(DP_Pointer);<br>
PostThreadMessage(MessageThreadID,MSGId,DP_Pointer ,0);<br>
ende UserAktion<br>
<br>
darauf folgt:<br>
MessageThread//Execute Methode<br>
FnkCall:ProcedurePointer;<br>
while not(terminated)<br>
if GetMessage(mMSG,0,0,0) then<br>
begin<br>
FnkCall:=selectEmpfägerBy_MSGId(mMSG);<br>
if Assigned() then<br>
FnkCall(mMsg);<br>
end;<br>
end;<br>
end MessageThread<br>
<br>
Dann erfolgt:<br>
MessageVerArbeiter<br>
mMsgID:=extractMSGId(mMSG);<br>
Daten:=extractData(mMSG);<br>
case mMSGID of<br>
OCX_DLL_MTH: dllPerform(Daten);//Ruft eine Methode innerhalb der DLL <br>
auf.<br>
end;<br>
ENDE MessageVerArbeiter<br>
<br>
Ist der Ablauf so wie beschrieben erreichen dem MessageThread alle<br>
Events der OCX-Komponente.<br>
<br>
(EventProceduren wurde mit ObjectInspector zu geordnet)<br>
<br>
Wenn ich den Ablauf so belasse und nur den Block (USERAKTION)<br>
wie folgt ändere:<br>
Useraktion<br>
Erstelle DatenPaket(DP_Pointer);<br>
if OCX_DLL_MTH then<br>
dllPerform. . .<br>
else<br>
PostThreadMessage(MessageThreadID,MSGId,DP_Pointer ,0);<br>
ende UserAktion<br>
<br>
Und so geht es, die OCX Sendet mir keine events mehr zum MessageThread<br>
sondert kümmert sich selbst um deren verarbeitung.(WM_Paint etc.)<br>
Zu guter letzt erreichen mich auch die events auf die ich innerhalb der <br>
Komponente Warte.<br>
<br>
//Kurz zur DLL<br>
<br>
InitCall<br>
Create TForm mit dem OCX;<br>
merken des TForms;<br>
ende InitCall<br>
<br>
//Das TFORM<br>
<br>
:<br>
:<br>
TMainf=class(TForm)<br>
IOCX:OCX_COMPO; <br>
procedure MessageEgal;<br>
public<br>
:<br>
privat<br>
:<br>
etc.<br>
end;<br>
implement<br>
procedure MessageEgal<br>
begin<br>
ShowMessage;<br>
end;<br>
<br>
<br>
Wie gesagt alles Funktioniert prima, bis darauf das mein MessageThread <br>
nach unverändertem ablauf nachrichten erhält mit denen er nix anfangen kann.<br>
Bei manipulierten ablauf erhält sie der der damit auch umgehen kann,<br>
keine ahnung wer das ist )<br>
<br>
Zu gegeben lässt sich das Problem sehr schwer beschreiben aber dennoch:<br>
wäre ich für ansätze sehr dankbar.<br>
Achso: Alles was die DLL zurückgeben darf sind nur Funktionsrückgabe- Werte
(WORD)<br>
<br>
und Daten der abgefragten events.(keine Pointer auf TForms oder was auch <br>
immer) da die dll autonom sein soll und jederzeit ersetzbar ohne Prog.- <br>
Abläufe des Hauptprogrammes zu ändern.<br>
so falls ich eine antwort vor morgen 8:00 uhr erhale info bitte an:<br>
[email protected]<br>
<br>
Vielen DANK!<br>
<br>
das Problem beschreibt sich wie folgt:<br>
<br>
Multi- Threading- System, Datenaustausch sowie Methoden aufrufe erfolgen <br>
über: PostThreadMessage, Parameter sind die Thread ID des MessageThread<br>
die MessageID und ein Pointer auf die Daten(wParam).<br>
Datenaustausch und InterProcesskomunikation erfolgen einzig und allein <br>
über das PostThreadMessage. Gut.<br>
Eine Modul DLL enthält eine Ocx-Componente die auf einem Formular<br>
ist. Dynamisches erstellen und ansprechen der Methoden funktioniert.<br>
jedoch! werden die Signale der Komponente an meinen Messagethread gesendet,<br>
ergo empfängt die komponente nicht Signale auf die ich dort warte.<br>
Ich habe heraus gefunden, dass wenn ich die komponente anders aufrufe beim erstellen<br>
funktioniert alles wunderbar.<br>
Nun mal ein PseudoCode Beispiel um das ganze zu veranschaulichen:<br>
AA Ablauf so das nur Methoden aufrufe Funktionieren<br>
(also eigentlich der Falsche )<br>
zu erst:<br>
ProgStart<br>
MessageThreadID=Init(MessageThread);//ist ein Thread-Object mehr dazu später<br>
Ende ProgStart<br>
<br>
dann passiert:<br>
Useraktion//Bewirkt die Initialisierung des Forms mit OCX drauf )<br>
Erstelle DatenPaket(DP_Pointer);<br>
PostThreadMessage(MessageThreadID,MSGId,DP_Pointer ,0);<br>
ende UserAktion<br>
<br>
darauf folgt:<br>
MessageThread//Execute Methode<br>
FnkCall:ProcedurePointer;<br>
while not(terminated)<br>
if GetMessage(mMSG,0,0,0) then<br>
begin<br>
FnkCall:=selectEmpfägerBy_MSGId(mMSG);<br>
if Assigned() then<br>
FnkCall(mMsg);<br>
end;<br>
end;<br>
end MessageThread<br>
<br>
Dann erfolgt:<br>
MessageVerArbeiter<br>
mMsgID:=extractMSGId(mMSG);<br>
Daten:=extractData(mMSG);<br>
case mMSGID of<br>
OCX_DLL_MTH: dllPerform(Daten);//Ruft eine Methode innerhalb der DLL <br>
auf.<br>
end;<br>
ENDE MessageVerArbeiter<br>
<br>
Ist der Ablauf so wie beschrieben erreichen dem MessageThread alle<br>
Events der OCX-Komponente.<br>
<br>
(EventProceduren wurde mit ObjectInspector zu geordnet)<br>
<br>
Wenn ich den Ablauf so belasse und nur den Block (USERAKTION)<br>
wie folgt ändere:<br>
Useraktion<br>
Erstelle DatenPaket(DP_Pointer);<br>
if OCX_DLL_MTH then<br>
dllPerform. . .<br>
else<br>
PostThreadMessage(MessageThreadID,MSGId,DP_Pointer ,0);<br>
ende UserAktion<br>
<br>
Und so geht es, die OCX Sendet mir keine events mehr zum MessageThread<br>
sondert kümmert sich selbst um deren verarbeitung.(WM_Paint etc.)<br>
Zu guter letzt erreichen mich auch die events auf die ich innerhalb der <br>
Komponente Warte.<br>
<br>
//Kurz zur DLL<br>
<br>
InitCall<br>
Create TForm mit dem OCX;<br>
merken des TForms;<br>
ende InitCall<br>
<br>
//Das TFORM<br>
<br>
:<br>
:<br>
TMainf=class(TForm)<br>
IOCX:OCX_COMPO; <br>
procedure MessageEgal;<br>
public<br>
:<br>
privat<br>
:<br>
etc.<br>
end;<br>
implement<br>
procedure MessageEgal<br>
begin<br>
ShowMessage;<br>
end;<br>
<br>
<br>
Wie gesagt alles Funktioniert prima, bis darauf das mein MessageThread <br>
nach unverändertem ablauf nachrichten erhält mit denen er nix anfangen kann.<br>
Bei manipulierten ablauf erhält sie der der damit auch umgehen kann,<br>
keine ahnung wer das ist )<br>
<br>
Zu gegeben lässt sich das Problem sehr schwer beschreiben aber dennoch:<br>
wäre ich für ansätze sehr dankbar.<br>
Achso: Alles was die DLL zurückgeben darf sind nur Funktionsrückgabe- Werte
(WORD)<br>
<br>
und Daten der abgefragten events.(keine Pointer auf TForms oder was auch <br>
immer) da die dll autonom sein soll und jederzeit ersetzbar ohne Prog.- <br>
Abläufe des Hauptprogrammes zu ändern.<br>
so falls ich eine antwort vor morgen 8:00 uhr erhale info bitte an:<br>
[email protected]<br>
<br>
Vielen DANK!<br>
Comment