AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Brauche Hilfe zu Threads

Ein Thema von Oldjoe37 · begonnen am 30. Dez 2007 · letzter Beitrag vom 31. Dez 2007
Antwort Antwort
Seite 1 von 3  1 23      
Oldjoe37

Registriert seit: 28. Dez 2007
19 Beiträge
 
Delphi 5 Enterprise
 
#1

Brauche Hilfe zu Threads

  Alt 30. Dez 2007, 14:36
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)
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Brauche Hilfe zu Threads

  Alt 30. Dez 2007, 14:39
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?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Oldjoe37

Registriert seit: 28. Dez 2007
19 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: Brauche Hilfe zu Threads

  Alt 30. Dez 2007, 15:14
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).
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Brauche Hilfe zu Threads

  Alt 30. Dez 2007, 15:15
Zeige mal den Code von den Timern. Und vergiss bitte die Threads, denn in so einem Fall schaffen sie nur Ärger.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Oldjoe37

Registriert seit: 28. Dez 2007
19 Beiträge
 
Delphi 5 Enterprise
 
#5

Re: Brauche Hilfe zu Threads

  Alt 30. Dez 2007, 15:17
Hatte den zweiten Timer schon gelöscht. Muss ich erst wieder neu schreiben. Dauert ca 30 Minuten.
  Mit Zitat antworten Zitat
Oldjoe37

Registriert seit: 28. Dez 2007
19 Beiträge
 
Delphi 5 Enterprise
 
#6

Re: Brauche Hilfe zu Threads

  Alt 30. Dez 2007, 15:46
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.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Brauche Hilfe zu Threads

  Alt 30. Dez 2007, 15:55
Was sollte das Pendel denn sonst machen? Du hast in deinem Code ja nur zwei Zustände.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Oldjoe37

Registriert seit: 28. Dez 2007
19 Beiträge
 
Delphi 5 Enterprise
 
#8

Re: Brauche Hilfe zu Threads

  Alt 30. Dez 2007, 16:09
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.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Brauche Hilfe zu Threads

  Alt 30. Dez 2007, 16:13
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Oldjoe37

Registriert seit: 28. Dez 2007
19 Beiträge
 
Delphi 5 Enterprise
 
#10

Re: Brauche Hilfe zu Threads

  Alt 30. Dez 2007, 16:28
"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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:57 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