Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Lazarus - thread

Zdravim.
Jak je to v lazarusu s vlakny?
Zatím vše co jsem dělal v delphi mi fungovalo i v lazarusu.
Vlakna však ne.
V delphi je toto funkční.
V lazarusu se mu nelibi vlakno.Resume; ale sežere to.
unit1.pas(45,15) Warning: Symbol "Resume" is deprecated

Synchronize(Zapis); neprojde
unit1.pas(55,19) Error: Incompatible type for arg no. 1: Got "untyped", expected "<procedure variable type of procedure of object;Register>"

 TVlakno = class(TThread)
  private

  protected
    procedure Execute; override;
    procedure Zapis;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var vlakno:TVlakno;

begin
 vlakno:=TVlakno.Create(true);
 vlakno.Resume;
end;

procedure TVlakno.Execute;

begin
 while not terminated do begin
     Beep();
     sleep(2000);
end;
 Synchronize(Zapis);
end;

procedure TVlakno.Zapis;
begin

end ;

end.

Potřebují jedno vlakno, ktere bude zapisovat vysledky do komponenty ve from1

Předmět Autor Datum
Strašne ťažké si pozrieť Multithreaded Application Tutorial... Namiesto vlakno.Resume použi vlakno.…
pme 23.12.2016 15:55
pme
Nějak to Synchronize(Zapis) se nelibí lazarusu pod linuxem. Pod Win ok. Na obou mam Lazarus 1.6 FPC…
m11 23.12.2016 18:09
m11
Si snáď mongol? Tak, ako je to v tom príklade prečo neskúsiš? TMyThread = class(TThread) private[ f…
pme 23.12.2016 19:09
pme
To jsem zkoušel. Vyskočí placka. Projekt vykonal vyjimku třidy RunError(232) na adrese 68. poslední
m11 23.12.2016 20:29
m11

Nějak to Synchronize(Zapis) se nelibí lazarusu pod linuxem.
Pod Win ok.
Na obou mam Lazarus 1.6 FPC 3

type
 TVlakno = class(TThread)
  private
   procedure Zapis;
  protected
   procedure Execute; override;
    end;  

procedure TVlakno.Execute;
begin
 Synchronize(Zapis);
end;

procedure TVlakno.Zapis;
begin

end ; 

unit1.pas(157,19) Error: Incompatible type for arg no. 1: Got "untyped", expected "<procedure variable type of procedure of object;StdCall>"

Si snáď mongol? Tak, ako je to v tom príklade prečo neskúsiš?

TMyThread = class(TThread)
    private[
      fStatusText : string;
      procedure ShowStatus;
    protected
      procedure Execute; override;
    public
      Constructor Create(CreateSuspended : boolean);
    end;

procedure TMyThread.ShowStatus;
  // this method is executed by the mainthread and can therefore access all GUI elements.
  begin
    Form1.Caption := fStatusText;
  end;
 
  procedure TMyThread.Execute;
  var
    newStatus : string;
  begin
    fStatusText := 'TMyThread Starting...';
    Synchronize(@Showstatus);                     /// parameter ako ukazateľ na procedúru !!!
    fStatusText := 'TMyThread Running...';
    while (not Terminated) and ([any condition required]) do
      begin
        ...
        [here goes the code of the main thread loop]
        ...
        if NewStatus <> fStatusText then
          begin
            fStatusText := newStatus;
            Synchronize(@Showstatus);   /// parameter ako ukazateľ na procedúru !!!
          end;
      end;
  end;

Zpět do poradny Odpovědět na původní otázku Nahoru