Ĺadny brzuch
Pisze sobie prosty playerek dla wlasnego uzytku, wykorzystuje do tego Dev-C++ i wxWidgets razem z biblioteka bass.dll, pod jeden z przyciskow podpialem sobie funkcje odtwarzajaca i wszystko gra i buczy dopoki nie postanowilem dodac paska postepu odtwarzania do tego zdarzenia (tzn. klikniecia na button Play), dodalem sobie petle do {....} while ktora odczytuje mi aktualna pozycje utworu i przekazuje ja do wxGauge i tu zaczyna sie problem bo program sie kompiluje, uruchamia ale po wybraniu pliku i kliknieciu na play program odtwarza go ale caly zamiera, a nabelce programu pokazuje sie "program nie odpowiada" a przycisk play nie powraca caly czas jest jakby wcisniety,
domyslam sie ze to przez ta petle ale nie mam pomyslow jak inaczej moznaby to rozwiazac :( moze ktos naprowadzi mnie na jakies dobre rozwiazanie :pomocy:
Nie znam tej biblioteki do odtwarzania, ale korzystałem z wxGuage i myślę, że jest tak: wywołujesz funkcję odtwarzającą, która coś zwraca, ale dopiero, jak się wykona, czyli odtworzy utwór. Do tego czasu program w ogóle nie wchodzi do pętli i czeka na zakończenie podprogramu. Stąd komunikat brak odpowiedzi. Dalej powinno być tak, że po zakończeniu utworu program odpowiada i daje wskazanie na 100% wxGuage. Myslę, że zastosowanie wielowątkowości rozwiązałoby ten problem czyli, że pętla i odtwarzanie wykonują się jako równoległe wątki.
wxGauge dziala tzn. pokazuje sie postep odtwarzania problem z tym ze dopoki petla sie nie zakonczy a nastepuje to dopieru po spelnienu warunku jakim jest koniec utworu program nie reaguje na nic.
poszukam o tej wielowatkowosci, moze cos uda mi sie z tym zrobic :) dzieki
moze jeszcze inni forumowicze beda mieli jakies inne pomysly ;)
poszukalem o tych watkach i znalazlem cos takiego jak pthread ale to jest pod platforma linux, wogole wszystko co udalo mi sie znalezc dotyczylo unix/linux :( moze ktos z forumowiczow ma jakis przyklad w ktorym byloby pokazane jak tworzyc watki pod win32 ??
Najprościej:DWORD WINAPI watek1() { } DWORD th; CreateThread(NULL,0,(unsigned long (__stdcall *)(void *)) watek1,NULL,0,&th);
Użytkownik Cyrkiel edytował ten post 09 listopad 2005, 12:02
http://www.programuj...ly/cpp/bass.php
Zajrzyj tam, może cos ci to pomoże. Tam można wyczytać, że funkcja odtwarzająca z tej biblioteki działa w osobnym wątku. Być może nie dałeś żadnej komendy zatrzymującej program w pętli, czyli jakiś sleep. Wtedy taka pętla mogłaby się wykonywać tak dziwnie czerpiąc całą moc procesora i powodując brak odpowiedzi programu. Chyba, że to nie to... :blink:
http://www.programuj...ly/cpp/bass.php
wlasnie na tym arcie sie opieralem a petla wyglada tak:
do { dwStreamCurrentPos = BASS_ChannelGetPosition(hMP3); fSeconds = BASS_ChannelBytes2Seconds(hMP3, dwStreamCurrentPos); czas=(int(fSeconds)/int(fSecondsTotal))*100; WxGauge1->SetValue(czas); Sleep(10); } while (dwStreamCurrentPos != dwStreamLen);
To spróbuj dać może Sleep(100) a potem Sleep(1000) i powiedz co z tego wychodzi. Pamiętam, że ten wxGauge działał jakoś topornie. Kolejna rzecz, to może daj mu zakres int(fSecondsTotal) i wywołuj z int(fSeconds) zamiast czas. Ja bym tak zrobił.
to Sleep(100) i Sleep(1000) nic nie zmienia :( kurcze pierwszy raz sie z czyms takim spotkalem :blink: za czasow Amigi i jezyka E (ehh to byly czasy) napisalem sobie playerek do plikow mod i tym podobnych w wlasnym GUI i tam nie bylo takich problemow, zadnych watkow nie musialem tworzyc i wszystko dzialalo
Problem rozwiązany :D :D :D
Załatwił to jeden malutki thread :)
a tu dla potomnych moze sie komus przyda bo sam szukalem tego prawie caly dzisiejszy dzien:
funkcja wywolaywana jako thread:
void pokazPostep(PVOID pvoid) { if (plik == true) { do { dwStreamCurrentPos = BASS_ChannelGetPosition(hMP3); fSeconds = BASS_ChannelBytes2Seconds(hMP3, dwStreamCurrentPos); x->SetValue(int(fSeconds)); Sleep(10); } while (dwStreamCurrentPos != dwStreamLen); } _endthread(); }
i utworzenie thread'a:
_beginthread(pokazPostep,0,NULL);
edit: zapomniałbym, że trzeba dodac #include <windows.h> i #indlude <process.h> a w opcjach linkera dodac biblioteke kernel32
Pozdro B)
P.S. Ale jestem happy :D
Użytkownik mtxx edytował ten post 09 listopad 2005, 21:18
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
domyslam sie ze to przez ta petle ale nie mam pomyslow jak inaczej moznaby to rozwiazac :( moze ktos naprowadzi mnie na jakies dobre rozwiazanie :pomocy:
Nie znam tej biblioteki do odtwarzania, ale korzystałem z wxGuage i myślę, że jest tak: wywołujesz funkcję odtwarzającą, która coś zwraca, ale dopiero, jak się wykona, czyli odtworzy utwór. Do tego czasu program w ogóle nie wchodzi do pętli i czeka na zakończenie podprogramu. Stąd komunikat brak odpowiedzi. Dalej powinno być tak, że po zakończeniu utworu program odpowiada i daje wskazanie na 100% wxGuage. Myslę, że zastosowanie wielowątkowości rozwiązałoby ten problem czyli, że pętla i odtwarzanie wykonują się jako równoległe wątki.
wxGauge dziala tzn. pokazuje sie postep odtwarzania problem z tym ze dopoki petla sie nie zakonczy a nastepuje to dopieru po spelnienu warunku jakim jest koniec utworu program nie reaguje na nic.
poszukam o tej wielowatkowosci, moze cos uda mi sie z tym zrobic :) dzieki
moze jeszcze inni forumowicze beda mieli jakies inne pomysly ;)
poszukalem o tych watkach i znalazlem cos takiego jak pthread ale to jest pod platforma linux, wogole wszystko co udalo mi sie znalezc dotyczylo unix/linux :( moze ktos z forumowiczow ma jakis przyklad w ktorym byloby pokazane jak tworzyc watki pod win32 ??
Najprościej:DWORD WINAPI watek1() { } DWORD th; CreateThread(NULL,0,(unsigned long (__stdcall *)(void *)) watek1,NULL,0,&th);
Użytkownik Cyrkiel edytował ten post 09 listopad 2005, 12:02
http://www.programuj...ly/cpp/bass.php
Zajrzyj tam, może cos ci to pomoże. Tam można wyczytać, że funkcja odtwarzająca z tej biblioteki działa w osobnym wątku. Być może nie dałeś żadnej komendy zatrzymującej program w pętli, czyli jakiś sleep. Wtedy taka pętla mogłaby się wykonywać tak dziwnie czerpiąc całą moc procesora i powodując brak odpowiedzi programu. Chyba, że to nie to... :blink:
http://www.programuj...ly/cpp/bass.php
wlasnie na tym arcie sie opieralem a petla wyglada tak:
do { dwStreamCurrentPos = BASS_ChannelGetPosition(hMP3); fSeconds = BASS_ChannelBytes2Seconds(hMP3, dwStreamCurrentPos); czas=(int(fSeconds)/int(fSecondsTotal))*100; WxGauge1->SetValue(czas); Sleep(10); } while (dwStreamCurrentPos != dwStreamLen);
To spróbuj dać może Sleep(100) a potem Sleep(1000) i powiedz co z tego wychodzi. Pamiętam, że ten wxGauge działał jakoś topornie. Kolejna rzecz, to może daj mu zakres int(fSecondsTotal) i wywołuj z int(fSeconds) zamiast czas. Ja bym tak zrobił.
to Sleep(100) i Sleep(1000) nic nie zmienia :( kurcze pierwszy raz sie z czyms takim spotkalem :blink: za czasow Amigi i jezyka E (ehh to byly czasy) napisalem sobie playerek do plikow mod i tym podobnych w wlasnym GUI i tam nie bylo takich problemow, zadnych watkow nie musialem tworzyc i wszystko dzialalo
Problem rozwiązany :D :D :D
Załatwił to jeden malutki thread :)
a tu dla potomnych moze sie komus przyda bo sam szukalem tego prawie caly dzisiejszy dzien:
funkcja wywolaywana jako thread:
void pokazPostep(PVOID pvoid) { if (plik == true) { do { dwStreamCurrentPos = BASS_ChannelGetPosition(hMP3); fSeconds = BASS_ChannelBytes2Seconds(hMP3, dwStreamCurrentPos); x->SetValue(int(fSeconds)); Sleep(10); } while (dwStreamCurrentPos != dwStreamLen); } _endthread(); }
i utworzenie thread'a:
_beginthread(pokazPostep,0,NULL);
edit: zapomniałbym, że trzeba dodac #include <windows.h> i #indlude <process.h> a w opcjach linkera dodac biblioteke kernel32
Pozdro B)
P.S. Ale jestem happy :D
Użytkownik mtxx edytował ten post 09 listopad 2005, 21:18