AGB  ·  Datenschutz  ·  Impressum  







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

Threadunterbrechung - nicht mit suspend

Ein Thema von Delphi-Laie · begonnen am 6. Mai 2015 · letzter Beitrag vom 10. Mai 2015
Antwort Antwort
Seite 1 von 3  1 23   
Delphi-Laie

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

Threadunterbrechung - nicht mit suspend

  Alt 6. Mai 2015, 21:11
Hallo Delphifreunde!

Bekanntlich entscheidet Windows nach eigenem Gutdünken, wann und an welcher Stelle es Threads unterbricht und wann später an derselben Stelle (also dem nachfolgenden Befehl des letzten vor der Unterbrechung abgearbeiteten Befehls) fortsetzt.

Gibt es eine Möglichkeit, Windows an einer bestimmten Stelle zur Unterbrechung eines Threads (des eigenen Threads) aufzufordern (API-Befehl)?

Davon unbeschadet, kann und wird Windows diesen Thread natürlich auch an anderen Stellen unterbrechen, das soll und kann gar nicht verhindert werden.

Ich meine jetzt nicht das Befehlspaar suspend - resume, denn das erfordert ein separates Wiederaufnehmen des Thread von anderer Stelle (also aus einem anderen Thread), wenn ich das richtig verstanden habe. Windows kann und soll den Thread, der an definierter Stelle um seine Unterbrechung bat, eigenverantwortlich später wieder aktivieren.

Vielen Dank und Gruß

Delphi-Laie
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Threadunterbrechung - nicht mit suspend

  Alt 6. Mai 2015, 21:14
Das macht Delphi-Referenz durchsuchenTThread.Yield
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  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, 21:18
Danke!

Das erinnert mich an die jüngste Diskussion mit dem sleep(0) nach LeaveCriticalSection. Mit sleep(0) experimentierte ich an diesen Stellen (die kein Ende kritischer Abschnitte sind) auch schon, allerdings nicht mit zufriedenstellendem Ergebnis.

Muß ich mal herausfinden, ab welcher Delphiversion das Yield bereitgestellt wird und wie das ggf. in niedrigere Delphiversionen eingearbeitet werden kann. Hoffentlich funktionerte es damit besser.

Nochmals besten Dank!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Threadunterbrechung - nicht mit suspend

  Alt 6. Mai 2015, 21:27
Und warum willst du, dass der Thread an einer bestimmten Stelle unterbrochen wird? Mir erschließt sich nicht so ganz der Sinn dabei.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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, 21:37
So, Yield hat intern auch nur ein sleep(x). Das Ergebnis ist mithin leider das gleiche wie mit sleep(0).

Und warum willst du, dass der Thread an einer bestimmten Stelle unterbrochen wird? Mir erschließt sich nicht so ganz der Sinn dabei.
Luckie, das kannst Du gern wissen: Besorg Dir eines meiner aktuellen Sortierkinos und lasse den Algorithmus "Quicksort parallel (Multithreading)" auf zwei verschiedenen Windows mit Mehrkernprozessor ablaufen, eines bis XP, eines danach (meine Experimentierfelder sind einmal XP und dann noch ein Windows 7, auf 8.1 könnte ich es auch mal testen). Um besser zu sehen, worauf es mir ankommt, solltest Du die Darstellung ausbremsen.

Während auf XP die zeitliche Parallelität gut zu erkennen ist (gleichzeitige Partionierung der Sortierteilmengen), ist es auf Windows 7 anders: Da wird immer nur eine Teilmenge partitioniert, und das, obwohl mehrere bis etliche Threads gleichzeitig am Laufen sind (eigentlich). Das ist im Vergleich zu vorher unschön, schlichtweg ein Rückschritt. Irgendetwas ist auf Windows 7 (vermutlich ab Vista) in der Threadablaufsteuerung anders. Nun dachte und hoffte ich, daß man mit "provozierten" Threadunterbrechungen Windows (7) zu mehr Gleichzeitigkeit, die man optimalerweise sogar sehen könnte, bewegen könnte, aber leider Fehlanzeige. Muß es also erstmal so bleiben, wie es ist.

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

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

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
Admin Delphi-PRAXiS
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: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
 
#8

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
(Administrator)

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

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
Admin Delphi-PRAXiS
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
 
#10

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
Antwort Antwort
Seite 1 von 3  1 23   

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 12:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf