Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   mehrere Thread-Instanzen (https://www.delphipraxis.net/101284-mehrere-thread-instanzen.html)

gnr82 10. Okt 2007 19:23


mehrere Thread-Instanzen
 
Hallo,

ich hab folgendes Problem:

Ich hab einen Thread, welcher für die Datenerfassung eines Gerätes zuständig ist,das funktioniert auch tadellos. Allerdings möchte ich mehrere Geräte betreiben, d.h. ich hab ein array mit diesem thread. Beim Initialisieren wird auch jeder thread, wie es aussieht, kreiert. Allerdings ist dann tatsächlich nur einer diese Threads vorhanden.

Die Deklaration:
Delphi-Quellcode:
type datarray = record
  T, S     : Double;
  end;

type devicerec = record
  PORT     : TPort;
  BAUD     : TBaudRate;
  STOP     : TStopBits;
  DATA     : TDataBits;
  PARITY   : TParityBits;
  FLOW     : TFlowControl;
  end;

var devicearr : array of record
  STATE    : integer;
  THREAD   : devThread;
  DATA     : array of datarray;
  end;
Das Initialisieren:
Delphi-Quellcode:
for i := 0 to devcount-1 do
 with devicearr[i] do
  begin
  THREAD := devThread.create(i);
  STATE := 0;
  end;
Das kreieren des Threads:
Delphi-Quellcode:
constructor devThread.create(arrid:integer);
 begin
  inherited create(False);

 myid := arrid;
 end;
Vielen Dank für Eure Hilfe!!!

alzaimar 10. Okt 2007 19:34

Re: mehrere Thread-Instanzen
 
Wie viele elemente hat das Array? Du hast ein dynamisches Array definiert, dessen Länge Du zunächst mit SetLength festsetzt.

Whookie 10. Okt 2007 19:47

Re: mehrere Thread-Instanzen
 
Die Threads sollten schon alle da sein, sie sind nur alle suspended

gnr82 10. Okt 2007 21:26

Re: mehrere Thread-Instanzen
 
Es ist ein dynamische Array und ich setze die länge (der Einfachkeit halber) erstmal auf 2. Ich kreiere die Threads nicht suspended, mit nur einem Thread funktioniert es ja wunderbar! Die Threads sollten also sofort loslaufen.

DP-Maintenance 11. Okt 2007 05:29

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage

Whookie 11. Okt 2007 06:47

Re: mehrere Thread-Instanzen
 
Sorry mein Fehler ;) war wohl schon zu spät für eine Vernünftige Antwort!
Also zu den dynamischen Arrays würde ich dir folgendes empfehlen:

Delphi-Quellcode:
for i := Low(devicearr) to high(devicearr) do
begin
  ...
end;
Damit bist Du immer auf der sicheren Seite!

Wenn das alles passt ist die nächste Frage natürlich was du in deinem Thread eigentlich machst, denn es könnte sein, dass deine Threads einfach gleich wieder beendet werden (ich nehm mal an WaitCommEvent?)....

OlafSt 11. Okt 2007 12:36

Re: mehrere Thread-Instanzen
 
Blanke Spekulation: Wenn die Threads allesamt sofort loslaufen, hast du doch keine Chance, ihnen jeweils einen anderen Comport zuzuweisen... Sie greifen also alle auf den selben COM zu - was evtl zu einer Exception führt und den Thread sofort wieder abbricht - oder du hast den Fall abgefangen und beendest den Thread ordentlich.

So oder so werden die Threads sofort terminiert und aus dem Speicher geworfen - existieren also nur ein paar Millisekunden.

alzaimar 11. Okt 2007 15:36

Re: mehrere Thread-Instanzen
 
Zitat:

Zitat von OlafSt
Blanke Spekulation: Wenn die Threads allesamt sofort loslaufen, hast du doch keine Chance, ihnen jeweils einen anderen Comport zuzuweisen... Sie greifen also alle auf den selben COM zu - was evtl zu einer Exception führt und den Thread sofort wieder abbricht - oder du hast den Fall abgefangen und beendest den Thread ordentlich.

So oder so werden die Threads sofort terminiert und aus dem Speicher geworfen - existieren also nur ein paar Millisekunden.

Wow! Wo habt ihr denn Eure Glaskugeln her? Meine ist undurchsichtig, und ohne Code, speziell von den Threads, kann ich so eine Aussage nicht treffen.

Also: Wo gibts die Glaskugeln???

Sidorion 11. Okt 2007 16:05

Re: mehrere Thread-Instanzen
 
nix Glaskugel. Kaffeesatz, Vogelflug, Innereien, Feuer, Knochenwerfen, da gibts viele nette Alternativen.

gnr82 11. Okt 2007 17:18

Re: mehrere Thread-Instanzen
 
@Whookie: Die beiden Threads werden schon richtig erzeugt, dass kann ich nachvollziehen, da ich einen überlagerten Constructor hab und der auch 2x aufgerufen wird. Die Threads sollten auch nicht einfach so beendet werden. Der Constructor und das Execute des Threads:
Delphi-Quellcode:
constructor devThread.create(arrid:integer);
 begin
  inherited create(False);

 myid := arrid;

 mycport := TComPort.Create(nil);
 mycport.Port := devicearr[myid].SETTINGS.PORT;
 mycport.BaudRate := devicearr[myid].SETTINGS.BAUD;
 mycport.Parity.Bits := devicearr[myid].SETTINGS.PARITY;
 mycport.StopBits := devicearr[myid].SETTINGS.STOP;
 mycport.DataBits := devicearr[myid].SETTINGS.DATA;
 mycport.FlowControl.FlowControl := devicearr[myid].SETTINGS.FLOW;
 mycport.Events := [evRXChar,evRXFlag];
 mycport.OnAfterOpen := afteropen;
 mycport.OnRxChar := reseive;

 end;

procedure devThread.Execute;
 begin
  { Thread-Code hier einfügen }
  while not terminated do
  begin
  mystate := devicearr[myid].STATE;

  sleep(1);
  end;
 end;
@OlafSt: Der Com-Port wird nicht beim kreieren des Threads geöffnet, daran kann es also nicht liegen.

Wie gesagt: Der constructor Create wird ordentlich gestartet nur wird immer das Execute der zuletzt kreierten Threads durchlaufen.

Das ist alles sehr seltsam ... :pale:


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