X
ďťż

Ł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
  •