AGB  ·  Datenschutz  ·  Impressum  







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

W1000 Symbol 'Resume' ist veraltet ????

Ein Thema von RaSoWa1 · begonnen am 28. Mär 2010 · letzter Beitrag vom 24. Aug 2011
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 23. Aug 2011, 12:17
Zitat:
Statt .Resume nutzt man jetzt .Start
und .Suspend gibt es nicht mehr ... auch keinen Ersatz dafür.
Danke.. Ja das habe ich gelesen.
Geben tut es das schon noch man soll es halt möglichst nicht mehr verwenden.

Einen Ansatz einer möglichen Lösung hat Tryer ja schon gepostet (danke)
Prüfe gerade ob man es für jede auftretende Sitution verwenden kann.

PS:
Das mit Suspend erklärt vielleicht meine sporadisch auftretenden hänger
wenn ich von einem zum anderen Plugin schalte.

Edit:
Also das mit Start kannst auch vergessen auch kein ersatz für Resume.
Zitat:
Erste Gelegenheit für Exception bei $7597B9BC. Exception-Klasse EThread mit Meldung 'Start kann für einen laufenden oder unterbrochenen Thread nicht aufgerufen werden'. Prozess Example.exe (5736)
gruss

Geändert von EWeiss (23. Aug 2011 um 12:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 23. Aug 2011, 13:07
Aber bitte auch nicht SuspendThread nehmen. Ist ja nur der API Aufruf, der in TThread.Suspend gekapselt wird. Auch msdn schreibt, dass man SuspendThread nur zum Debuggen nehmen soll. Allerdings steht nirgends etwas darüber, warum man SuspendThread nicht aus dem eigenen Thread heraus aufrufen kann. Dennoch gibt es schönere / andere Methoden:
Delphi-Quellcode:
{ TmyThread }
private
  FHaltEvent:TEvent;

//...

procedure TmyThread.Continue;
begin
  FHaltEvent.SetEvent;
end;

constructor TmyThread.Create(aSuspended: boolean);
begin
  inherited;
  FHaltEvent:=TEvent.Create(nil,true,true,'');
end;

destructor TmyThread.Destroy;
begin
  FHaltEvent.Free;
  inherited;
end;

procedure TmyThread.execute;
begin

  while not terminated do
  begin
    //do something


    SuspendIfHalted;
  end;


end;

procedure TmyThread.Halt;
begin
  FHaltEvent.ResetEvent;
end;

function TmyThread.Halted: boolean;
begin
  result:= FHaltEvent.WaitFor(0) <> wrsignaled;
end;

procedure TmyThread.SuspendIfHalted;
begin
  FHaltEvent.WaitFor(infinite);
end;


procedure TmyThread.Terminate;
begin
  if Halted then FHaltEvent.SetEvent;
  inherited;
end;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#3

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 23. Aug 2011, 13:22
MSDN-Library durchsuchenSuspendThread
Zitat:
To avoid this situation, a thread within an application that is not a debugger should signal the other thread to suspend itself
Genau das mache ich in dem Beispiel. Suspend könnte man dabei an Stelle von SuspenThread genauso gut verwenden und die Warnung ignorieren - da es so halt "richtig" angewendet wird und Deadlocks ausgeschlossen sind.
Die optionale Verwendung von Events oder Sleep hatte ich ja bereits genannt, siehe auch Suspending Thread Execution
Wie auch in der Delphi-Hilfe werden in jedem MSDN-Artikel leider nur Teilaspekte angesprochen.

Grüsse, Dirk
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 23. Aug 2011, 14:30
Wie auch in der Delphi-Hilfe werden in jedem MSDN-Artikel leider nur Teilaspekte angesprochen.
Und so ein Teilaspekt ist halt auch folgender:
(Suche nach "SuspendThread race condition")
Zitat:
The reason is related to a possible race condition with the suspend count.
The suspend count is incremented by a call to SuspendThread(), and is
decremented by a call to ResumeThread(). If the suspend count is non-zero,
then the scheduler will mark the thread as "waiting" (or not ready), and
will not schedule the thread for processing; conversely, when the suspend
count is exactly zero, the thread is marked as "ready" and is given
processing time. The race condition occurs because access to the suspend
count is not synchronized between threads, such that it is possible for one
thread to decrement the suspend count beyond zero to a value of -1. At that
value, the thread will never be scheduled for processing.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 23. Aug 2011, 14:34
Kann sich nochmal bitte jemand dieser Frage annehmen?
http://www.delphipraxis.net/1118970-post19.html

gruss
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 23. Aug 2011, 14:44
Kann sich nochmal bitte jemand dieser Frage annehmen?
http://www.delphipraxis.net/1118970-post19.html

gruss
1. Such dir halt einen Namen aus (suspend ist ja leider schon vergeben; genauso: break und interrupt) Stop wäre noch übrig. Aber dann neigt man beim weitermachen dazu start zu verwenden, was ja schon vergeben ist. Das Antonym für continue ist ja discontinue. Gibts aber zumindest in meinem aktiven Wortschatz bisher nicht. Naja, lass dir was einfallen....

2. CriticalSection ist ein Handle-Objekt. EnterCriticalSection ist eine Funktion auf dieses Handle-Objekt.
TCriticalSection ist eine Klasse, welches das Handle-Objekt CriticalSection kapselt. TCriticalsection.EnterCriticalSection ist eine Methode vorheriger Klasse.
Was war eigentlich genau deine Frage?

Deine 3. Frage verstehe ich nicht.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 23. Aug 2011, 14:49
Zitat:
2. CriticalSection ist ein Handle-Objekt. EnterCriticalSection ist eine Funktion auf dieses Handle-Objekt.
TCriticalSection ist eine Klasse, welches das Handle-Objekt CriticalSection kapselt. TCriticalsection.EnterCriticalSection ist eine Methode vorheriger Klasse.
Habe dann wohl was falsch gemacht.
Dann habe ich zwar das Handle object erstellt aber keine Function welche das handle verwaltet (bzw. damit arbeitet)

Die Frage war ..
An welcher stelle ist es sinnvoll EntercriticalSection und LeaveCriticalSection in TVisDataThread.Execute unterzubringen?

wo könnte hier etwas Kritisch sein das ich EntercriticalSection verwenden muss, sollte?
Muss mal bei MS lesen wofür EntercriticalSection genau steht
Verstehe die Anwendung der Function wohl noch nicht!

gruss

Geändert von EWeiss (23. Aug 2011 um 14:54 Uhr)
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#8

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 23. Aug 2011, 15:03
Zitat:
The race condition occurs because access to the suspend
count is not synchronized between threads, such that it is possible for one
thread to decrement the suspend count beyond zero to a value of -1.
Da ausschliessliuch der Thread selber SuspendCount verringert seh ich darin kein Problem - auch wieder ein Fall wo nur das Suspend aus einem anderen Thread zum Fehler führt.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 23. Aug 2011, 15:11
Zitat:
The race condition occurs because access to the suspend
count is not synchronized between threads, such that it is possible for one
thread to decrement the suspend count beyond zero to a value of -1.
Da ausschliessliuch der Thread selber SuspendCount verringert seh ich darin kein Problem - auch wieder ein Fall wo nur das Suspend aus einem anderen Thread zum Fehler führt.
Eben nicht.
Dieses Problem tritt auf, wenn TmyThread Suspend aufruft und der MainThread gleichzeitig Resume aufruft, was bei deinem Code durchaus passieren kann.


Zitat von Emil:
FDelayMSChanged
FDelayMSChanged wird aufgerufen wenn ein neues Plugin gestartet wird und die ms sich geändert haben.
Dann must du um jeden Zugriff (eigentlich nur, wenn mindestens ein Thread auch schreibend darauf zugreift) EnterCriticalSection und LeaveCriticalSection basteln (und zwar von der exakt gleichen Objektinstanz)
Allerdings hast du hier eine Variable allersimplesten Datentypes. Da reichen die interlocked-Funktionen aus und die synchronisation kann entfallen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 23. Aug 2011, 15:15
Zitat:
Allerdings hast du hier eine Variable allersimplesten Datentypes. Da reichen die interlocked-Funktionen aus und die synchronisation kann entfallen.
Was bedeutet das ich LockFlag sowie EnterCriticalSection gar nicht verwenden muss?

Mir ging es eigentlich darum eventuelle hänger beim umschalten auf andere Plugins zu vermeiden.
Dafür scheint dann wohl EnterCriticalSection nicht das richtige zu sein.

Hab dann wohl was falsch verstanden..

Danke für deine Hilfe

gruss
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04:25 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