Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Threads werden automatisch beendet (https://www.delphipraxis.net/51807-threads-werden-automatisch-beendet.html)

BlackJack 19. Aug 2005 11:47

Re: Threads werden automatisch beendet
 
poste am besten mal ein bisschen code, vor allem die stellen, an denen die Threads erstellt, gestartet, beendet und wieder freigegeben werden.

aber mal ne ganz andere frage: wo kann man im Taskmanager denn sehen, wie viele Threads ein Programm benutzt?

Olli 19. Aug 2005 11:52

Re: Threads werden automatisch beendet
 
Zitat:

Zitat von der_boss
Delphi-Quellcode:
while(true) do begin
  while not terminated do begin
  end;
  suspend;
end; // forever

Der kommt aus der inneren Schleife nicht mehr raus, warum sollte das also funzen?
Nachtrag: Du wolltest doch den Thread quasi nur nach jedem Schleifendurchgang schlafenlegen? Dann mach's wie ich es oben gezeigt habe.

Zitat:

Zitat von BlackJack
aber mal ne ganz andere frage: wo kann man im Taskmanager denn sehen, wie viele Threads ein Programm benutzt?

Kannst du als Spalte auswählen. Noch besser ist aber der Process Explorer.

der_boss 19. Aug 2005 12:03

Re: Threads werden automatisch beendet
 
Also, hier der Text des Threads:

Delphi-Quellcode:
procedure Mythread.Execute;
var
  fehlerzaehler:integer;
  instream,weitergabe:tArray;
begin
  SetName;
  fehlerzaehler:=0;
  setlength(instream,0);setlength(instream,c_laen);
  setlength(weitergabe,0);setlength(weitergabe,c_laen);
    while not terminated do begin
      if UsbParIn(c_DevNum,instream,c_laen) then begin
        fehlerzaehler:=instream[0];
        weitergabe:=instream;
        //DarstThread.Resume;
       end
      else begin
        inc(fehlerzaehler);
        if fehlerzaehler=3 then begin
          Synchronize(Neu_beginnen);  //hauptform benachrichtigen
        end;
      end;
    { Thread-Code hier einfügen }
    end;
    ReturnValue:=3;
end;
Ich hab jetzt FreeOnterminate:=true gesetzt. Und create nen neuen Thread, wenn die Messung/der Thread wieder aufgenommen werden sollen.
Seht ihr noch ne andere Möglichkeit den Thread am Ende der Schleife zu unterbrechen und von dort wieder loslaufen zu lassen?

Olli 19. Aug 2005 12:09

Re: Threads werden automatisch beendet
 
Zitat:

Zitat von der_boss
Seht ihr noch ne andere Möglichkeit den Thread am Ende der Schleife zu unterbrechen und von dort wieder loslaufen zu lassen?

Nein, habe sie nur mehrfach oben erwähnt. Danke für's ignorieren - so macht helfen Spaß :?

der_boss 19. Aug 2005 13:44

Re: Threads werden automatisch beendet
 
danke, olli, aber leider kann ich nicht suspend benutzen, da der eine befehl erst vollständig abgearbeitet werden muss.

Ich habe das Problem jetzt anders gelöst, nun steht aber ein neues:

wie würdet ihr denn dem einen thread, der schneller ist, von einem langsameren thread ein datenpaket konfliktfrei übermitteln, ohne dass der langsamere dazu angehalten oder synchronisiert werden muss?

der langsamere (Messung) soll weiterlaufen, ohne unterbrechung, während der schnellere fix die grafik aktualisiert. dazu muss ich ein paket (array of word) übergeben.

Danke, euch fleiß'gen Helfern!!

SirThornberry 19. Aug 2005 13:56

Re: Threads werden automatisch beendet
 
mir kommt es so vor als ob du nicht ganz verstehst was ein Thread ist bzw. wie er funktioniert. Es macht absolut keinen Sinnn innerhalb eine Threads suspend aufzurufen. Denn wenn man einen Thread schlafen schickt dann läuft dieser nicht und kann somit nicht suspend aufrufen, das suspend muss also wenn dann von außerhalb aufgerufen werden.
Und einen Thread am Ende der schleife anhalten kannst du ganz einfach mit sleep und ähnlichen Funktionen...

[Edit]Der Inhalt des Beitrages ist falsch!! Ich hatte Suspend mit Resume verwechselt[/Edit]

der_boss 19. Aug 2005 14:04

Re: Threads werden automatisch beendet
 
hey, kann sein, dass ich nicht alles verstehe, aber das wolltest du mir nicht vorwerfen, oder?

hast du nicht lieber eine lösung, für mein problem, "quasiparallele abarbeitung" der Messwerterfassung und Grafikaktualisierung?

die messwerte müssen ja dazu an den thread "grafikaktualisierung" übermittelt werden, der dann die daten auch auf die platte schmeißt. ??

Danke dir, Sir

BlackJack 19. Aug 2005 14:17

Re: Threads werden automatisch beendet
 
du holst dir einfach jede sekunde mit einem Timer in deinem Hauptprogramm die Daten und zeichnest aus denen das Diagramm. und wenn die Messungen sehr zeitkritsch sind, lässt du die halt weiterhin in einem thread machen.

also so:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
  var Daten: TDaten;
  begin
  Daten := RechenThread.GetDaten;
  Self.DrawDiagram(Daten);
  end;

Olli 19. Aug 2005 19:31

Re: Threads werden automatisch beendet
 
Zitat:

Zitat von der_boss
danke, olli, aber leider kann ich nicht suspend benutzen, da der eine befehl erst vollständig abgearbeitet werden muss.

Wieso? Der Thread legt sich doch selber schlafen. Er ist also wirklich erstmal eine Runde durchgegangen und dann legt er sich selber schlafen. Also kannst du es doch so einrichten, daß vor dem Suspend aber innerhalb der Schleife alles erledigt wird.

Zitat:

Zitat von der_boss
wie würdet ihr denn dem einen thread, der schneller ist, von einem langsameren thread ein datenpaket konfliktfrei übermitteln, ohne dass der langsamere dazu angehalten oder synchronisiert werden muss?

Ohne Synchronisation geht das nicht. Selbst bei einem DWORD-Wert solltest du synchronisieren, das geht aber auch leichter als über Critical Sections oder so.

Zitat:

Zitat von der_boss
der langsamere (Messung) soll weiterlaufen, ohne unterbrechung, während der schnellere fix die grafik aktualisiert. dazu muss ich ein paket (array of word) übergeben.

Benutz' eine Art Ringpuffer. Während der schnellere Thread immer wieder den aktuell unbenutzen Ringpufferteil ausliest, kann der langsamere Thread den nächsten Ringpufferteil beschreiben.

@BlackJack: a.) geht auch das nicht ohne Synchronisation, b.) bitte keine Timer. Wenn er schon Threads benutzt, dann auch konsequent. Da wären Timer nur Ressourcenverschwendung.

alzaimar 19. Aug 2005 19:50

Re: Threads werden automatisch beendet
 
Um Threads zu synchronisieren, verwendet man Synchronisierungsobjekte, also Semaphoren, Mutexe, events etc. Schau mal in der OH oder in der WinAPI-Hilfe nach CreateSemaphore.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz