Delphi-PRAXiS

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

glkgereon 17. Nov 2004 15:47

Re: Threads
 
integer werden doch auf 0 initialisiert....ja klar!!!

Sprint 17. Nov 2004 16:09

Re: Threads
 
Zitat:

Zitat von glkgereon
integer werden doch auf 0 initialisiert....ja klar!!!

Aber nicht lokale Variablen.

glkgereon 17. Nov 2004 16:12

Re: Threads
 
was heisst lokal?
also in einer procedure Button1Click (das is für mich lokal) werden sie initialisiert

Sprint 17. Nov 2004 16:31

Re: Threads
 
Zitat:

Zitat von glkgereon
also in einer procedure Button1Click (das is für mich lokal) werden sie initialisiert

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  X: Integer;
begin
  ShowMessage(IntToStr(X));
end;
Wenn lokale Variablen initialisiert werden, dann müsste in der MessageBox ja 0 stehen. :wink: Probiere es doch einfach mal aus, was dabei heraus kommt.

CReber 17. Nov 2004 21:37

Re: Threads
 
Ist das eigentlich in Delphi > 2005 anders? Ich finde das ist mit das schlimmste an Delphi ;) Nichts nervt mehr als wenn man zig Variablen vorher initialisieren muss.

Robert_G 17. Nov 2004 23:50

Re: Threads
 
Zitat:

Zitat von Christian Reber
Ist das eigentlich in Delphi > 2005 anders? Ich finde das ist mit das schlimmste an Delphi ;) Nichts nervt mehr als wenn man zig Variablen vorher initialisieren muss.

Warum sinnlos Zyklen verschwenden, um eine Variable mit einem Wert zu besetzen, den du vielleicht gar nicht brauchst?
Das hier ist Delphi, nicht VB. :mrgreen:

Shaman 18. Nov 2004 07:13

Re: Threads
 
Zitat:

Zitat von Robert_G
Warum sinnlos Zyklen verschwenden, um eine Variable mit einem Wert zu besetzen, den du vielleicht gar nicht brauchst?
Das hier ist Delphi, nicht VB. :mrgreen:

Gut, aber der Compiler könnte es ja selber merken, welche zu initialisieren sind. Praktisch wäre es ja schon.

Union 18. Nov 2004 07:33

Re: Threads
 
Zitat:

Zitat von Christian Reber
Ist das eigentlich in Delphi > 2005 anders? Ich finde das ist mit das schlimmste an Delphi ;) Nichts nervt mehr als wenn man zig Variablen vorher initialisieren muss.

O Graus! Und wenn Du es vergisst ? Der Compiler warnt Dich doch noch in solchen Fällen! Dann kannst Du die Variable problemlos initialisieren im Code. Es soll ja auch Fälle geben, wo man mal nicht mit NULL oder '' starten möchte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:24 Uhr.

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