Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Threads (https://www.delphipraxis.net/33971-threads.html)

glkgereon 15. Nov 2004 18:18


Threads
 
is das die richtige kategorie?

naja, egal:
also, meine frage, mkann mal einer ein baispiel zu threads posten?
ich hab jetzt auf auch das tutorial von luckie, aber auch das hilft mir nicht so wirklich weiter (sorry) :duck:

ich bräuchte einfach mal eine kleine anwendung so in der art:

in der hauptanwendung ein label, im thread wir einfach nur eine variable hochgezählt und der hauptthread gibt vor wie groß das delay dazwischen ist

(=> Werteübergabe App->thread und Thread->App)

Luckie 15. Nov 2004 19:12

Re: Threads
 
Also die Demos im Zip Archiv sind schon so einfach wie möglich und dürften gemnau dem entsprechen, was du suchst.

glkgereon 15. Nov 2004 21:53

Re: Threads
 
achso....im archiv sind dem demos dabei???

ich hab mid nur das pdf runtergeladen...

ich werds mir anschauen, aber nicht mehr heute :)

Sprint 15. Nov 2004 22:09

Re: Threads
 
Zitat:

Zitat von glkgereon
in der hauptanwendung ein label, im thread wir einfach nur eine variable hochgezählt und der hauptthread gibt vor wie groß das delay dazwischen ist

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  TMyThread = class(TThread)
  private
    FLabel: TLabel;
    FCounter: Integer;
    FDelay: Integer;
    procedure UpdateVCL;
  protected
    procedure Execute; override;
  public
    constructor Create(ALabel: TLabel);
    property Delay: Integer read FDelay write FDelay;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TMyThread.Create(ALabel: TLabel);
begin
  inherited Create(True);
  FCounter := 0;
  FLabel := ALabel;
end;

procedure TMyThread.Execute;
begin
  while (not Self.Terminated) do
  begin
    Inc(FCounter);
    Synchronize(UpdateVCL);
    Sleep(FDelay);
  end;
end;

procedure TMyThread.UpdateVCL;
begin
  FLabel.Caption := IntToStr(FCounter);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TMyThread.Create(Label1) do
  begin
    Delay := 1000;
    Resume;
  end;
end;

end.

glkgereon 16. Nov 2004 14:08

Re: Threads
 
hmm....sorry luckie...aber die demos sind irgendwie zu kompliziert um da auf anhieb mit einzusteigen :gruebel:

ich werd jetzt nochma die kürzeren demos genau durchgehen...

doch jetzt habbichs :)

//erldigt wie kann ich mit syncronize eine methode ausgabe aufrufen der ich was übergeben will?
und noch einen:

hier kommt was falsches raus...kann das an der übergabe liegen?

Delphi-Quellcode:
procedure TPiCalc.Ausgabe;
begin
  Form1.Pi_Ausgabe.Value:=Value;
end;

procedure TPiCalc.Execute;
var x, y:Extended;
    PointsIn, PointsAll:Int64;
begin
  randomize;
  while not Terminated do
    begin
    x:=random;
    y:=random;
    if sqr(x)+sqr(y)<1 then inc(PointsIn);
    inc(PointsAll);
    Value:=4*PointsIn/PointsAll;
    Synchronize(Ausgabe);
    end;
end;
eigentlich sollte da 3.14.... rauskommen, es kommt aber 0.068... raus :(

glkgereon 17. Nov 2004 15:17

Re: Threads
 
*push*

weiss das echt keiner? :(

kann mir denn wenigstens einer sagen ob dei übergabe oder die berechnung falsch is? (ober beides)

ich bin nämlich echt am verzweifeln.... :(


EDIT: hab den fehler...

WARUM ZUM TEUFEL WERDEN INT64 IN DEM THREAD NICHT AUF 0 INITIALISIERT ?????????
:evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil:

mann echt jetzt, das klann doch net sein, in normalen apps tun die das doch, oder?

shmia 17. Nov 2004 15:32

Re: Threads
 
Delphi-Quellcode:
procedure TPiCalc.Execute;
var x, y:Extended;
    PointsIn, PointsAll:Int64;
begin
  randomize;
  PointsIn := 0; // <==== !!!!!!!!!!!!!
  PointsAll:= 0; // <==== !!!!!!!!!!!!!
  while not Terminated do
    begin
    x:=random;
    y:=random;
    if sqr(x)+sqr(y)<1.0 then inc(PointsIn);
    inc(PointsAll);

    // wenn nach jeder Berechnung sofort eine Ausgabe erfolgen würde
    // braucht man keine Threads !!
    if (PointsAll mod 1000) = 0 then
    begin
       Value:=4.0*PointsIn/PointsAll;
       Synchronize(Ausgabe);
    end;
  end;
  Value:=4.0*PointsIn/PointsAll;
end;

glkgereon 17. Nov 2004 15:35

Re: Threads
 
also
a) Warum initialisisern die sich nicht automatisch wie sonst auch???
b) es war nur ne übung, keine "sinnvolle" anwendung

shmia 17. Nov 2004 15:39

Re: Threads
 
Zitat:

Zitat von glkgereon
a) Warum initialisisern die sich nicht automatisch wie sonst auch???

Weil es lokale Variablen sind. Nur Strings und Klassen(member-)variablen werden vorbelegt.
Zitat:

Zitat von glkgereon
b) es war nur ne übung, keine "sinnvolle" anwendung

Mit meiner Änderung wird ne "sinnvolle" Übung draus. :zwinker:

Shaman 17. Nov 2004 15:40

Re: Threads
 
Hoi

Lokale Variablen machen das doch nie, nur globale und Felder.

Gruss
Shaman


Alle Zeitangaben in WEZ +1. Es ist jetzt 02: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