1
我有一个类,我试图转换它的一些成员函数在不同的线程中运行。虽然该程序没有问题,但它试图从图像缓冲区读取(由不同的线程更新)时会崩溃。似乎问题是由_beginthread中的参数传递不正确引起的。类与多线程成员函数
下面的代码片段应该更清楚地解释我正在尝试做什么。基本上我试图完成的是有成员函数“fillBuffer”填充图像缓冲区,而其余的程序正在做其他事情,包括同时读取相同的图像缓冲区。
任何有关该语法的帮助都将不胜感激。
const int MaxImgBufferSize = 5;
class MyFrame : public wxFrame
{
public:
// constructors
MyFrame(const wxString& title);
private:
static vector <IplImage*> ImgBuffer;
void changeWP(wxCommandEvent&);
void fillBuffer();
void fillBufferFun();
static void __cdecl getImgFromBuffer(void *);
static void __cdecl pushImgBuffer(void *);
};
vector<IplImage*> MyFrame::ImgBuffer;
enter code here
MyFrame::MyFrame(const wxString& title)
: wxFrame(...)
{
// some stuff here
InitializeCriticalSection(&Section);
fillBuffer();
// some code here calls changeWP(wxCommandEvent&) from time to time
}
void MyFrame::fillBuffer()
{
while(ImgBuffer.size() <= MaxImgBufferSize)
{
fillBufferFun();
}
}
void MyFrame::fillBufferFun()
{
ImgBuffer* img;
// do something with img
_beginthread(pushImgBuffer, 0, img);
}
void MyFrame::pushImgBuffer(void *p)
{
EnterCriticalSection(&Section);
ImgBuffer.push_back((IplImage*) p);
LeaveCriticalSection(&Section);
}
static unsigned int __stdcall getImgFromBuffer(void *);
void MyFrame::changeWP(wxCommandEvent&)
{
// do someting
IplImage* img = NULL;// new IplImage;
_beginthreadex(NULL, 0, MyFrame::getImgFromBuffer, img, 0, NULL);
// do something with img
fillBuffer();
}
unsigned int MyFrame::getImgFromBuffer(void *p)
{
EnterCriticalSection(&Section);
p = (void *)ImgBuffer[0];
ImgBuffer.erase(ImgBuffer.begin());
LeaveCriticalSection(&Section);
return 0;
}
我试过你的建议。当我将MyFrame :: getImgFromBuffer(void * p)的函数定义更改为MyFrame :: getImgFromBuffer(void ** p)时,_beginthread(MyFrame :: getImgFromBuffer,0,)抱怨getImgFromBuffer(void ** p)应该是getImgFromBuffer(void * p)。顺便说一下,段被定义为全局的 – CodeAsIGo 2011-03-05 17:40:29
我的错。是的,你应该保留getImgFromBuffer的简单“void * p”签名,然后将指针转换为实际的(两次间接的)指针类型,像这样:“IplImage ** img_ptr = static_cast(p);”然后使用类型安全的指针指针来指定想要冒泡的值,如下所示:“* img_ptr = ImgBuffer [ 0];“。在开头注意星号。 –
Jollymorphic
2011-03-06 01:14:44