Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TSemaphore (https://www.delphipraxis.net/153888-tsemaphore.html)

youuu 19. Aug 2010 08:19

Delphi-Version: 2010

TSemaphore
 
Hi,

ich möchte mehrere Threads starten, allerdings soll bei 10 gleichzeiigen Threads schluss sein, bis wieder einer abgearbeitet wurde und der nächste starten kann.

Nun habe ich gelesen das geht mit TSemaphore, kann mir jemand dazu ein Beispiel zeigen?

gsh 19. Aug 2010 08:41

AW: TSemaphore
 
Du solltest nicht immer die Threads anlegen und dann nach der Aufgabe zerstören. Wenn du einmal 10 Threads erzeugst und die dann in einem Pool die Arbeiten erledigen lässt sparst du dir viel Overhead.

Schau dir mal das an: http://www.delphipraxis.net/93835-wo...ntergrund.html

youuu 19. Aug 2010 10:56

AW: TSemaphore
 
Habe ich mir gerade angesehen und schaut sehr gut aus, habe allerdings noch eine Frage dazu und zwar wie kann ich dem Thread eine Variable mit geben, beim OnCreate Ereignis?

SirThornberry 19. Aug 2010 11:00

AW: TSemaphore
 
genau, fast richtig. natürlich nicht im OnCreate sondern beim Create (Constructor-Aufruf). Einfach einen neuen Constructor anlegen und dem die Parameter übergeben. Im Constructor kannst du die übergebenen Parameter dann in private-Varialben etc. speichern.

youuu 19. Aug 2010 11:51

AW: TSemaphore
 
Ach stimmt, oh man ich Pfeiffe :)

youuu 19. Aug 2010 13:04

AW: TSemaphore
 
Ach stimmt, oh man ich Pfeiffe :)

Edit: Hm irgendwie klappt das nicht.

Ich bekomm dann immer als Fehler: E2008 Inkompatible Typen Hier:
Delphi-Quellcode:
Constructor TSampleJob.Create(kat: integer; sl2: THashedStringList; slOld2: THashedStringList);
Begin
  Inherited;           // <<<----- E2008 Inkompatible Typen
  Synchronized := False;
  o := kat;
  sl.AddStrings(sl2);
  slOld.AddStrings(slOld2);
End;
HauptThread sieht dann so aus
Delphi-Quellcode:
  TWorkerThreadJob = Class
  private
    fSynchronized: Boolean;
    fUsesCOMObjects: Boolean;
    fo: integer;
    fsl, fslOld: THashedStringList;
  protected
    Procedure Execute(aThread: TWorkerThread); virtual; abstract;
    Property UsesCOMObjects: Boolean read fUsesCOMObjects write fUsesCOMObjects default False;
    Property Synchronized: Boolean read fSynchronized write fSynchronized default True;
    Property o: Integer read fo write fo;
    Property sl: THashedStringList read fsl write fsl;
    Property slOld: THashedStringList read fslOld write fslOld;
  End;
Damit wollte ich es testen, aber wie gesagt bekam ich diese Fehlermeldung.

idefix2 19. Aug 2010 13:13

AW: TSemaphore
 
Dein Konstruktor hat andere Parameter als der Konstruktor Create der Vorfahrklasse, da kannst Du nicht einfach inherited schreiben. Versuch es mit:

Delphi-Quellcode:
inherited create (Parameter für geerbte Createroutine)

youuu 19. Aug 2010 13:19

AW: TSemaphore
 
E2034 Zu viele Parameter

kommt dabei raus.

idefix2 19. Aug 2010 13:33

AW: TSemaphore
 
Was ist der Vorfahr von TSampleJob? Wie schaut die Deklaration der entsprechenden (geerbten) Create Routine aus? Und welche Parameter hast Du jetzt an inherited create übergeben?

youuu 19. Aug 2010 13:51

AW: TSemaphore
 
Delphi-Quellcode:
Type
// Beispiel, das die Verwendung der synchronize-Methode demonstriert,
// um Ausgaben unter Verwendung der VCL threadsicher vorzunehmen.
  TSampleJob = Class(TWorkerThreadJob)
    fMessage: String;
    Procedure DoShow;
  public
    Constructor Create(kat: integer; sl2: THashedStringList; slOld2: THashedStringList);
    Procedure Execute(aThread: TWorkerThread); override;
  End;
Delphi-Quellcode:
  TWorkerThreadJob = Class
  private
    fSynchronized: Boolean;
    fUsesCOMObjects: Boolean;
    fo: integer;
    fsl, fslOld: THashedStringList;
  protected
    Procedure Execute(aThread: TWorkerThread); virtual; abstract;
    Property UsesCOMObjects: Boolean read fUsesCOMObjects write fUsesCOMObjects default False;
    Property Synchronized: Boolean read fSynchronized write fSynchronized default True;
    Property o: Integer read fo write fo;
    Property sl: THashedStringList read fsl write fsl;
    Property slOld: THashedStringList read fslOld write fslOld;
  End;
sollte der vorfahre sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 Uhr.
Seite 1 von 2  1 2      

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