Hallo zusammen,
ich bin gerade etwas am verzweifeln mit einem Thread in meiner
DLL.
Der Thread soll in regelmäßigen Abständen ein Update auf einer Form ausführen - wenn ich das ganze in einer eigenständigen Applikation starte geht das ganze super, wenn ich die Form mittels showModal aufrufe gehts auch - will ich die Form nun aber nicht modal anzeigen wird die aus dem Thread mittels synchronize aufgerufene Prozedur nicht mehr angesprungen.
Hier einmal mein minimal Test
Delphi-Quellcode:
unit TestThread;
interface
uses
Windows, Messages, SysUtils, Variants, Classes;
type
TTestThread =
class(TThread)
private
j: Integer;
protected
procedure Execute;
override;
end;
implementation
uses
ThreadTestForm;
procedure TTestThread.Execute;
var
i: Integer;
begin
j:=1;
for i:=1
to 90
do
begin
if Terminated
then break;
j := i;
sleep(1000);
Synchronize(Form1.doit);
end;
FreeOnTerminate:=True;
end;
end.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
NewThread: TTestThread;
begin
NewThread:=TTestThread.Create(true);
NewThread.Resume;
end;
procedure TForm1.doit;
begin
Memo1.Lines.Add('Test?');
end;
Was ich bisher glaube verstanden zu haben ist, dass die Nachricht die beim Synchronize an die Applikation geschickt wird dort nicht angenommen/verarbeitet wird, da meine Form in der
dll lebt und nicht in der exe selber. Und ein modaler Dialog scheint eine eigene Event Queue zu haben so dass es dort funktioniert.
nun wird oft geraten die Funktion CheckSynchronize aus Classes aufzurufen.
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
CheckSynchronize();
end;
Löse ich das so auf der selben Form per Hand aus, so kommen die Nachrichten an - aber wie sage ich nun der Applikation/Form dass sie das "regelmäßig" aufruft?
In der Main Applikation kann ich so ohne weiteres nichts hinzufügen - ich müsste das also in der
DLL lösen. Außerdem möchte ich nicht die ganze Zeit einen zusätzlichen Overhead durch das CheckSynchronize haben, sondern nur wenn der Thread wirklich auch läuft.
Habt ihr eine Idee wie ich das lösen kann?