Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Brauche Hilfe zu Threads (https://www.delphipraxis.net/105803-brauche-hilfe-zu-threads.html)

Oldjoe37 30. Dez 2007 14:36


Brauche Hilfe zu Threads
 
Habe als totaler Delphi(5)-Laie meine Wanduhr fotografiert und daraus eine analoge Uhr gebastelt. Funktioniert.
Sobald ich aber das Pendel zufügen will, geht nur entweder die Uhr oder das Pendel.
Möchte das Pendel evtl. mit Timer2 in einem zweiten Thread laufen lassen, komme aber damit nicht zurecht.
(Pendelstab mit LineTo, Pendelscheibe ist wieder eine 24k große BMP.)
Könnte Pendel auch als AVI laufen lassen. Aber wie kriege ich das eine oder das andere in einen Thread?
Die Anleitung von M.Puff kann ich nicht umsetzen. Für eine konkrete Hilfe wäre ich sehr dankbar, weil ich über eigene Beispiele am besten lerne.
Oldjoe (Baujahr37)

Apollonius 30. Dez 2007 14:39

Re: Brauche Hilfe zu Threads
 
Mit Threads geht das kaum, denn man sollte nur vom Hauptthread auf die VCL zugreifen. Was spricht denn gegen einen Timer für die Zeiger und einen für das Pendel?

Oldjoe37 30. Dez 2007 15:14

Re: Brauche Hilfe zu Threads
 
Mit zwei Timern habe ich es schon probiert, gleicher Effekt.
Ich vermute, dass Uhr und Pendel sich gegenseitig stören, wenn sie in einem einzigen Thread laufen.
(Zugriffsverletzungen).

Apollonius 30. Dez 2007 15:15

Re: Brauche Hilfe zu Threads
 
Zeige mal den Code von den Timern. Und vergiss bitte die Threads, denn in so einem Fall schaffen sie nur Ärger.

Oldjoe37 30. Dez 2007 15:17

Re: Brauche Hilfe zu Threads
 
Hatte den zweiten Timer schon gelöscht. Muss ich erst wieder neu schreiben. Dauert ca 30 Minuten.

Oldjoe37 30. Dez 2007 15:46

Re: Brauche Hilfe zu Threads
 
Bei Timer2 läuft zwar die Uhr, aber das Pendel zuckt höchstens.
Bitte über meinen Code nicht lachen, bin wirklich nur Anfänger!


Delphi-Quellcode:
unit Uhr1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, mmSystem, math, jpeg;

type
   TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Pendel: TTimer;
    Timer2: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);


  private
    { Private-Deklarationen }

  end;

var
    Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.Width := 210;
  Form1.Height := 452;
  Form1.Position := poScreenCenter;
  Doublebuffered := True;

end;

Procedure Berechne_Stunde(winkel: Real; var xi,yi: Integer);
var x,y:Real;
begin
  winkel := winkel - pi/2;
  x:= 134 + 31*Cos(winkel);
  y:= 150 + 31*Sin(winkel);
  xi:=Trunc(x);
  yi:=Trunc(y);
end;

Procedure Berechne_Minute(winkel:Real;var ri,si:Integer);
var r,s:Real;

begin
  winkel := winkel - pi/2;
  r:= 134 + 39*Cos(winkel);
  s:= 150 + 39*Sin(winkel);
  ri:=Trunc(r);
  si:=Trunc(s);
  If sin(winkel) = -1 then sndPlaySound(PChar('file10.wav'), SND_ASYNC);
  If sin(winkel) = 1 then sndPlaySound(PChar('file9.wav'), SND_ASYNC);
  end;

Procedure Berechne_Sekunde(winkel:Real;var ui,vi:Integer);
var u,v:Real;
begin
  winkel := winkel - pi/2;
  u:= 134 + 50*Cos(winkel);
  v:= 150 + 50*Sin(winkel);
