AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

mehrere Thread-Instanzen

Offene Frage von "gnr82"
Ein Thema von gnr82 · begonnen am 10. Okt 2007 · letzter Beitrag vom 11. Okt 2007
Antwort Antwort
Seite 1 von 2  1 2   
gnr82

Registriert seit: 8. Nov 2006
15 Beiträge
 
#1

mehrere Thread-Instanzen

  Alt 10. Okt 2007, 19:23
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!!!
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: mehrere Thread-Instanzen

  Alt 10. Okt 2007, 19:34
Wie viele elemente hat das Array? Du hast ein dynamisches Array definiert, dessen Länge Du zunächst mit SetLength festsetzt.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
441 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: mehrere Thread-Instanzen

  Alt 10. Okt 2007, 19:47
Die Threads sollten schon alle da sein, sie sind nur alle suspended
  Mit Zitat antworten Zitat
gnr82

Registriert seit: 8. Nov 2006
15 Beiträge
 
#4

Re: mehrere Thread-Instanzen

  Alt 10. Okt 2007, 21:26
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.
  Mit Zitat antworten Zitat
11. Okt 2007, 05:29
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
441 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: mehrere Thread-Instanzen

  Alt 11. Okt 2007, 06:47
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?)....
  Mit Zitat antworten Zitat
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: mehrere Thread-Instanzen

  Alt 11. Okt 2007, 12:36
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.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: mehrere Thread-Instanzen

  Alt 11. Okt 2007, 15:36
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???
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#9

Re: mehrere Thread-Instanzen

  Alt 11. Okt 2007, 16:05
nix Glaskugel. Kaffeesatz, Vogelflug, Innereien, Feuer, Knochenwerfen, da gibts viele nette Alternativen.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
gnr82

Registriert seit: 8. Nov 2006
15 Beiträge
 
#10

Re: mehrere Thread-Instanzen

  Alt 11. Okt 2007, 17:18
@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 ...
  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 03:35 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