wxthread ошибка сегментации

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
zmeishe1984
In need of some credit
In need of some credit
Posts: 3
Joined: Sat Mar 01, 2014 5:54 am

wxthread ошибка сегментации

Post by zmeishe1984 » Sat Mar 29, 2014 5:12 pm

Есть некий класс
class MyRegistrPanel : public wxPanel
{
protected:
wxImage pWxImg;
MyCamera* thread;//поток
wxPanel* image_panel;//панель для вывода изображения

void OnJobStatus (wxCommandEvent& event);//метод просто выводящий изображение
}

Также вот такой метод потока:
void *MyCamera::Entry()
{
capture= cvCreateCameraCapture(CV_CAP_ANY);//открываем камеру

for(;;) //бесконечный цикл для чтения кадров с камеры
{

frame= cvQueryFrame( capture );//получаем кадр
unsigned char *rawData;
cvGetRawData( frame, &rawData);

wxImage temp ( width,height, rawData, TRUE );//получаем изображение в виде wxImage
image=temp ;//с image потом будет считываться картинка в методе OnJobStatus

wxPostEvent( panel, event );//вызываем метод OnJobStatus в классе MyRegistrPanel
}
return (wxThread::ExitCode)0;
}

А вот тут мы забираем с потока изображение и вывводим на экран
void MyRegistrPanel::OnJobStatus (wxCommandEvent& event)
{
pWxImg=thread->image;//получаем изображения с класса-потока.

wxPaintDC dc(image_panel);//отдельная панель для вывода картинки
wxBitmap bit(pWxImg);
dc.DrawBitmap(bit,0,0);

event.Skip();
}

Опытным путем вычислил что segmentation fault выскакивает во время вызова OnJobStatus. Что я делаю не так??

User avatar
T-Rex
Moderator
Moderator
Posts: 1179
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Re: wxthread ошибка сегментации

Post by T-Rex » Tue Apr 01, 2014 6:09 pm

Пока главный поток читает wxImage, OpenCV в нее пишет. Поэтому и падает.
Лучше организовать 2 массива для RGB буфера. В один получаем, другой отображаем. И менять их только по отрабатыванию колбэка в главном потоке (изначально index = 0; за каждым колбэком делать index = 1 - index, чтобы менять 0\1).
Получили от OpenCV в массив 0, поменяли индекс для OpenCV на 1 и пишем в него пока GUI не отобразит картинку с массивом 0. Потом GUI уведомляет что оно отобразило картинку с массивом 0 и при следующем считывании воркер отдаст в GUI картинку с массивом 1.
Посмотри как у меня в wxKinectHelper сделано.
И да, без мьютекса не обойтись даже если подменять только индекс. Чтоб не получилось так что воркер читает индекс пока GUI поток в него пишет.

Post Reply