PlaySound a Application.Terminate. jak zaczekac?

0

czesc

sluchajcie, chce zrobic aby po kliknieciu w listboxa:
odegral sie dzwiek 'MenuCommand'
uruchomil sie zewnetrzny plik uzywajac ShellExecute
wywolac application.terminate.

problem mam taki ze:
shell execute daje pewne opoznienie.
uzycie snd_sync w playSound tez odpada.
z kolei application.terminate przerwa odtwarzanie dzwieku.

najlepszym rozwiazaniem bylo by:
odpalic dzwiek
odpalic plik
sprawdzic czy dzwiek sie odtwarza, jesli skonczyl to dopiero wtedy terminate.

jakies pomysly?

0

Jest jeszcze parametr snd_Ansyc.

Zamiast Application.Terminate, użyj .Close;

0
Opi napisał(a)

Jest jeszcze parametr snd_Ansyc.

Zamiast Application.Terminate, użyj .Close;

wiem. niestety close tez przerywa odwarzanie dzwieku. tzn akurat w moim przypadku ort! na shellexecute jest wystarczajaco dlugie aby odwtorzyc dzwiek. jesli jednak ktos bedzie mial nieco dluzszy dziwiek (albo szybszego kompa ;] ) to moze sie okazac, ze dzwiek zostanie uciety w polowie;]

hmm... moze osobny watek?

//aha i jeszcze przy okazji playSound. za cholere nie chce mi odtworzyc dzwieku "nawigacji" z explorera.
daje

playSound('Navigating', 0, SND_ASYNC or SND_ALIAS or SND_NODEFAULT);

i... cisza;/ inne dzwieki odtwarza poprawnie.

0

odtwórz synchronicznie w osobnym wątku. główny wątek możesz spokojnie zamknąć (np. przez Form.Close()), system poczeka na zamknięcie procesu aż każdy z jego wątków zakończy działanie, więc dźwięk odtworzy się do końca.
tylko nie używaj terminate, bo ubijesz cały proces.

0
ŁF napisał(a)

odtwórz synchronicznie w osobnym wątku. główny wątek możesz spokojnie zamknąć (np. przez Form.Close()), system poczeka na zamknięcie procesu aż każdy z jego wątków zakończy działanie, więc dźwięk odtworzy się do końca.
tylko nie używaj terminate, bo ubijesz cały proces.

zrobilem jak napisales. niestety system nie jest dla mnie laskawy i ubija od razu caly proces :/

/////////////////////
rozwiazanie (tak mniej-wiecej, napisane "na brudno" dla sprawdzenia czy dziala):

procedure PlaySoundExecAndTerminate(filename:String);
var pos, len:array[0..32] of char;
    snd:String;
    err:MCIERROR;
begin
form1.timer1.Enabled:=false;
snd:=ini.ReadString('sounds', 'execute', '');
mciSendString(PChar('open "'+snd+'" type waveaudio alias myNav'),nil,0,0);

form1.Hide;  windows.ShowWindow(form1.hnd, sw_hide);
mciSendString('play myNav', nil,0,0);
shellexecute(0,'open',PChar(filename),nil,nil, sw_show);

repeat
err:=mciSendString('status myNav position', @pos, 32,0);
mciSendString('status myNav length', @len, 32,0);
application.ProcessMessages;
until (String(pos)=string(len)) or (err<>0);

mciSendString('close myNav', nil,0,0);
application.Terminate;
end;
0

przecież pisałem: nie używaj terminate! i odtwarzaj synchronicznie. nie zastosowałeś się do obu, czy tylko do jednego?

0
ŁF napisał(a)

przecież pisałem: nie używaj terminate! i odtwarzaj synchronicznie. nie zastosowałeś się do obu, czy tylko do jednego?

wiem co pisales i stosowalem sie do wszystkiego ;] niestety nie dzialalo. no chyba ze jakos zle sie z watkami obchodzilem ale raczej nie, nie wiem:
nowy watek, w execute playsound z snd_sync. po jego uruchomieniu od razu shellexecute i form.close. nie dzialalo, czasem bylo slychac poczatek dzwieku ale po ulamku sek, caly proces sie konczyl.

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