Einzelnen Beitrag anzeigen

schwarzerlotus

Registriert seit: 25. Jul 2011
22 Beiträge
 
#1

TThread + Synchronize in DLL

  Alt 1. Nov 2012, 10:53
Delphi-Version: 7
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?
  Mit Zitat antworten Zitat