AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TThread + Synchronize in DLL

Ein Thema von schwarzerlotus · begonnen am 1. Nov 2012 · letzter Beitrag vom 1. Nov 2012
Antwort Antwort
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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

AW: TThread + Synchronize in DLL

  Alt 1. Nov 2012, 11:22
Bei ShowModal wird das programm angehalten, solange die Form sichtbar ist und es wird geziehlt eine Messageloop in der DLL durchlufen.
Ohne ShowModal läuft aber die MessageLoop der EXE und da ist es schon klar, daß es da schonmal zu Problemem kommen kann, da es sich um 2 getrennte VCLs halten.

Du kannst aber aus der DLL eine BPL (Package) machen, dan wird es keine Probleme mehr geben, die DLL und die EXE nun die selbe VCL benutzen.

Sollte es sich nicht um eine Delphi-EXE handeln, dann hast du halt Pech.
(da könnte man höchstens noch versuchen die DLL in einem eigenem Thread laufen zu lassen.)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
schwarzerlotus

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

AW: TThread + Synchronize in DLL

  Alt 1. Nov 2012, 14:59
Hm ich hätte jetzt nicht gedacht, dass so eine vergleichsweise einfache Operation wie die Rückmeldung eines Threads an die GUI so kompliziert wird ...

Ich hab noch keine BPL selber gebaut und da unsere Applikation diverse DLLs lädt ist diese Option vermutlich auch nicht so schnell/einfach zu realisieren aber mal schauen.

Und sonst gibt es keine Möglichkeit? Mit dem CheckSynchronize kann ich das abarbeiten der Queue ja schon mal in einem ButtonClick auslösen - aber das müsste man der Form, die ja auch in der DLL lebt, doch auch beibringen können, diese Funktion aufzurufen oder?
Lauf Delphi Hilfe ist die Funktion ja genau dafür da, um den Haupt Thread mit den anderen Threads zu synchronisieren aber ich verstehe nicht wie man das hin bekommt.

Ich bin nun erstmal auf SendMessage ausgewichen, um der Form mitzuteilen, dass etwas passiert ist - aber wenn jemand noch eine Idee hat wie das mit synchronize funktioniert, würde mich das sehr interessieren.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

AW: TThread + Synchronize in DLL

  Alt 1. Nov 2012, 15:38
Das liegt nicht am Einfach, sondernn an der VCL.

Die VCL ist niemals dafür entwickelt worden mehrmals parallel oder in einer DLL zu laufen, sondern immer in EXE/BPL und im Hauptthread.

Sehr viele Funktionen sind direkt in der MessageLoop verbaut und hart verdrahtet, so daß eine andere/fremde MessageLoop nicht alle Funktionen bietet, wie die originale Nachrichtenverarbeitung der VCL.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz