AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi LeaveCriticalSection: Warum das nachfolgenden sleep(0)?

LeaveCriticalSection: Warum das nachfolgenden sleep(0)?

Ein Thema von Nogge · begonnen am 9. Apr 2006 · letzter Beitrag vom 1. Mai 2015
Antwort Antwort
Delphi-Laie

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

AW: LeaveCriticalSection: Warum das nachfolgenden sleep(0)?

  Alt 24. Apr 2015, 12:01
Das interessiert mich auch. Es scheint generell einen "stabilisierenden" Effekt zu haben.

In Luckies Script "Threads mit Delphi" ist auch ein solches sleep(0) hinter LeaveCriticalSection enthalten, leider steht dort nicht, warum.

Mit Delphi-4-Compilaten habe ich ohne dieses sleep(0) die meisten Probleme, aber nur auf Windows XP mit Zweikernprozessor. Delphi-2-Compilate sind ohne dieses sleep(0) stabiler, aber auch nicht ganz fehlerfrei. Mit diesem sleep(0) ist es mit den Delphi-2- und Delphi-4-Compilaten besser, aber auch nicht völlig stabil.

Überhaupt keine Probleme ohne dieses sleep(0) gibt es auf Einprozessorcomputern, mit Lazarus-Compilaten (!) auf besagtem 2-Kern-Windows-XP und mit allen Compilaten auf Windows 7 und 8.1.

Ob es unter Windows 2000 und NT auf 2- oder Mehrkernprozessoren problematisch ist, kann ich derzeit leider nicht prüfen.

Was auch gar nicht funktioniert, ist, zwei kritische Abschnitte ohne zwischengeschaltetes sleep(0) sequentiell auszuführen. Zwischen LeaveCriticalSection und nachfolgendem EnterCriticalSection sollte mindestens ein sleep(0) stehen.

Ergänzung: Aus demselben Quelltext XE2-Compilate (32 Bit) generiert, funktionieren diese auf dem Zweiprozessoren-XP fehlerfrei, und zwar sowohl mit als auch ohne hintenangestelltes sleep(0). Merkwürdig...

Geändert von Delphi-Laie (24. Apr 2015 um 12:28 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: LeaveCriticalSection: Warum das nachfolgenden sleep(0)?

  Alt 24. Apr 2015, 12:34
Delphi 2, Windows NT. Ernsthaft?

Sleep macht nichts anderes als die WinApi-Routine "Sleep" aufzurufen.

In der Doku dazu steht:´
Zitat:
A value of zero causes the thread to relinquish the remainder of its time slice to any other thread that is ready to run. If there are no other threads ready to run, the function returns immediately, and the thread continues execution.

Windows XP: A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If there are no other threads of equal priority ready to run, the function returns immediately, and the thread continues execution. This behavior changed starting with Windows Server 2003.
Also bis WinXP tut es entweder das, was TThread.Yield() macht, oder auch gar nichts. Je nachdem wie es lustig ist.
  Mit Zitat antworten Zitat
Antwort Antwort

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 05:07 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