Delphi-PRAXiS

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 13: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 13: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 14: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 14: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 14: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 14: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 14: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 15: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 15: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 15: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.

Apollonius 30. Dez 2007 15:45

Re: Brauche Hilfe zu Threads
 
Wann weist du denn Sec zu? Das steht nämlich nicht in dem, was du gepostet hast.

Oldjoe37 30. Dez 2007 15:57

Re: Brauche Hilfe zu Threads
 
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

Klaus01 30. Dez 2007 16:10

Re: Brauche Hilfe zu Threads
 
Hallo,

vielleicht solltest Du noch dies
Delphi-Quellcode:
DecodeTime(Now,hour,min,sec,msec);
in Deiner Timer Routine aufrufen.

Denn sec wird nie ein Wert zugewiesen (wie Phillip schon richtig angemerkt hat), er wird nur abgefragt.

Grüße
Klaus

Oldjoe37 30. Dez 2007 16:24

Re: Brauche Hilfe zu Threads
 
Hatte ich schon mal drin. Wieder eingefügt, kein Ergebnis.
Pendelscheiben-BMP durch Canvas.Ellipse(x1,y1,x2,y2); ersetzt, kein Ergebnis.
Nur Pendelstab als LineTo, kein Ergebnis.
Es bleibt dabei: Uhrzeiger und Pendel "beissen sich". Bin ziemlich verzweifelt, aber das gehört wohl dazu!

Oldjoe37 30. Dez 2007 16:33

Re: Brauche Hilfe zu Threads
 
Timer2 sieht jetzt so aus:

Delphi-Quellcode:
procedure TForm1.Timer2Timer(Sender: TObject);
var Now,hour,min,sec,msec: Word;
begin
// ######## Das Folgende ist nur ein vereinfachter Test mit 2 Zuständen####
 //Pendel
DecodeTime(Now,hour,min,sec,msec);
  Canvas.Pen.Width := 6;
  Canvas.Pen.Color := clBlack;
     if sec mod 2 = 1 then
        begin
              Canvas.Moveto(139, 215);
              Canvas.LineTo(157,348);
               Canvas.Ellipse(132,348,182,398);
        end
        else
        begin
                Canvas.Moveto(129, 215);
              Canvas.LineTo(112,348);
                Canvas.Ellipse(87,348,137,398);
        end;
end;

Klaus01 30. Dez 2007 17:09

Re: Brauche Hilfe zu Threads
 
Delphi-Quellcode:
procedure TForm1.Timer2Timer(Sender: TObject);
var Now,hour,min,sec,msec: Word;
begin
// ######## Das Folgende ist nur ein vereinfachter Test mit 2 Zuständen####
//Pendel
DecodeTime(Now,hour,min,sec,msec);
now ist eine Funktion in Delphi, ich weiß nicht was passiert wenn
Du den gleichen Namen nochmals als Variable benutzt.

Vielleicht ist es besser so:
Delphi-Quellcode:
procedure TForm1.Timer2Timer(Sender: TObject);
var hour,min,sec,msec: Word;
begin
// ######## Das Folgende ist nur ein vereinfachter Test mit 2 Zuständen####
//Pendel
DecodeTime(Now,hour,min,sec,msec);
Grüße
Klaus

Oldjoe37 30. Dez 2007 17:35

Re: Brauche Hilfe zu Threads
 
Ich habe es auch mal ohne Now versucht, denn in der Hilfe steht nur DecodeTime(hour, min, sec, msec),
aber dann kann wegen "[Fehler] Uhr1.pas(124): Nicht genügend wirkliche Parameter" nicht kompiliert werden.
Merkwürdig, aber mit "now" wird kompiliert.

Zwischendurch möchte ich mich für Eure Geduld bedanken!

Klaus01 30. Dez 2007 17:40

Re: Brauche Hilfe zu Threads
 
Nun, decodeTime benötige auch fünf Parameter,
das habe ich auch nicht kritisiert.

Du kannst now weiterhin in DecodeTime verwenden,
aber schmeiß es doch einmal aus der Variablendeklaration raus.
So wie ich es vorherigen Beitrag geschrieben habe.

Grüße
Klaus

Oldjoe37 30. Dez 2007 17:50

Re: Brauche Hilfe zu Threads
 
Habe ich gemacht, ändert aber nichts am Problem.

Klaus01 30. Dez 2007 17:56

Re: Brauche Hilfe zu Threads
 
Das folgende pendelt bei mir aber richtig gut.

Grüße
Klaus
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var hour,min,sec,msec: Word;
begin
// ######## Das Folgende ist nur ein vereinfachter Test mit 2 Zuständen####
//Pendel
DecodeTime(Now,hour,min,sec,msec);
  Canvas.Pen.Width := 6;
  Canvas.Pen.Color := clBlack;
     if sec mod 2 = 1 then
       begin
          Canvas.Moveto(139, 215);
          Canvas.LineTo(157,348);
          Canvas.Ellipse(132,348,182,398);
          Canvas.Pen.Color:= clWhite;
          Canvas.Moveto(129, 215);
          Canvas.LineTo(112,348);
          Canvas.Ellipse(87,348,137,398);

       end
     else
       begin
         Canvas.Moveto(129, 215);
         Canvas.LineTo(112,348);
         Canvas.Ellipse(87,348,137,398);
         Canvas.Pen.Color:= clWhite;
         Canvas.Moveto(139, 215);
         Canvas.LineTo(157,348);
         Canvas.Ellipse(132,348,182,398);

       end;
end;

Oldjoe37 30. Dez 2007 18:05

Re: Brauche Hilfe zu Threads
 
Hallo Klaus01!

Vielen Dank für Deine Mühe! Ich probier es noch aus, muss aber erst mal den Haussegen retten.
Hat es auch zusammen mit einer Uhr geklappt?
Ich melde mich wieder.
Danke!
Jürgen

Oldjoe37 30. Dez 2007 18:56

Re: Brauche Hilfe zu Threads
 
Hallo Klaus01! :mrgreen:
Hurra!
Nachdem ich den Inhalt Deines Timers nicht als zweiten Timer, sondern in meinen Timer1 (hinter 'Sekundenzeiger') eingefügt habe, laufen endlich Uhr und - stark vereinfachtes - Pendel gleichzeitig.
Nun muss ich nur noch herausfinden, wo mein eigentlicher Fehler lag, und dann wird die Uhr noch aufgemotzt!

Ganz herzlichen Dank an Dich
und falls er noch einmal hier hereinschaut, auch an den 15-jährigen Apollonius.
So ein Forum ist eine feine Sache.
Jürgen

Oldjoe37 31. Dez 2007 07:31

Re: Brauche Hilfe zu Threads
 
Ursächlichen Fehler gefunden: Auswirkungen eines weiteren unbeachteten "Refresh" unterschätzt.
Den Fehler mache ich nicht noch mal, aber es gibt ja noch soooo viel andere!


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:23 Uhr.

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-2025 by Thomas Breitkreuz