restart wątku

0

a więc mam problemik z może nie samym restartowaniem wątku (chociaż jak ma ktoś lepszy pomysł towalić):

watek.Create(false);

to jest całe moje restartowanie. :-)

a teraz do rzeczy. problem w tym że jak go tak zrestartuje to mi nie chce odgrywać dźwięku, który wcześniej odgrywał, po prostu cisza

PlaySound(PChar(sound), 0, SND_FILENAME or SND_ASYNC);

sam nie wiem dlaczego tak jest ;-| może coś nie tak z restartowaniem wątku...

// dopisane
sprawa jest o tyle dziwna, że w innym miejscu tak samo restaruje wątek i dżwięk jest..

0

Ej no stary toż to Ci cała pamięć wycieknie jak dasz Create bez Free ;-)
To trzeba zrobić tak:

// zakładamy że th to wątek, jest już stworzony itd
th.Free;
th:=TJakisWatek.Create(False);

To jest chyba mimo wszystko najpewniejszy sposób na wątku restartowanie...

Nawet jeżeli masz ustawione FreeOnTerminate na True to i tak Free nie zaszkodzi - bo a nuż jeszcze się nie skończył :-/ A tak w zasadzie to najlepiej zwalniać wątek przez FreeOnTerminate + Terminate + obsługa wewnątrz wątku.

Jak dalej nie będzie chodzić, to napisz - mam jeszcze kilka pomysłów w zanadrzu :-)

0

w zasadzie to, to co napisałeś nie bardzo chce dziłac...
ale jest tak jak mówie:
jak klikne na pewien przycisk to mi chula czy li odtwarza ten dźwięk, a jak zrobie to przy obsłudze komunikatów (WindowProc) to nie..

to jestr treść obsługi komunikatów w WndProc:

begin
  if Msg.Msg = MsgID then
  begin
    // ... //
  end
  else if Msg.Msg = ReLoad then
  begin
    MailBox.Suspend;
    if poczta.Connected then poczta.Disconnect;
    restarted := true;
    LoadUsers;
    MailBox := TMailBox.Create(false);
  end;

inherited;
end;

a tu po kliknięciu na element menu:

var
  i: integer;
begin
  for i := low(users) to high(users) do
    users[i].receive := true;

  MailBox.Suspend;
  if poczta.Connected then poczta.Disconnect;
  MailBox := TMailBox.Create(false);

po tej pierwszej procedurze to już do końca nie odtwarzają się dźwięki zawarte w tym wątku (1 dźwięk dokładnie)

0
    MailBox.Suspend;
    if poczta.Connected then poczta.Disconnect;
    restarted := true;
    LoadUsers;
    MailBox := TMailBox.Create(false);

Hmm.. dajesz Suspend a potem dajesz Create na ten sam pointer?? Zanim dasz TMailBox.Create musisz dać MailBox.Free, inaczej wskoczy ci drugi wątek w to samo miejsce; btw jeżeli pierwszy jest zatrzymany, to nie powinno być dużej różnicy w samym DZIAŁANIU, natomiast różnica jest w alokacji pamięci.

0

jak dam free to się zawiesza program. poza tym problrm z dźwiekiem rozwiązałem - troche dziwny problem, ale to nie chodziło o restart wątku.
jeżeli jednak mówisz o alokacji pamięci to ten sposób mi nie bardzo hula, albo nawet w ogóle ;-|

  MailBox.Free;
  if poczta.Connected then poczta.Disconnect;
  TMailBox.Create(false);

po wykonaniu powyższego koduwywala mi błąd o złym dojściu do wątku.

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