![]() |
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:
wenn ich jetzt aber nun das ganze so auf einen Button lege, und einmal klicke, dann erscheint ein Objekt und bewegt sich.
a:=Tmyobject.mycreate(Bild,x,y);
a.bewege dich freeandnil(a); 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. |
Re: threads
Erweitere mal den Titel - "Threads" - ist nicht sehr aussagekräftig.
Danke, ...:cat:... |
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. |
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:
mache, dann kann ich nur noch auf mein 2 zugreifen und mein 1 ist im Speichernirvana
a:=Tmyobject.create; // 1. Object
a:=TmyObject.create; // 2. Object |
Re: threads - Parallele Bewegungen von Objecten in einem Ima
2 Fragen:
Delphi-Quellcode:
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.
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; 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:
wenn man das mit 10 objecten Parallel macht, könnt ihr euch vorstellen, das das alles ein einziges geflimmer ist.
image1.picture.loadfromfile(bild);
image1.canvas.draw(x,y,objekt); |
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)
|
Re: threads - Parallele Bewegungen von Objecten in einem Ima
Zitat:
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. |
Re: threads - Parallele Bewegungen von Objecten in einem Ima
Zitat:
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 |
Re: threads - Parallele Bewegungen von Objecten in einem Ima
Zitat:
Das mit meiner Globalen Variable habe ich auch schon bemerkt, und das ganze mal abgeändert.
Delphi-Quellcode:
soweit so gut.
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; 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 :( |
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 09:59 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