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