AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein 2dimensionales Array zu Pointer für Thread und Zugriff
Thema durchsuchen
Ansicht
Themen-Optionen

2dimensionales Array zu Pointer für Thread und Zugriff

Ein Thema von BAMatze · begonnen am 1. Jan 2009 · letzter Beitrag vom 2. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2      
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

2dimensionales Array zu Pointer für Thread und Zugriff

  Alt 1. Jan 2009, 16:12
Hallo noch mal an alle und gesundes Neues Jahr,

Ich hab eine Frage für den Pointer eines 2 Dimensionalen dynamischen Arrays den ich an ein Thread übergeben möchte und wie ich damit arbeiten kann. Ich weiß wenn ich ein Array erstelle ala
  MyArray: array of array of integer; dann sollte nach meinen Kenntnissen MyArray an sich gleich einen Pointer darstellen. Wenn ich diesen jetzt über:

  Threadhandle := CreateThread(nil, 0, @ThreadWelt, Welt, 0, TreadID); an mein Thread übergebe, könnte ich mir vorstellen, dass es funktioniert (bin mir aber vieleicht zu 20% sicher). Jetzt die eigentliche Frage, wie kann ich jetzt in meinem Thread darauf zugreifen? Ich habe gesehen, dass andere Speicher allochieren für ihre Pointer (bisher aber nur für einfache Variablen gesehen). Hoffe jemand kann mir einen Gedankenanstoß geben, für den Punkt an dem ich mich jetzt befinde.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#2

Re: 2dimensionales Array zu Pointer für Thread und Zugriff

  Alt 1. Jan 2009, 16:36
Der Zusammenhang zwischen "MyArray" und "Welt" geht aus deinem Post nicht so ganz hervor...

Und: Warum verwendest du CreateThread und nicht die vorhandene Thread-Klasse? Da wäre vieles einfacher und mit Pointern muss man sich da auch nicht rumschlagen, wenn man nicht möchte.
Uwe Raabe
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: 2dimensionales Array zu Pointer für Thread und Zugriff

  Alt 1. Jan 2009, 16:46
Du hast ja auch schon auf mein anderen Thread geantwortet. Welt stellt das 2dimensionale Array dar. Die Indizes sind die "Koordinaten". Könntest du mal ein kurzes Beispiel geben, wie man mir dem TThread arbeitet? Ich lese mir seid heute morgen Berichte über das Thema durch und bin noch nicht sehr viel schlauer geworden.

Danke
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: 2dimensionales Array zu Pointer für Thread und Zugriff

  Alt 1. Jan 2009, 16:59
Hallo,

so könnte das Grundgerüst Deiner Threadklasse ausschauen:

Delphi-Quellcode:
 
TDeinThread = class(TTHread)
  private
    // Thread variable
  protected
    procedure execute;override;
  public
    constructor create(init Parameter);
end;
Delphi-Quellcode:
constructor TDeinThread.create(init Parameter);
begin
  inherited create(false);
  // mache etwas mit den init Parametern
end;
Delphi-Quellcode:
procedure TDeinThread.execute;
begin
  while not terminated do
    begin
      // do some work
    end;
end;
.. aber ich denke nicht, dass Deine Simulation mit einem Thread schneller laufen wird.
Warum, Dein Programm hat quasi nur eine Aufgabe die "Lebewesen" über das Bitmap zu bewegen.
Aus meiner Sicht macht es hier dann wenig Sinn das in einen Thread auszulagern.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#5

Re: 2dimensionales Array zu Pointer für Thread und Zugriff

  Alt 1. Jan 2009, 17:09
Wenn es um deine Simulation geht, glaube ich auch, daß du dir mit einem Thread das Leben nur unötig schwer machst. Schneller wird deine Anwendung damit sicher nicht.
Uwe Raabe
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: 2dimensionales Array zu Pointer für Thread und Zugriff

  Alt 1. Jan 2009, 17:17
Hmm da hast du natürlich schon recht. Wobei jetzt eigentlich schon 2 Komponenten in dem Programm derzeit nacheinander ablaufen. Es wird die "Umwelt" verändert (das heißt Wasser und Nahrung wird hinzu gefügt) und die Lebewesen werden gesetzt. Du hast natürlich Recht, dass dabei die Berechnung der derzeitigen "Lebewesen" die meiste Rechenzeit verschlingt. Das Ziel soll ja eigentlich sein, eine 2. Lebensform hinzuzufürgen, die sich von der jetztigen ernährt und dann zu schauen, wie sich die Anzahlen der beiden Lebensformen verändern. Also muss nochmal soviel Rechenzeit verwendet werden. ICh weiß ich muss dafür sicherlich die Anzahl der "Lebensformen" insgesamt warscheinlich beschränken, Die Zyklen der Erneuerung der Welt und der Bewegungen der Lebewesen müssen angepasst werden, es muss sicherlich auch ein vieleicht sogar minutenlanges Intevall für die Gesamtberechnung vorgegeben werden, ...
Ich hoffe mit der Auslagerung der einzelnen Berechnungen (1. Thread = Welt, 2. Thread = Lebensform1, 3. Thread = Lebensform2) in die unterschiedlichen Threads kann ich eine Verbesserung der Rechnerperformence.
Vieleicht gibt es dafür ja auch noch andere Möglichkeiten. Bin für Vorschläge immer offen.

Danke
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: 2dimensionales Array zu Pointer für Thread und Zugriff

  Alt 1. Jan 2009, 18:02
.. beachte dann aber bitte das die GUI nicht threadsafe ist.
Auf GUI Elemente solltest/mußt Du mit synchronize zugreifen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#8

