Obsługa kamerki usb w innym wątku przez vfw

0

Witam!

Otóż problem dotyczy programowania API. Tworzę projekt, który poza innymi operacjami będzie posiadał okno potomne, w którym będzie prezentowany obraz z kamerki internetowej "na żywo". Stosuję funkcje z biblioteki vfw. Po zaimplementowaniu okazało się, że podgląd z kamery bardzo spowalnia działanie programu a zależy mi na płynnej wizualizaji OpenGl (to są te "inne operacje").
Aby rozwiązać ten problem utworzyłem wątek funkcją _createthread...Wątek ten wywoływany jest przy pomocy zmiennej boolowskiej po pętli głównej komunikatów Windows:
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{...}
else
if (bUaktualnijVideo) _beginthread(OperacjeNaKamerze, 0, NULL);

Zmienna "bUaktualnijVideo" jest ustawiana na false na poczatku funkcji wątkowej, oraz na true, zaraz przed zakończeniem funkcji wątkowej.
Funkcja wątkowa posiada wywołanie "capGrabFrame(hwndC)", podczas gdy okno podglądu oraz inicjacja sterownika odbywa się w odpowiedzi na komunikat WM_CREATE okna głównego.
Okazuje się, że nie uzyskałem żadnej widocznej poprawy płynności działania programu. Spróbowałem jeszcze zmodyfikować kod, i wstawić fragment odpowiedzialny za tworzenie okna oraz inicjację sterownika do funkcji wątkowej, jednocześnie usuwając go z poprzedniego miejsca. Efekt był taki, że okno wideo nie zostało w ogóle utworzone.
Bardzo bym prosił o pomoc w rozwiązaniu problemu.
Chciałbym aby działanie podglądu kamery nie wpływało spowalniająco na działanie programu.
Jak utworzyć wątek i jak umieścić funkcje vfw w nim by osiągnąć efekt, nad którym pracuję.

0

co do bUaaktywnijVideo to jest skopane, poniewaz jest mozliwosc ze glowna petla programu zauwazy ze bUaktywnijVideo jest true, utworzy watek, wroci na poczatek petli, zauwazy ze bUaktywnijVide jest true, utworzy nowy watek, i dopero teraz watek dostanie procesor i zmieni Ci flage na false.. --nigdy nie masz zadnej pewnosci ze w danej chwili watek doszedl/nie doszedl do glosu!!

slowem, w glownej petli byc powinno

if(bUaktywnijVideo)
{ _beginthread...
bUaktywnijVideo = false;
}
na poczatku watku nie ruszac bUaktywnijVideo, a na koncu watku tak jak masz ustawiac na true

a co do plynnosci - moze sprobuj w beginthread/ex podac priorytet watku nizszy niz watku glownego - teraz tworzysz rownowazny, wiec czas procesora dzieli sie mniejwiecej na pol..

0

Dzieki za odpowiedz.
Problem rozwiazalem.
capGrabFrame tak naprawde nie jest funkcja tylko makrem ktore wysyla zdarzenie WM_CAP_GRAB_FRAME do procedury okna video tworzonego w watku glownym za pomoca funkcji capCreateCaptureWindow ( czyli procedura tego okna takze jest utworzona w watku glownym). I wniosek taki: pobieranie klatki za pomoca powyzszego makra mimo wywolania w innym watku, powoduje wykonanie kodu w watku glownym.
Pozdrawiam.

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