XE(2) Jak prawidłowo wstrzymać i wznowić działanie wątku?

0

Cześć, kiedyś sprawa była prosta.
Thread.Suspend - wstrzymywało wątek
Thread.Resume - wznawiało jego działanie.

Ale od wersji XE, te metody uzyskały status deprecated.

Więc jak PRAWIDŁOWO powinno się wstrzymać i wznowić działanie wątku? Nie chodzi o żadną synchronizację. Chodzi po prostu o zapauzowanie i wznowienie działania wątku.

Czy użycie terminate (przy freeOnTerminate = false), a potem START będzie dobrym i słusznym wyjściem?

0

najprościej zajrzeć do tej dokumentacji i zobaczyć co tam piszą, ale przecież taki mastach jak Ty nie będzie sobie dokumentacją d**y zawracał...
http://docwiki.embarcadero.com/Libraries/en/System.Classes.TThread.Suspend
a jak to nie rozwiąże sprawy to jest google ale jak się do dokumentacji nie chciało zajrzeć to do googla jeszcze dalej...
http://stackoverflow.com/questions/1418333/tthread-resume-is-deprecated-in-delphi-2010-what-should-be-used-in-place

EDIT:
zależy jak będziesz miał napisany kod metody execute i metod z niej wywoływanych

0

Czytałem to wszystko. Z dokumentacji mi nic nie wynika, bo tyczy się głównie synchronizacji. A mój wątek jest, można powiedzieć, samo wystarczalny. Po prostu gdy pewien warunek nie jest spełniony, ma się zatrzymać, żeby niepotrzebnie nie zabierać czasu procesora. Execute mam napisane poprawnie:

while not Terminated do
begin

end;

Z dokumentacji jasno dla mnie wynika, żeby pod żadnym pozorem nie używać tych metod(chyba, że chodzi o debugowanie). Z innych stron nie wyczytałem też co w zamian. Jedyne, co wyczytałem to, żeby nie wstrzymywać wątków. Ale z drugiej strony znalazłem też funkcję WinApi: http://msdn.microsoft.com/en-us/library/ms686345%28VS.85%29.aspx (ale tez piszą, że to dla debuggerów)

Stąd moje pytanie: Jak PRAWIDŁOWO wstrzymać uruchomiony wątek, a potem go wznowić?

1
  1. sekcja krytyczna
type  
  TMyThread = class(TThread)
  private
    FSuspend: TRTLCriticalSection;
  public
    procedure MySuspend;
    procedure MyResume;
  end;


procedure Execute;
begin
  while not Terminated do
  begin
    EnterCriticalSection(FListLock);
    LeaveCriticalSection(FListLock);
    //reszta 
  end;
end;

procedure MySuspend;
begin
  EnterCriticalSection(FListLock);
end;

procedure MyResume;
begin
  LeaveCriticalSection(FListLock);
end;
  1. dodatkowa zmienna
procedure Execute;
begin
  while not Terminated do
  begin
    while FSuspend do
      Sleep(100);
    //reszta 
  end;
end;
  1. WinAPI SuspendThread

  2. jeśli NIE próbujesz w ten sposób synchronizować wątków to Suspend + Resume

0

Dzięki, to mi w zupełności wystarczy :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1