Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi threads - Parallele Bewegungen von Objecten in einem Image (https://www.delphipraxis.net/89646-threads-parallele-bewegungen-von-objecten-einem-image.html)

Noobinator 3. Apr 2007 14:53


threads - Parallele Bewegungen von Objecten in einem Image
 
:hi: guguck.

Ich habe mal wieder ein Problem ^^

und zwar geht es momentan darum:

Ich habe eine unbekannte Anzahl vom Objekten die sich gleichzeitig über ein Image bewegen sollen.
also habe ich momentan:

Delphi-Quellcode:
a:=Tmyobject.mycreate(Bild,x,y);
a.bewege dich
freeandnil(a);
wenn ich jetzt aber nun das ganze so auf einen Button lege, und einmal klicke, dann erscheint ein Objekt und bewegt sich.
wenn ich nun in der Bewegung nochmal den button drücke, bleibt mein Object 1 stehen, und Object 2 bewegt sich.
nachdem Object 2 seine Bewegung beendet hat, bewegt sich Object 1 wieder weiter.

jetzt habe ich mich mal wieder ein bissl informiert, und das Thema Threads gefunden.
soweit habe ich verstanden, dass ich eine eigene Klasse erstellen muss abgeleitet von TThread.
aber wie nun weiter?

was muss ich mit der Klasse machen?
und geht mein Vorhaben denn über Threads?
wäre nett wenn ihr mir da mal ein bissl unter die arme greifen könntet.

sakura 3. Apr 2007 15:57

Re: threads
 
Erweitere mal den Titel - "Threads" - ist nicht sehr aussagekräftig.

Danke,
...:cat:...

DGL-luke 3. Apr 2007 16:02

Re: threads
 
per image wird das nicht funktionieren. weil das image eine nicht threadsichere vcl-komponente ist.

mach das nicht über threads, sondern per time-slicing und render-loop. wenn du z.B. alle 100ms dein Image updatest (wobei ich da sowieso gleich aufs form-canvas gehen würd), dann berechne einfach die positionen aller deiner objekte zu dem zeitpunkt und zeichne sie dann gleichzeiti.

Noobinator 3. Apr 2007 17:07

Re: threads
 
das neu Berechnen geht nicht, da ich ja eine unbekannte anzahl elemente habe.

Ich mache ja immer ein neues Object a.

wenn ich nun zwei habe, dann kann ich selber ja nicht mehr auf die erste zugreifen ;)
automatisch geht das aber schon, da ich ja in meiner Funktion immer ein Abbild des objectes Mache.

auf deutsch:

wenn ich
Delphi-Quellcode:
a:=Tmyobject.create; // 1. Object
a:=TmyObject.create; // 2. Object
mache, dann kann ich nur noch auf mein 2 zugreifen und mein 1 ist im Speichernirvana

Noobinator 4. Apr 2007 14:45

Re: threads - Parallele Bewegungen von Objecten in einem Ima
 
2 Fragen:

Delphi-Quellcode:
procedure machwas;
begin
   a:=myobject.create;
   a.bewege;
   freeAndNil(a);
end;

procedure form1.button1click(Sender:Tobject);
var hthread:Thandle;
    ThreadID:Cardinal;
begin
  hthread:=beginthread(nil,0,@machwas,nil,0,ThreadID);
end;
Soweit bin ich inzwischen dank google gekommen, aber irgendwie bekomme ich andauernd einen Speicherzugriffsfehler wenn ich das ausführe... also 1-2x geht es auch Parallel, aber dann haut er mich raus.
woran kann das liegen?

und 2:

Ich bewege ja meine objecte in einem Image immer hin und her.
gibt es eine elegantere Variante alles neu anzuzeigen, als immer das Hintergrundbild, und jedes object neu zu malen?

mit

image1.refresh und repaint geht es garnicht.
da zeigt er mir nichts an.

momentan lade ich immer alles neu

Delphi-Quellcode:
image1.picture.loadfromfile(bild);
image1.canvas.draw(x,y,objekt);
wenn man das mit 10 objecten Parallel macht, könnt ihr euch vorstellen, das das alles ein einziges geflimmer ist.

dino 4. Apr 2007 14:51

Re: threads - Parallele Bewegungen von Objecten in einem Ima
 
ich kenne mich jetzt nciht so doll damit aus, aber wäre es nicht grundsätzlich sinnvoller die threads so zu Programmieren, dass sie die Koordinaten in ein array oder sowas speichern und dass du dann im Hauptprogramm einfach aus dem array ein Bild zeichnest(z.B. k[1..2,1..100] also das erste ist x oder y und das 2. das wievielte objekt)

