Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Synchronize IdThreadComponent (https://www.delphipraxis.net/179118-synchronize-idthreadcomponent.html)

Dembo 15. Feb 2014 14:18

Delphi-Version: XE5

Synchronize IdThreadComponent
 
Hallo,
das Problem ist die "In-Place-Methode" die bei Synchronize aufgerufen wird!
Hat einer eine Lösung da?


Delphi-Quellcode:
unit Thread_Syn;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,
  System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  IdBaseComponent, IdThreadComponent, FMX.Layouts, FMX.ListBox;

type
  TForm1 = class(TForm)
    Button1: TButton;
    IdThreadComponent1: TIdThreadComponent;
    Label1: TLabel;
    procedure IdThreadComponent1Run(Sender: TIdThreadComponent);
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  IdThreadComponent1.Start;
end;

procedure TForm1.IdThreadComponent1Run(Sender: TIdThreadComponent);
var
  Text: String;
begin
  Text := 'Test!!';
  IdThreadComponent1.Synchronize(
    procedure
    begin
      Label1.Text := Text;
    end);
  IdThreadComponent1.Stop;
end;

end.
Fehlermeldung

[DCC Fehler] Thread_Syn.pas(41): E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'

himitsu 15. Feb 2014 14:26

AW: Synchronize IdThreadComponent
 
Das Ding will nunmal nur eine Objekt-Methode, also mußt du auch Eine übergeben, so wie es dir die Fehlermeldung auch sagt.

Zitat:

Delphi-Quellcode:
procedure TIdThreadComponent.Synchronize(AMethod: TThreadMethod); // <<<<<< TThreadMethod !!!
begin
  FThread.Synchronize(AMethod);
end;

PS:
Delphi-Quellcode:
TThread.Synchronize(nil, procedure
  begin
    ...
  end);
Falls die Indy-Leute in neueren Versionen (nach XE3) es endlich geschafft haben auch die generischen Methoden durchzureichen, oder den interen TIdThreadEx zugänglich machen, dann kannst du natürlich auch diese verwenden.

Und statt IdThreadComponent1 solltest du im IdThreadComponent1Run auch besser den Sender verwenden. (aus dem Selben Grund, warum man nicht innerhalb von TForm1 das Form1 verwendet)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz