AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Threadunterbrechung - nicht mit suspend
Thema durchsuchen
Ansicht
Themen-Optionen

Threadunterbrechung - nicht mit suspend

Ein Thema von Delphi-Laie · begonnen am 6. Mai 2015 · letzter Beitrag vom 10. Mai 2015
Antwort Antwort
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Threadunterbrechung - nicht mit suspend

  Alt 6. Mai 2015, 21:55
Wie extrem ist denn das Verhalten Deiner Anwendung denn unter Windows 7?
Hast Du nur "weniger" Parallelität oder laufen die Threads mehr oder weniger seriell ab?

Ich frage, weil ich mit dem klassischen Thread von Delphi (XE4 aufwärts) unter aktuellen Windows-Versionen stets das gewünschte parallele Verhalten erziele.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: Threadunterbrechung - nicht mit suspend

  Alt 6. Mai 2015, 22:05
Wie extrem ist denn das Verhalten Deiner Anwendung denn unter Windows 7?
Hast Du nur "weniger" Parallelität oder laufen die Threads mehr oder weniger seriell ab?

Ich frage, weil ich mit dem klassischen Thread von Delphi (XE4 aufwärts) unter aktuellen Windows-Versionen stets das gewünschte parallele Verhalten erziele.
Beim Multithreading-Quicksort war ich sogar schon mit dem Verhalten des Delphi-2-Compilates zufrieden, beim Multithreading-Mergesort benötigte ich Compilate ab Delphi 5, damit es auch auf XP ordnungsgemäß läuft.

Daniel, Du kannst es gern selbst ausprobieren, aber natürlich antworte ich auch: Auf Windows 7 ist es "extrem", denn da läuft - sichtbar - gar nichts mehr gleichzeitig, sondern nur noch sequentiell ab. Wie gesagt, auf XP war ich mit diesem Algorithmus rundum zufrieden, er lief genau so, wie ich es mir vorstellte. Wurde demnach wieder irgendetwas an Windows "rumgemacht"...
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

AW: Threadunterbrechung - nicht mit suspend

  Alt 6. Mai 2015, 22:15
Habe es soeben ausprobiert: Unter Windows XP ist die gleichzeitige Partitionierung der Teilmengen im parallelen Quicksort sogar auf Einkernprozessoren prinzipiell zu erkennen. Ist zwar ziemlich hakelig, ruckelig, langsam, schlichtweg eine Qual für Windows, aber es funktioniert.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Threadunterbrechung - nicht mit suspend

  Alt 6. Mai 2015, 22:34
Ich habe Dein Projekt mal eben mit XE8 übersetzt - und ja, da wird sehr gemütlich sortiert. Schön ein Segment nach dem anderen.
Ich habe allerdings Deine globale CriticalSection im Verdacht und wenn ich das richtig sehe, wartest Du zudem blockierend (pollend) auf die Threads (die Zeilen mit repeat-until). Einen Aufruf von "WaitForMultipleObjects()" beispielsweise suche ich vergebens.

Kurzum: Ich bin mir nicht sicher, ob das Problem wirklich an Windows liegt.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#5

AW: Threadunterbrechung - nicht mit suspend

  Alt 6. Mai 2015, 22:40
Danke für Deine Mühe und die helfenden Hinweise, Daniel! Damit werde ich mich beschäftigen.

Ich programmiere als Hobbyprogrammierer bei den meisten Sachen, so auch hier, ständig am Limit, durch Lesen und Lernen, Versuch und Irrtum, wie viele eben. Was meinst Du, wie froh ich war, es soweit hinbekommen zu haben?!

Ergänzung: Das Polling gefällt mir auch nicht, aber mit Messages kann es m.E. nicht funktionieren. Alles schon ausprobiert, gescheitert, durchdacht und verinnerlicht.

Geändert von Delphi-Laie ( 6. Mai 2015 um 22:44 Uhr)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Threadunterbrechung - nicht mit suspend

  Alt 6. Mai 2015, 22:52
Ja, das ist ein Knackpunkt, ging mir nicht anders - aber auch ein Durchbruch, wenn man es verinnerlicht hat.

Jeder Thread hat ein Handle. Die Idee ist es jetzt, die Threads zu starten und sich die Handles in einem Array zu merken. Dieses Array reicht man dann an eine API-Funktion wie "WaitForMultipleObjects()", die wartet, bis alle Threads fertig sind. Das Warten selbst ist zwar blockierend, verbraucht aber (so gut wie) keine CPU-Zyklen. Nach diesem Schema ist sichergestellt, dass alle Threads frei arbeiten können - im Rahmen dessen, was das Betriebssystem und der Prozessor eben hergeben. In diesem Fall dürfen sich die Threads allerdings nicht selbst freigeben, da Windows sonst keine Chance hat, deren Status abzufragen.

DP, EE und DT haben einige Einträge und Beispiele zu "WaitForMultipleObjects()". Ich empfand deren Lektüre als sehr erhellend.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

AW: Threadunterbrechung - nicht mit suspend

  Alt 6. Mai 2015, 22:55
Nochmals besten Dank!
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

AW: Threadunterbrechung - nicht mit suspend

  Alt 7. Mai 2015, 15:36
Hallo Daniel, ich möchte Dich als Administrator über Gebühr beanspruchen, aber dennoch noch etwas einwenden.

Dieses Array reicht man dann an eine API-Funktion wie "WaitForMultipleObjects()", die wartet, bis alle Threads fertig sind.
Das spielt bei diesem Algorithmus m.E. nicht die entscheidende Rolle. Jede (Teil-)Menge wird in eine große und kleine Teilmenge partitioniert und der Algorithmus auf beide mit je einem Extrathrad separat losgelassen. Da die beiden Teilmengen nichts mehr miteinander zu tun haben, dürfen auch die beiden Threads völlig unabhängig voneinander ihr Eigenleben entwickeln, den "Vaterthread" interessiert nur noch, ob bzw. daß die gestartet wurden. Vermutlich bist Du studierter Informatiker und weißt über die prinzipielle Funktionsweise dieses Sortieralgorithmus' bestens bescheid. Vor dem Problem, auf das Ende von (jeweils 2) Threads zu warten, um darauf zu reagieren, stand ich hingegen beim parallelen Mergesort, dort bekam ich es auf meine "Bastelweise" gelöst, unter allen mir zur Verfügung stehenden Windowsversionen.

Das Warten selbst ist zwar blockierend, verbraucht aber (so gut wie) keine CPU-Zyklen.
Gut, mein Polling blockiert auch, aber nur solang, bis der (jeweilige) "Tochterthread" gestartet ist. Das wartet keinesfalls, bis dessen Partitionierung oder gar dessen gesamter Code abgearbeitet ist.

Nach diesem Schema ist sichergestellt, dass alle Threads frei arbeiten können - im Rahmen dessen, was das Betriebssystem und der Prozessor eben hergeben.
Das ist bei meiner Lösung m.E. auch gegeben. Ich habe es genauer analysiert: (Jeweils) beide "Tochterthreads" starten (immer erst der linke, dann der rechte), was ich daran erkennen kann, daß es wie das Hornberger Schießen ausgeht, welchen Thread Windows daraufhin abarbeitet (also wiederum partitioniert): Mal ist es der linke, mal der rechte, aber eben immer nur einer zu jedem beliebigen Zeitpunkt. Und das trifft auf alle Threads zu: Windows (7) scheint immer nur einen Thread zu jedem beliebigen Zeitpunkt zur Abarbeitung freizugeben. Das ist das, was ich zuvor schrieb, daß etwas an der Threadablaufsteuerung gegenüber XP verändert worden sein muß. Schade, mir ist kein Taskmanager bekannt, der die Prozessorauslastung threadweise ermittelt bzw. anzeigt, aber in einem solchen müßte erkennbar sein, daß hierbei immer nur ein Thread just am Werkeln ist.

Vielleicht habe ich auch ein grundsätzliches Verständnisproblem und erwarte auch nicht, daß Du noch mehr Zeit in diese Diskussion investierst.

WaitForMultipleObjects werde ich natürlich weiterhin studieren.

Geändert von Delphi-Laie ( 7. Mai 2015 um 20:33 Uhr)
  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 06:55 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 by Thomas Breitkreuz