pthread_create error: invalid use of non-static member function
阿新 • • 發佈:2018-12-18
問題描述:基於C++建立一個錄音的類,抓取mic的pcm資料,並返回。
class MicRecordImpl
{
void* audioThread(void *param);
void startRecord(void);
};
其中,在實現類有一個執行緒函式:
void* MicRecordImpl::audioThread(void *param)
{
//do recording
}
在startRecord()中,用需要pthread_create 一個執行緒來執行audioThread:
void MicRecordImpl::startRecord(void) { int result = pthread_create(&mThread, &attr,audioThread, NULL); }
編譯報錯:
MicRecorder.cpp: In member function 'int micrecord::MicRecorderImpl::audioThread(void*)':
MicRecorder.cpp:297:79: error: invalid use of non-static member function。
如果要建立執行緒函式audioThread為MicRecorderImpl類成員函式,就需要使用靜態函式。 但是,使用靜態函式有兩個問題:
1.靜態函式不能訪問非靜態成員; 2.無法實現多例項;
如何避開這個問題呢?就是再封裝一層,先呼叫靜態函式,在靜態函式中再呼叫原來的物件函式。 步驟如下:
1.audioThread改為靜態函式,封裝原來的audioThread內容為audioThreadImpl:
class MicRecordImpl
{
void* audioThread(void *param);
void audioThreadImpl(void );
void startRecord(void);
};
void* MicRecordImpl::audioThreadImpl()
{
//do recording
}
2.建立執行緒時,傳入當前物件指標:
void MicRecordImpl::startRecord(void) { int result = pthread_create(&mThread, &attr,audioThread, (void *)this); }
3.audioThread在執行時把執行緒引數轉換為源物件指標,再執行audioThreadImpl:
void* MicRecordImpl::audioThread(void *param)
{
MicRecordImpl* pThis = (AwMicRecordImpl*)param;
pThis->audioThreadImpl();
}
4.重新編譯成功:
generate MicRecorder success!!!