Noobinator 4. Apr 2007 14:59

Re: threads - Parallele Bewegungen von Objecten in einem Ima
 
Zitat:

Zitat von dino
ich kenne mich jetzt nciht so doll damit aus, aber wäre es nicht grundsätzlich sinnvoller die threads so zu Programmieren, dass sie die Koordinaten in ein array oder sowas speichern und dass du dann im Hauptprogramm einfach aus dem array ein Bild zeichnest(z.B. k[1..2,1..100] also das erste ist x oder y und das 2. das wievielte objekt)

hmm die Idee ist garnicht mal schlecht, aber meinst du nicht das es extreme Probleme gibt, wenn 10 Threads gleichzeitig in 1 Array schreiben ???
und für jeden Thread ein eigenes Array wird ziemlich Speicherlastig und nebenbei sind Arrayzugriffe auch nicht gerade die schnellsten.
wenn dann würde ich das ganze dynamisch mit ner Liste machen.

Der_Unwissende 4. Apr 2007 14:59

Re: threads - Parallele Bewegungen von Objecten in einem Ima
 
Zitat:

Zitat von Noobinator
Soweit bin ich inzwischen dank google gekommen, aber irgendwie bekomme ich andauernd einen Speicherzugriffsfehler wenn ich das ausführe... also 1-2x geht es auch Parallel, aber dann haut er mich raus.
woran kann das liegen?

Hi,
Du solltest auf gar keinen Fall VCL-Komponenten aus einem Thread heraus verändern. Da kommt nicht Dein Fehler her, die sind aber (wie bereits von DGL-Luke gesagt) nicht Threadsafe. Das heißt, mit etwas Pech verändern zwei Threads gleichzeitig Dein Bild und Du bekommst irgendwas zu sehen (nur nicht das was Du willst).

Den Fehler würde ich mal in Deiner globalen Variable a vermuten. Da es sich hier um eine globale Variable (und unsynchronisierte Threads) handelt, kann es dazu kommen, dass Du hier a in einem Thread frei gibst, während ein anderer danach a.bewege aufrufen möchte, was natürlich nicht funtkionieren kann.
An sich solltest Du aber ruhig auf TThread zurückgreifen, leistet das gleiche wie dein beginThread, kümmert sich aber auch um das saubere Beenden (und macht die Synchronisation leichter).

Gruß Der Unwissende

Noobinator 4. Apr 2007 15:05

Re: threads - Parallele Bewegungen von Objecten in einem Ima
 
Zitat:

Hi,
Du solltest auf gar keinen Fall VCL-Komponenten aus einem Thread heraus verändern. Da kommt nicht Dein Fehler her, die sind aber (wie bereits von DGL-Luke gesagt) nicht Threadsafe. Das heißt, mit etwas Pech verändern zwei Threads gleichzeitig Dein Bild und Du bekommst irgendwas zu sehen (nur nicht das was Du willst).

Den Fehler würde ich mal in Deiner globalen Variable a vermuten. Da es sich hier um eine globale Variable (und unsynchronisierte Threads) handelt, kann es dazu kommen, dass Du hier a in einem Thread frei gibst, während ein anderer danach a.bewege aufrufen möchte, was natürlich nicht funtkionieren kann.
An sich solltest Du aber ruhig auf TThread zurückgreifen, leistet das gleiche wie dein beginThread, kümmert sich aber auch um das saubere Beenden (und macht die Synchronisation leichter).

Gruß Der Unwissende
Danker erstmal für deine Antwort.
Das mit meiner Globalen Variable habe ich auch schon bemerkt, und das ganze mal abgeändert.

Delphi-Quellcode:
procedure machwas(x);
begin
   //Create ist hier nicht mehr erforderlich oder?
   x.bewege;
   freeAndNil(x);
end;

procedure form1.button1click(Sender:Tobject);
var hthread:Thandle;
    ThreadID:Cardinal;
begin
  hthread:=beginthread(nil,0,@machwas(x),nil,0,ThreadID);
end;
soweit so gut.
nur das ich bei beginthread keine proceduren mit Paramtern übergeben kann.

wie meinst du das mit TTHread?

könntest du das ganze vllt mal näher erläutern?
habe das erste mal mit Threads zu tun und demnach auch keine Ahnung :(

dino 4. Apr 2007 15:07

Re: threads - Parallele Bewegungen von Objecten in einem Ima
 
falls ein array threadsafe ist ists ok, doch auf jeden fall würde ich das zeichnen dem Hauptprogramm überlassen


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