Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit der Kommunikation zwischen den Threads (https://www.delphipraxis.net/80546-problem-mit-der-kommunikation-zwischen-den-threads.html)

nick-xyz- 10. Nov 2006 18:37


Problem mit der Kommunikation zwischen den Threads
 
Sobald ich mit der Methode Create meinen Thread erstell steigt die Systemleistung schlagartig auf 50-60% an obwohl er keinen Code auszuführen hat.
Ich hab ihn schon Suspended gestartet das brachte auch nichts. An der Priorität ändere ich nichts die lass ich standartmäßig.
Mir fällt nichts mehr ein was ich noch sagen könnte, also wenn ihr mehr Infos braucht sagt das bitte. Bin Delphie Neuling und ich kann das nicht so gut einschätzen. Ich hoffe auf eure Hilfe.

mfg nick-xyz-

EDIT: Also ich hab das Problem nicht mehr, irgendwas muss ich anders gemacht haben. Ich weiß nicht was! Allerdings muss ich die Methoden mit TThreadname.Methodenname statt mit Threadname.Methodenname ist das normal? Wie gesagt bin ziehmlicher Neuling.

mfg nick-xyz-

Sunlight7 10. Nov 2006 19:39

Re: Anstieg der Systemleistung beim Threadstart
 
Hallo!

Zitat:

Zitat von nick-xyz-
Bin Delphie Neuling...

Man merkts, das Du Delphie Neuling bist. :wink:



TThreadname.Methodenname ist nur erlaubt, wenn Du den Konstruktor .Create verwendest, sonst musst Du immer den Namen der Variable verwenden, den Du verwendet hast (es gibt kleine Ausnahmen, aber damit will ich Dich jetzt nicht verwirren).
Das gilt nicht nur für Threads!

Delphi-Quellcode:
   var MeinThread:TMeinThread;
begin
   MeinThread:=TMeinThread.Create; // <- Hier TMeinThread
   MeinThread.Resume; // Hier ohne T !
Wenn es Dir etwas hilft, kannst Du statt MeinThread einen anderen Namen verwenden, damit Du es nicht mit TMeinThread verwechselst. :wink:

zB:
Delphi-Quellcode:
   var Thread1:TMeinThread;
begin
   Thread1:=TMeinThread.Create;
   Thread1.Resume;
Grüßle!

nick-xyz- 11. Nov 2006 12:00

Re: Anstieg der Systemleistung beim Threadstart
 
Vielen, vielen Dank.
Es klappt jetze, aber was ich gerne verbessern würde ist folgendes: ich hab es jetze in jeder Prozedur in der ich die Befehle verwende neu deklariert, kann ich es nicht auch einmal global deklarieren, so dass ich nicht immer alles neu schreiben muss.

mfg nick-xyz-

Sunlight7 11. Nov 2006 13:43

Re: Anstieg der Systemleistung beim Threadstart
 
Wie meinen :?:

Du möchtest die Procedure, hier nachfolgend als "ErzeugeThread" genannt Global verwenden können?

Dann so:
Delphi-Quellcode:
Unit Irgendwas;

...

procedure ErzeugeThread; // Forward Deklaration

implementation

...

procedure ErzeugeThread; // Eigentliche Procedure
var Thread1:TMeinThread;
begin
   Thread1:=TMeinThread.Create;
   Thread1.Resume;
end;

nick-xyz- 11. Nov 2006 14:47

Re: Anstieg der Systemleistung beim Threadstart
 
Nein ich hab in jeder Prozedur in der ich irgendwelche Threadbefehle verwende folgenden code eingefügt (natürlich entsprechend abgeändert).
Delphi-Quellcode:
var Thread1:TMeinThread;
begin
   Thread1:=TMeinThread.Create;
   Thread1.Resume;
end;
Allerding suche ich jetze nach einer Möglichkeit, dass ich es nicht in jeder Prozedur erneut schreiben muss sondern einmal, so das ich es Überall verwenden kann in dieser Form.
Delphi-Quellcode:
Thread1.Resume
Ich möchte nicht immer die Variablen einführen und dann Thread1 die Create Methode zuweisen damit ich dann endlich meine Thread Anweisungen geben kann.

mfg nick-xyz-

Sunlight7 11. Nov 2006 15:05

Re: Anstieg der Systemleistung beim Threadstart
 
Dann ist klar, warum es nicht funktionieren kann, wenn Du jedesmal einen neuen Thread erstellst:

Wenn Du den Thread, oder sonst eine Klasse länger haben willst, dann mußt Du die Variable entweder Global, in der Unit oder einer anderen Komponente definieren.

Beispiel:

Delphi-Quellcode:
Unit Irgendwas;

...

var Thread1:TMeinThead; // Entweder hier (Global)

implementation

var Thread1:TMeinThead; // Oder hier (Privat in der Unit)
Oder:
Delphi-Quellcode:
Unit IrgendeineKomponente;

...

type
  TForm1 = class(TForm)
  private
    Thread1:TMeinThead; // Entweder hier (Privat)
  public
    Thread1:TMeinThead; // Oder hier (Von außerhalb zugreifbar)
  end;

...
Ich hoffe, ich hab Dich jetzt richtig verstanden.

nick-xyz- 11. Nov 2006 15:42

Re: Anstieg der Systemleistung beim Threadstart
 
So änhlich hatte ich es schonmal versucht da hatte es nicht geklappt weil ich ein paar Fehler reingebastelt hab. Dein Vorschlag klappt auch nicht richtig ich vermute weil ich die Thread unit nicht unter uses im deklarations Teil eingebunden hab sondern unter uses direkt unter Implementation (das ist dann Privat oder?) ich kann es allerdings nicht im deklarations Teil einbinden weil ich von in dem Thread auf meine Haupt Unit zugreifen muss und sich Delphi dann mit der Fehlermeldung 'Überkreuzender Bezug zweier Units auf HauptUnit' meldet. Und wenn ich die Haupt Unit in meinem Thread privat einbinde dann startet sich nicht mal meine Form beim Programm Start.

Hoffe ich konnte mein Problem jetze ausführlich schildern und hab auch die Zusammenhänge richtig gezogen. Wenn du irgendwas nicht richtig verstehst sag es einfach ich verusch mich dan neu zu formulieren.

mfg nick-xyz-

EDIT: Hab ein Fehler von mir gefunden.
Ich hab jetze die Thread Unit so eingebunden:
Delphi-Quellcode:
implementation

uses GhostKI;
var GhostKI : TGhostKI; //<-- hatte ich vorher vergessen
und in der Thred unit wird im deklarations Teil auf die Haup Unit verwiesen. Allerdings stürtzt das Programm immer noch ab ich versuche jetze rauszukriegen wann.

Sunlight7 11. Nov 2006 16:26

Re: Anstieg der Systemleistung beim Threadstart
 
Du könntest zB in der Unit, in der die Form ist:
Delphi-Quellcode:
...

implementation

{$R *.DFM}

uses
  IrgendEineUnit;

var
  Thread1:TMeinThread;

...
wenn Du sicher bist, das Thread1 nur einfach verwendet wird.

Dennoch:
1. Rufst Du Komponenten/Proceduren von dem Formular direkt auf?
Das solltest Du NUR mit Synchronize! :wink:

2. Man übergibt sich Pointer zu den Komponenten bei der Erstellung des Threads, um nicht von der Form(Kompos) abhängig zu sein.

Ändere doch bitte den Titel des Themas etwas, Dein Problem ist ein etwas anderes, als der Titel vermuten läßt :wink:

Edit: Seltenheitswert: Der rote Kasten war mal da :-D
Also guck mal, wie Du auf die Form zugreifst, das könnte den Absturzt erklären, bzw. wie oft erstellst Du den Thread?

nick-xyz- 11. Nov 2006 16:57

Re: Problem mit der Kommunikation zwischen den Threads
 
Ich greife auf ein paar Methoden von Selbsterstellten Objekten zu (wenn du das meintest). Ich hab es mal mit Synchronize versucht da kam die Fehlermeldung 'Es gibt keine überladene Version von Synchronize die man mit diesen Argumenten aufrufen kann' ich hab es so verwendet

Delphi-Quellcode:
 Synchronize(Form1.Canvas.Pixels[Variable1,Variable2]);
Das Programm stürzt dann ab wenn ich in der Form.Create Prozedur die Thread1.Create Methode ausführe.

mfg nick-xyz-

PS: ist der Thred Titel richtig gewählt?

Sunlight7 11. Nov 2006 17:05

Re: Problem mit der Kommunikation zwischen den Threads
 
Das ist klar, das die Meldung kommt.

Du mußt dazu eine neue Procedure im Thread schreiben und die mit Synchronize aufrufen:

In etwa so:
Delphi-Quellcode:
type
  TMeinThread = class(TThread)
  private
    procedure MachWas; // <- Forward Deklaration
  protected
    procedure Execute; override;
  end;

...

procedure TMeinThread.MachWas;
begin
   // Natürlich nicht so
   // Synchronize(Form1.Canvas.Pixels[Variable1,Variable2]);

   // So
   Form1.Canvas.Pixels[Variable1,Variable2];
end;

procedure TMeinThread.Execute;
...
begin
...
   Synchronize(MachWas);
...
end;
Und die Forward Deklaration nicht vergessen :wink:


PS: Titel ist OK.

Edit: Nonsens ausgebessert :oops:
Das kommt davon, wenn man abschreibt :mrgreen:


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