AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TThread, TTask usw. oder OmniThreadLibrary?

Ein Thema von Glados · begonnen am 19. Okt 2017 · letzter Beitrag vom 20. Okt 2017
Antwort Antwort
Glados
(Gast)

n/a Beiträge
 
#1

AW: TThread, TTask usw. oder OmniThreadLibrary?

  Alt 19. Okt 2017, 11:55
Genau wegen des Multithreading habe ich gerade nämlich Probleme. Daher dachte ich OTL kann mir helfen?

- Button-Klick
-- repeat-Schleife 0 bis ListView-Items-Select-Count
--- Mache XY mit Daten Listview-Eintrag-N
---- Erstelle Threads (mehrere) für Arbeit XY
---- solange XY läuft, warte mit einer while-Schleife (!)
---- Wenn XY fertig, führe ein paar Prozeduren aus, um aufzuräumen
-- Arbeit fertig, zurück in repeat-until
- gehe wieder nach oben und fange erneut an

Nachdem ich alle Threads erstellt habe, muss ich ja irgendwie auf deren Beendigung warten und lauschen. Das mache ich aktuell mit einer while-Schleife.
Ich inkrementiere eine Variable bei jedem Erzeugen eines Threads. Wenn ein Thread sich beendet, wird diese Variable dekrementiert.
Die while-Schleife lauscht nun, bis die Variable = 0 ist. Erst dann werden weitere Prozeduren zum Aufräumen gestartet. Sind die durch, fängt der Spaß erneut an.

Kann ich hier nicht mit Messages arbeiten, damit zumindest schon einmal die while-Schleife wegbekomme?
Ich bin aktuell in der Lage zu sehen, welcher Thread der letzte Thread ist. Der könnte doch eine Message irgendwohin schicken?
Nur wie warte ich dann in der repeat-until-Schleife?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TThread, TTask usw. oder OmniThreadLibrary?

  Alt 19. Okt 2017, 12:31
Warte doch gar nicht, sondern lass dich vom fertigen Thread benachrichtigen!

Beschäftige dich mal hiermit:
http://docwiki.embarcadero.com/Libra...ad.OnTerminate
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#3

AW: TThread, TTask usw. oder OmniThreadLibrary?

  Alt 19. Okt 2017, 12:38
Ohne das Problem auch nur ansatzweise analysiert zu haben, fällt mir hier der TOmniEventMonitor ein, eine Komponente auf deinem Form/Datenmodul die event-gesteuert dies erledigen könnte. Aber wie immer bei solchen Problemen ist eine pauschale Aussage nicht wirklich sinnvoll. Dazu müsste man den Anwendungsfall schon im Detail kennen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.811 Beiträge
 
Delphi 12 Athens
 
#4

AW: TThread, TTask usw. oder OmniThreadLibrary?

  Alt 19. Okt 2017, 13:14
Ich würde erstmal mit den Bordmitteln anfangen, und deren Grenzen ausloten. Wenn alles geht ist gut, falls das nicht ausreicht, weiter zu den Kanonen. Ich finde die PPL schon sehr gut.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#5

AW: TThread, TTask usw. oder OmniThreadLibrary?

  Alt 19. Okt 2017, 15:45
Ein Problem gibt es aktuell keins. Während Arbeit XY, die vom Hauptthread aus gestartet wird, kann man die GUI trotzdem weiter benutzen.
Aber man hängt bis zur Beendigung trotzdem in diesem Button fest.

Ich habe schon versucht einfach alles vom ButtonClick sowie die Arbeit XY in einen Thread zu packen aber das gibt ab und zu hässliche Grafikprobleme. Beispielsweise Labels wo die Caption-Font plötzlich doppelt so groß ist und auch andere Probleme, an die ich mich aber nicht mehr erinnern kann.

Was die Boardmittel angeht: angenommen es soll 5x XY ausgeführt werden (Button > repeat ProcXY (Threads erstellen und WARTEN); ProcSäuberungsarbeiten; until N = 5).
Könnte ich die WARTEN-Sektion nach XY entfernen und eine Message an meinen MessageHandler schicken, der dann anschließend ProcSäuberungsarbeiten aufruft?
Nur wie würde ich das mit der repeat-until-Schleife vereinbaren?

Geändert von Glados (19. Okt 2017 um 16:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: TThread, TTask usw. oder OmniThreadLibrary?

  Alt 19. Okt 2017, 16:50
Vllt ist für das warten das OnTerminate-Event von TThread das was du brauchst. Du erstellst den Thread, weist das Event zu, startest den Thread und der Button-Klick ist beendet.
Wenn dann der Thread fertig ist landest du automatisch in deinem Eventhandler für OnTerminate und kannst abschließende Sachen machen.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#7

AW: TThread, TTask usw. oder OmniThreadLibrary?

  Alt 19. Okt 2017, 16:57
Auf diese Art und Weise bekäme ich die while-Schleife weg. Gute Idee! Werde ich heute Abend mal testen, nachdem ich einen nervigen Bug entfernt habe (hoffentlich).

Wie könnte ich das denn mit der repeat-until-Schleife machen wenn mit nur einem Button-Klick mehrmals XY ausgeführt werden soll?
Die while-Schleife in XY ist ja aktuell dafür da, um die repeat-until-Schleife so lange still zu legen, bis Arbeit XY fertig ist.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: TThread, TTask usw. oder OmniThreadLibrary?

  Alt 19. Okt 2017, 17:02
Kannst du vllt mal kurz genauer erklären was du vorhast?
Das klingt jetzt irgendwie so als sollte das was im Button steht dauerhaft ausgeführt werden nachdem man den Button einmal geklickt hat?

Also einmal draufklicken und dann wiederholt er etwas unendlich lange (bzw. bis der Benutzer das irgendwie anders abbricht)?

In dem Fall müsste die ganze (endlos-)Schleife in einen eigenen Thread.
Bei deinem Codeschnipsel müsstest du aber aufpassen dass du dann da nicht auf GUI-Elemente zugreifen darfst.

Generell bin ich mir nicht sicher ob du da tatsächlich mehrere Threads oder vllt überhaupt Threads brauchst.
Unterm Strich: Kannst du etwas genauer erklären was du vor hast? Das ist grad alles etwas verwirrend und man kann nur grob erahnen was du da vor hast bzw. was du brauchst.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: TThread, TTask usw. oder OmniThreadLibrary?

  Alt 20. Okt 2017, 08:45
Warte doch gar nicht, sondern lass dich vom fertigen Thread benachrichtigen!

Beschäftige dich mal hiermit:
http://docwiki.embarcadero.com/Libra...ad.OnTerminate
Vllt ist für das warten das OnTerminate-Event von TThread das was du brauchst. Du erstellst den Thread, weist das Event zu, startest den Thread und der Button-Klick ist beendet.
Wenn dann der Thread fertig ist landest du automatisch in deinem Eventhandler für OnTerminate und kannst abschließende Sachen machen.
Auf diese Art und Weise bekäme ich die while-Schleife weg. Gute Idee! Werde ich heute Abend mal testen, nachdem ich einen nervigen Bug entfernt habe (hoffentlich).

Das nächste Mal schreibe ich einfach in großer, rot blinkender Schrift...
Man muss auf die Links auch klicken, lesen und verstehen.
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:04 Uhr.
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