Thread lässt sich nicht freigeben

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Dets hat geschrieben:
mschnell hat geschrieben: Ist doch ganz einfach: der Thread bekommt Daten, wird gestartet (=Resume), verarbeitet die Daten(=Sleep) und wenn er fertig ist, wartet er (=Suspend) darauf, dass das Hauptprogramm die Daten abholt und neue liefert. Dann beginnt das Spiel von vorn.
Ist das eine so ungewöhnliche Art einen Thread zu benutzen?
Nö.

Wenn der Thread auf eine Aufgabe ("Daten") warten soll, ist eine Semaphore die geeignete Massnahme. Weder sleep noch suspend sind da geeignet.

In Lazarus ist eine Semaphore z.B. in TEvent (in unit syncobjs) gekapselt. Mit TEvent.Waitfor kann man auf ein Ereignis warten.

-Michael

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Dets hat geschrieben:Wenn man einen Thread von außen suspended, dann weiß man doch gar nicht, an welcher Stelle im Code er sich gerade befindet. Das ist doch hochgradig abenteuerlich.
Genau dazu ist es aber da. Mit suspend kann man verhindern, dass einem ein Thread in die Quere kommt, wenn man es gerade nicht brauchen kann. TCriticalSection ist aber auch da meist der bessere Weg (und auch genau zu diesem Zweck gedacht).

Ehrlich gesagt, fällt mir keine wirklich sinnvolle Anwendung von "Suspend" ein.

-Michael

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

af0815 hat geschrieben:WaitForSingeObject
Ich weis nur nicht, ob das bei Lazarus/FPC schon iin den Bibliotheken ist.
Ist in Lazarus (hoffentlich platformübergreifend kompatibel) in TEvent gekapselt.

-Michael

Dets
Beiträge: 61
Registriert: Di 11. Sep 2007, 16:59
OS, Lazarus, FPC: Ubuntu Maverick (L 0.9.28.2-10, FPC 2.4.0)
CPU-Target: 32Bit
Wohnort: Lage
Kontaktdaten:

Beitrag von Dets »

Also: folgender Quellcode funktioniert bei mir Zuhause unter (K)ubuntu Gutsy mit Lazarus 0.9.24beta/FPC 2.2.0 nun problemlos (wie gewünscht):

Code: Alles auswählen

unit uFrmMain;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
  TSimpleThread = class(TThread)
  private
  protected
    procedure Execute; override;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Terminate;
  end;
 
  { TForm1 }
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    aThread: TSimpleThread;
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1; 
 
implementation
 
constructor TSimpleThread.Create;
begin
     FreeOnTerminate:=True;
     inherited Create(true);
end;
 
destructor TSimpleThread.Destroy;
begin
     if not Terminated then
        Terminate;
 
     inherited;
end;
 
procedure TSimpleThread.Terminate;
begin
     inherited;
 
     if Suspended then
        Resume;
end;
 
procedure TSimpleThread.Execute;
begin
     while not terminated do
     begin
          sleep(5000);
 
          if not terminated then
            suspend;
     end;
end;
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
     aThread:=TSimpleThread.Create;
end;
 
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
     aThread.Free;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
     aThread.Resume;
end;
 
initialization
  {$I uFrmMain.lrs}
 
end.
Mein Arbeitsplatz-PC mit der gleichen Software-Ausstattung, allerdings unter VMware (mit XP als Host), klemmte hingegen an unterschiedlichsten Stellen. Offensichtlich kann ich dem nicht trauen ...

thx, Dets ...

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Dass es auf (mindestens) einem PC funktioniert, heißt noch lange nicht, dass es sinnvoll programmiert ist.

-Michael

Antworten