Sven Lanoster
2016-06-14 17:35:42 UTC
Moin, moin.
Ich fummel mal wieder in uraltem Quellcode anderer Leute herum. Dabei
fiel mir eine Unit auf, in der ein Thread implementiert ist, in dessen
Execute es vor Application.ProcessMessages nur so wimmelt.
Ja, so habe ich auch geschaut. Und dann gesucht, wo die Unit benutzt
wird. In einer DLL. Nochmal: Häh?
Hat eine DLL nicht eine eigene Instanz von TApplication? Und wieso hat
die DLL eine Nachrichtenpumpe?
In der DLL ist ein OLE-Dingens (Units: OleAuth, Ole2), welches
(vermutlich mit CreateOleObject) in das Hauptprogramm geladen wird. Und
hier schwimme ich etwas. Ist die TApplication-Instanz im OLE-Dingens die
selbe wie die im Hauptprogramm? Ich glaube nicht.
Aber das OLE-Dingens erzeugt ein Fortschritt-Abbruch-Fenster. In der
Unit ist natürlich Forms und Controls im Uses und dort kommt dann
spätestens Application und die Nachrichtenpumpe her.
Danach erzeugt (und startet) das OLE-Dingens den Thread, der dann über
die globale Form-Variable den Fortschritt anzeigen will. Und deswegen
hat der damalige Entwickler wohl großzügig Application.ProcessMessages
eingestreut.
Der Thread selbst macht nichts sichtbares mit Messages. Auch nicht per
synchronize, paint, refresh oder so.
Wer mir bis hierher folgen konnte, möge mir bei der Beantwortung der
folgenden Frage behilflich sein: Was passiert, wenn ich das
Application.ProcessMessages aus dem Thread.Execute entferne?
Das Hauptprogramm wartet ohnehin darauf, dass das OLE-Dingens seinen Job
erledigt hat. Das läßt sich durch ProcessMessages aus der DLL vermutlich
nicht beeindrucken.
Das OLE-Dingens hat eine eigene (?) Nachrichtenpumpe, die neben dem
Thread weiterlaufen müsste. Der Thread hat kein eigenes Application
(oder doch?) und auch keine Nachrichtenpumpe, die man mit
ProcessMessages ankurbeln muss.
Also ich denke: das kann weg.
Ich kann es wegen der speziellen Umgebung natürlich nicht mal eben
ausprobieren. *seufz* Also bleibt das natürlich so drin, es
"funktioniert" ja seit über zehn Jahren so. *doppelseufz*
MfG,
Sven.
Ich fummel mal wieder in uraltem Quellcode anderer Leute herum. Dabei
fiel mir eine Unit auf, in der ein Thread implementiert ist, in dessen
Execute es vor Application.ProcessMessages nur so wimmelt.
Ja, so habe ich auch geschaut. Und dann gesucht, wo die Unit benutzt
wird. In einer DLL. Nochmal: Häh?
Hat eine DLL nicht eine eigene Instanz von TApplication? Und wieso hat
die DLL eine Nachrichtenpumpe?
In der DLL ist ein OLE-Dingens (Units: OleAuth, Ole2), welches
(vermutlich mit CreateOleObject) in das Hauptprogramm geladen wird. Und
hier schwimme ich etwas. Ist die TApplication-Instanz im OLE-Dingens die
selbe wie die im Hauptprogramm? Ich glaube nicht.
Aber das OLE-Dingens erzeugt ein Fortschritt-Abbruch-Fenster. In der
Unit ist natürlich Forms und Controls im Uses und dort kommt dann
spätestens Application und die Nachrichtenpumpe her.
Danach erzeugt (und startet) das OLE-Dingens den Thread, der dann über
die globale Form-Variable den Fortschritt anzeigen will. Und deswegen
hat der damalige Entwickler wohl großzügig Application.ProcessMessages
eingestreut.
Der Thread selbst macht nichts sichtbares mit Messages. Auch nicht per
synchronize, paint, refresh oder so.
Wer mir bis hierher folgen konnte, möge mir bei der Beantwortung der
folgenden Frage behilflich sein: Was passiert, wenn ich das
Application.ProcessMessages aus dem Thread.Execute entferne?
Das Hauptprogramm wartet ohnehin darauf, dass das OLE-Dingens seinen Job
erledigt hat. Das läßt sich durch ProcessMessages aus der DLL vermutlich
nicht beeindrucken.
Das OLE-Dingens hat eine eigene (?) Nachrichtenpumpe, die neben dem
Thread weiterlaufen müsste. Der Thread hat kein eigenes Application
(oder doch?) und auch keine Nachrichtenpumpe, die man mit
ProcessMessages ankurbeln muss.
Also ich denke: das kann weg.
Ich kann es wegen der speziellen Umgebung natürlich nicht mal eben
ausprobieren. *seufz* Also bleibt das natürlich so drin, es
"funktioniert" ja seit über zehn Jahren so. *doppelseufz*
MfG,
Sven.
--
Ist das Kunst oder kann das weg?
Ist das Kunst oder kann das weg?