//  sndPlaySound(PChar('start.wav'), SND_ASYNC);
  ui:=Trunc(u);
  vi:=Trunc(v);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var hour,min,sec,msec:Word;
    x,y,r,s,u,v:Integer;

begin
  DecodeTime(Now,hour,min,sec,msec);
  Label1.Caption := TimeToStr(Now);
  Label2.caption := DateToStr(Now);
  Refresh;

  //Stundenzeiger
  if hour > 12 then hour:= hour - 12;
  Berechne_Stunde(2*pi/12*hour + 2*pi/720*min,x,y);
  Canvas.Pen.Width := 4;
  Canvas.Pen.Color := clBlack;
  Canvas.Moveto(134, 150);
  Canvas.LineTo(x,y);

  //Minutenzeiger
  Berechne_Minute((2*pi/60*min),r,s);   //  + (2*pi/3600*min)
  Canvas.Moveto(134, 150);
  Canvas.Pen.Width := 3;
  Canvas.Pen.Color := clBlack;
  Canvas.LineTo(r,s);

  //Sekundenzeiger
  Berechne_Sekunde(2*pi/60*sec,u,v);
  Canvas.Moveto(134, 150);
  Canvas.Pen.Width := 1;
  Canvas.Pen.Color := clRed;
  Canvas.LineTo(u,v);
{ ######## Das Folgende war nur ein vereinfachter Test ####
 //Pendel
  Canvas.Pen.Width := 6;
  Canvas.Pen.Color := clBlack;
     if sec mod 2 = 1 then
        begin
               Refresh;
               Image3.visible:=false;
              Canvas.Moveto(139, 215);
              Canvas.LineTo(157,348);
               Image2.visible:=true;
        end
        else
        begin
                Refresh;
                Image2.visible:=false;
                Canvas.Moveto(129, 215);
              Canvas.LineTo(112,348);
                Image3.visible:=true;
        end; }
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Close;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
var hour,min,sec,msec:Word;
begin
// ######## Das Folgende ist nur ein vereinfachter Test ####
 //Pendel
  Canvas.Pen.Width := 6;
  Canvas.Pen.Color := clBlack;
     if sec mod 2 = 1 then
        begin
               Refresh;
               Image3.visible:=false;
              Canvas.Moveto(139, 215);
              Canvas.LineTo(157,348);
               Image2.visible:=true;
        end
        else
        begin
                Refresh;
                Image2.visible:=false;
                Canvas.Moveto(129, 215);
              Canvas.LineTo(112,348);
                Image3.visible:=true;
        end;
end;

end.

Apollonius 30. Dez 2007 15:55

Re: Brauche Hilfe zu Threads
 
Was sollte das Pendel denn sonst machen? Du hast in deinem Code ja nur zwei Zustände.

Oldjoe37 30. Dez 2007 16:09

Re: Brauche Hilfe zu Threads
 
Das Pendel soll ordentlich schwingen. Der Test funktioniert aber nicht einmal mit zwei Zuständen. Die eine Pendelscheibe verschwindet gänzlich, der Pendelstab (LineTo) ist auf einer Seite nur als Aufblitzen zu sehen. Offensichtlich ist das Programm durch meinen Code überfordert. Deshalb wollte ich die Uhr im Hauptthread und das Pendel im Nebenthread laufen lassen.

Apollonius 30. Dez 2007 16:13

Re: Brauche Hilfe zu Threads
 
Hast du vergessen, etwas zu kopieren oder steht das auch bei dir so da, dass Sec in Timer2Timer nie gesetzt wird?

Und nein, dein Programm ist garantiert nicht überfordert. Du kannst ja mal probieren, das Fenster zu verschieben und dann zu schauen, ob flüssig neugezeichnet wird.

Oldjoe37 30. Dez 2007 16:28

Re: Brauche Hilfe zu Threads
 
"if sec mod 2 = 1 then"
führt - wenn ich die Uhr mit {} abschalte - dazu, dass das Pendel ordentlich zwischen den zwei Zuständen wechselt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz