Emil. Schöne Antwort.
Mal ganz grob dahingerotzt. Der TPluginLoader ist ein Thread, der wartet, bis er ein Plugin (neu) laden soll. Das wird ihm mit einer Semaphore mitgeteilt (Du kannst auch ein Event nehmen). Derjenige, der jetzt ein neues Plugin will, ruft einfach 'LoadPlugin' auf. Über das Event 'OnSignalPluginLoaded' wird ihm dann mitgeteilt, wenn das Plugin geladen wurde. Der Aufrufer kann jetzt also andere Dinge erledigen, wie z.B. Maus/Tastendrücke verarbeiten oder Kaffeetrinken.
Delphi-Quellcode:
Procedure TPluginLoader.Execute;
Begin
While not terminated
do
if WaitForSingleObject(fSyncHandle, INFINITE) = WAIT_OBJECT0
then begin
thisPlugin := NextPlugin;
UnloadPlugin(CurrentPlugin);
LoadPlugin(thisPlugin);
Synchronize(SignalPluginLoaded);
end
else Terminate := True;
// Handle wurde wohl geschlossen
End;
Procedure SignalPluginLoaded;
Begin
if Assigned (OnSignalPluginLoaded)
then
SignalPluginLoaded(self, CurrentPlugin);
End;
Procedure TPluginLoader.LoadPlugin(aPlugin : TPlugin);
Begin
NextPlugin := aPlugin;
ReleaseSemaphore(fSyncHandle,1,
nil);
End;
Auf die Typdeklaration des Threads sowie weitere Schutzmechanismen zum Setzen/Abfragen des aktuellen/nächsten Plugins mit critical sections habe ich mich jetzt nicht gekümmert. Auch fehlt der code, der 'CurrentPlugin' setzt oder die von Rufo vorgeschlagene Statusänderung (die ich über Events publizieren würde).
Wenn Du damit (noch) nicht klarkommst, dann wird dir hier bestimmt weitergeholfen. Wichtig ist hier das Prinzip der Signalisierung/Synchronisierung nebenläufiger Prozesse über Synchronisationsobjekte (Mutexe, Events, Semaphoren) und Events (OnXXXX).