AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi threads - Parallele Bewegungen von Objecten in einem Image

threads - Parallele Bewegungen von Objecten in einem Image

Ein Thema von Noobinator · begonnen am 3. Apr 2007 · letzter Beitrag vom 6. Apr 2007
Antwort Antwort
Seite 1 von 2  1 2   
Noobinator

Registriert seit: 9. Mai 2006
147 Beiträge
 
Delphi 7 Personal
 
#1

threads - Parallele Bewegungen von Objecten in einem Image

  Alt 3. Apr 2007, 14:53
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.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: threads

  Alt 3. Apr 2007, 15:57
Erweitere mal den Titel - "Threads" - ist nicht sehr aussagekräftig.

Danke,
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#3

Re: threads

  Alt 3. Apr 2007, 16:02
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.
Lukas Erlacher
  Mit Zitat antworten Zitat
Noobinator

Registriert seit: 9. Mai 2006
147 Beiträge
 
Delphi 7 Personal
 
#4

Re: threads

  Alt 3. Apr 2007, 17:07
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
  Mit Zitat antworten Zitat
Noobinator

Registriert seit: 9. Mai 2006
147 Beiträge
 
Delphi 7 Personal
 
#5

Re: threads - Parallele Bewegungen von Objecten in einem Ima

  Alt 4. Apr 2007, 14:45
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.
  Mit Zitat antworten Zitat
dino

Registriert seit: 15. Jul 2006
Ort: Bad Münstereifel
627 Beiträge
 
Delphi 5 Professional
 
#6

Re: threads - Parallele Bewegungen von Objecten in einem Ima

  Alt 4. Apr 2007, 14:51
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)
  Mit Zitat antworten Zitat
Noobinator

Registriert seit: 9. Mai 2006
147 Beiträge
 
Delphi 7 Personal
 
#7

Re: threads - Parallele Bewegungen von Objecten in einem Ima

  Alt 4. Apr 2007, 14:59
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.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#8

Re: threads - Parallele Bewegungen von Objecten in einem Ima

  Alt 4. Apr 2007, 14:59
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
  Mit Zitat antworten Zitat
Noobinator

Registriert seit: 9. Mai 2006
147 Beiträge
 
Delphi 7 Personal
 
#9

Re: threads - Parallele Bewegungen von Objecten in einem Ima

  Alt 4. Apr 2007, 15:05
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
  Mit Zitat antworten Zitat
dino

Registriert seit: 15. Jul 2006
Ort: Bad Münstereifel
627 Beiträge
 
Delphi 5 Professional
 
#10

Re: threads - Parallele Bewegungen von Objecten in einem Ima

  Alt 4. Apr 2007, 15:07
falls ein array threadsafe ist ists ok, doch auf jeden fall würde ich das zeichnen dem Hauptprogramm überlassen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:07 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