Re: 2dimensionales Array zu Pointer für Thread und Zugriff

  Alt 1. Jan 2009, 21:17
Die Anzahl der Berechnungen kannst du mit drei Threads nicht reduzieren. Mehr noch wird das ganze System langsamer laufen. da die einzelnen Threads auf gemeinsame Daten zugreifen und diese Zugriffe gegenseitig synchronisiert werden müssen. Ich bleibe dabei: mach alles im Hauptthread und du kommst besser dabei weg und wahrscheinlich schneller zum Ziel.
Uwe Raabe
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: 2dimensionales Array zu Pointer für Thread und Zugriff

  Alt 1. Jan 2009, 22:10
Also eigentlich greifen sie nur auf unterschiedlich Daten zu. Einmal gibt es einen Type-Strukt für die einzelnen Punkte auf der "Welt" dieser wird im 1. Thread geändert. Der 2.Type-Strukt enthält die Daten für die erste Lebensform dieser werden im 2. Thread geändert. Und für den 3. Type-Strukt und dem 3. Thread gilt das gleiche, wie bei den ersten beiden. Am Ende werden dann alle Daten zusammen gefügt. Und im letzten Schritt wird das alles komplett (Hauptthread) darzustellen. und bisher wird alles hintereinander berechnet.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#10

Re: 2dimensionales Array zu Pointer für Thread und Zugriff

  Alt 2. Jan 2009, 10:51
Zitat von BAMatze:
Also eigentlich greifen sie nur auf unterschiedlich Daten zu. Einmal gibt es einen Type-Strukt für die einzelnen Punkte auf der "Welt" dieser wird im 1. Thread geändert. Der 2.Type-Strukt enthält die Daten für die erste Lebensform dieser werden im 2. Thread geändert. Und für den 3. Type-Strukt und dem 3. Thread gilt das gleiche, wie bei den ersten beiden.
Soweit ich mich erinnere, verwendet die 1. Lebensform die Welt, um sich zu ernähren - damit hast du schon mal Zugriffe aus zwei Threads auf die Welt. Wenn sich die 2. Lebensform von der ersten ernährt, hast du selbiges. Ergo: die Zugriffe auf Welt und 1. Lebensform müssen gegenseitig synchronisiert werden.

Beispiel:
Welt_aendern erhöht die Nahrung an einem Ort. Währenddessen nimmt Lebensform 1 Nahrung von diesem Ort auf. Bei zwei Threads kann dir folgendes passieren:

a)
Thread1: Welt[i,j].iNahrung := Welt[i,j].iNahrung + random(3);
Thread2: Objekt.iNahrung := Objekt.iNahrung + Welt[Objekt.ix-1,Objekt.iy-1].iNahrung;
Thread2: Welt[Objekt.ix-1,Objekt.iy-1].iNahrung := 0;

b)
Thread2: Objekt.iNahrung := Objekt.iNahrung + Welt[Objekt.ix-1,Objekt.iy-1].iNahrung;
Thread1: Welt[i,j].iNahrung := Welt[i,j].iNahrung + random(3);
Thread2: Welt[Objekt.ix-1,Objekt.iy-1].iNahrung := 0;

c)
Thread2: Objekt.iNahrung := Objekt.iNahrung + Welt[Objekt.ix-1,Objekt.iy-1].iNahrung;
Thread2: Welt[Objekt.ix-1,Objekt.iy-1].iNahrung := 0;
Thread1: Welt[i,j].iNahrung := Welt[i,j].iNahrung + random(3);

Je nach Thread-Umschaltung bekommst du ein anderes Ergebnis. Im Fall b) verschwindet sogar Nahrung. Dieses Beispiel mag vielleicht nicht so schwere Folgen haben, aber es zeigt doch die Problematik auf.

Zitat von BAMatze:
Am Ende werden dann alle Daten zusammen gefügt. Und im letzten Schritt wird das alles komplett (Hauptthread) darzustellen.
Der Hauptthread kann erst mit der Darstellung beginnen, wenn alle anderen Threads mit ihren Berechnungen fertig sind. Zwischenzeitlich tut er so gut wie nichts. Während der Darstellung dürfen die anderen Threads aber nichts mehr an den Daten ändern. Du must den Zugriff also auch hier synchronisieren.

Zitat von BAMatze:
und bisher wird alles hintereinander berechnet.
Auf einem 1-Prozessorsystem wird auch alles hintereinander berechnet, nur nicht in der gleichen Reihenfolge. Der Overhead für die Thread-Umschaltung erhöht die gesamte Laufzeit allerdings. Du kannst also theoretisch nur dann an Laufzeit gewinnen, wenn mindestenes zwei Prozessoren gleichzeitig an deiner Simulation werkeln und der Overhead diesen Vorteil nicht auffrisst.

Ich bin grundsätzlich ein Freund von Threads, verwende sie aber meistens nur um die Berechnungen von der GUI zu trennen, damit die Anwendung auch noich bedienbar bleibt. Meistens erhält man damit auch eine einfache Möglichkeit, die Berechnung vorzeitig zu beenden.

Wenn schon Threads, dann wäre mein Vorschlag: Die gesamte Simulation in der Execute-Methode eines abgeleiteten TThread-Objekts zu verfrachten, für die Ausgabe werden in besteimmten Zeitabständen Bitmaps gemalt. Der Zugriff auf die Bitmap vom Hintergrund- und Hauptthread wird über ein geeignetes Objekt synchronisiert (z.B. CriticalSection). Die Aktualisierung des Treeviews würde ich komplett rausnehmen, da diese bei entsprechend vielen Elementen gehörig in die Knie geht. Für die verwendete Art der Darstellung täte es übrigens auch ein TMemo.
Uwe Raabe
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:49 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