AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Problem mit der Kommunikation zwischen den Threads
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit der Kommunikation zwischen den Threads

Ein Thema von nick-xyz- · begonnen am 10. Nov 2006 · letzter Beitrag vom 11. Nov 2006
Antwort Antwort
Seite 1 von 2  1 2      
nick-xyz-

Registriert seit: 31. Mär 2006
11 Beiträge
 
Delphi 7 Personal
 
#1

Problem mit der Kommunikation zwischen den Threads

  Alt 10. Nov 2006, 18:37
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-
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#2

Re: Anstieg der Systemleistung beim Threadstart

  Alt 10. Nov 2006, 19:39
Hallo!

Zitat von nick-xyz-:
Bin Delphie Neuling...
Man merkts, das Du Delphie Neuling bist.



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.

zB:
Delphi-Quellcode:
   var Thread1:TMeinThread;
begin
   Thread1:=TMeinThread.Create;
   Thread1.Resume;
Grüßle!
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
nick-xyz-

Registriert seit: 31. Mär 2006
11 Beiträge
 
Delphi 7 Personal
 
#3

Re: Anstieg der Systemleistung beim Threadstart

  Alt 11. Nov 2006, 12:00
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-
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#4

Re: Anstieg der Systemleistung beim Threadstart

  Alt 11. Nov 2006, 13:43
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;
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
nick-xyz-

Registriert seit: 31. Mär 2006
11 Beiträge
 
Delphi 7 Personal
 
#5

Re: Anstieg der Systemleistung beim Threadstart

  Alt 11. Nov 2006, 14:47
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.
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-
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#6

Re: Anstieg der Systemleistung beim Threadstart

  Alt 11. Nov 2006, 15:05
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.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
nick-xyz-

Registriert seit: 31. Mär 2006
11 Beiträge
 
Delphi 7 Personal
 
#7

Re: Anstieg der Systemleistung beim Threadstart

  Alt 11. Nov 2006, 15:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#8

Re: Anstieg der Systemleistung beim Threadstart

  Alt 11. Nov 2006, 16:26
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!

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

Edit: Seltenheitswert: Der rote Kasten war mal da
Also guck mal, wie Du auf die Form zugreifst, das könnte den Absturzt erklären, bzw. wie oft erstellst Du den Thread?
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
nick-xyz-

Registriert seit: 31. Mär 2006
11 Beiträge
 
Delphi 7 Personal
 
#9

Re: Problem mit der Kommunikation zwischen den Threads

  Alt 11. Nov 2006, 16:57
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

 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?
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#10

Re: Problem mit der Kommunikation zwischen den Threads

  Alt 11. Nov 2006, 17:05
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


PS: Titel ist OK.

Edit: Nonsens ausgebessert
Das kommt davon, wenn man abschreibt
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  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 13:36 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