Obecnie pracuję z AForge i mam nowe zdarzenie frame, które umieszcza ramkę jako bitmapę w skrzynce obrazkowej. 90% czasu to działa świetnie ... JEŚLI nie bawię się z czymś na WinFormie. Zmiana pola kombi, przesuwając okno, lub coś podobnego, aby ryzyko powodowania PictureBox, aby przełączyć się z filmu na dużym próbki czerwony X. poniższy kod:Picturebox dostaje duży czerwony X, ale nie mogę go wykryć ani naprawić
private void connectButton_Click(object sender, EventArgs e)
{
try
{
cam = new VideoCaptureDevice(captureDevices[CameraSelectComboBox.SelectedIndex].MonikerString);
cam.NewFrame -= Handle_New_Frame; //Just to avoid the possibility of a second event handler being put on
cam.NewFrame += new AForge.Video.NewFrameEventHandler(Handle_New_Frame);
cam.Start();
}
catch
{
MessageBox.Show("An error has occured with connecting to the specified webcam. The application will now close!");
Application.Exit();
}
}
private void Handle_New_Frame(object sender, NewFrameEventArgs eventArgs)
{
try
{
if (bitmap != null)
bitmap.Dispose(); //Without this, memory goes nuts
bitmap = new Bitmap(eventArgs.Frame);
}
catch { }
//Draw some stuff on the images
bitmap = AdjustBrightness(bitmap, brightnessMeter);
bitmap = ApplyContrast(contrastMeter, bitmap);
bitmap = Draw_Top_Line(bitmap);
bitmap = Draw_Bottom_Line(bitmap);
//Set the image into the picturebox
this.Invoke((MethodInvoker)delegate
{
videoPictureBox1.Image = bitmap;
frameRate++; //Keep track of the frame rate
});
GC.Collect(); //Without this, memory goes nuts
this.Invoke((MethodInvoker)delegate {
videoPictureBox1.Refresh(); //NOT NECESSARY. JUST TRYING TO FIX THE BIG RED X!
});
if (videoPictureBox1.Image == videoPictureBox1.ErrorImage)
{
cam.Stop(); //ALSO NOT NECESSARY> AGAIN, JUST TRYING TO FIX THE BIG RED X!
cam.Start();
}
}
kładę przerwę na if (videoPictureBox1.Image == videoPictureBox1.ErrorImage) i wartość jest fałszywa, nawet gdy duży czerwony X jest w górze, ponieważ obraz jest faktycznie ustawiony na bitmapę. Więc cam.Stop() i cam.Start() nigdy nie działają (nie jestem pewien, czy to by nawet pomogło, ale pomyślałem, że spróbuję).
videoPictureBox1.Refresh() działa za każdym razem, ale znowu - to nie robi różnicy. Nadal mam dużą czerwoną X.
Jak już wcześniej wspomniałem: jeśli uruchomię wideo i nic nie dotknę, duże czerwone X nigdy się nie wyda. Ale w momencie, gdy zaczynam zmieniać pola kombi lub przeciągając sam formularz, szansa dużego czerwonego X rośnie wykładniczo. Czasami mogę przechodzić przez pole kombi 10-12 razy, zanim to się stanie, innym razem zdarza się, że po drugim klikam na combobox. : - \
Czy ktoś może wyjaśnić, co się tutaj dzieje i może zaproponować najlepszą metodę rozwiązania problemu? Nadal jestem bardzo nowy w tworzeniu wątków, więc staram się omijać dokładnie to, co się tutaj dzieje i najlepiej rozwiązać ten problem! Wszelkie trąby w dobrym kierunku będą ogromną pomocą!
Myślę, że prawdopodobnie nie użyłbym pudełka z obrazkami. Zamiast tego użyj panelu i narysuj bitmapę w zdarzeniu farby panelu. Wymuszenie odświeżenia z unieważnieniem. –
Czy obejrzałeś eventArgs.Frame podczas dużego czerwonego senario X? Również umieściłbym messagebox pod tym wyjątkiem, na wypadek gdyby wystąpił błąd. – TheKingDave
Dobra, spróbuję naprawdę szybko! Dodatkowa uwaga: Poszedłem do debugowania -> wyjątki i zaznaczono wszystkie pola wyboru "Zrzucone". Nic tak nie rzuca, kiedy to się dzieje. W ogóle. –