关于MFC调用线程的问题,在线等答案!
最近用MFC写一个语音的程序,调用了微软的speech。
想法是想程序一直处于监听状态,所以在对话框处理函数中写了一个while循环。但是这个方法会导致while循环在主线程导致程序假死。(能运行,也能用,就是在运行时点击对话框的其他部分会造成“未响应”)
于是就想用多线程来调用这个函数,开启了一条线程。这个时候,问题又来了,把循环放在线程中,又不能正确地执行create()函数,导致内存出错。
调用的类是这样的:
class LANE_SPEECH_DLL CSR
{
public:
void GetRecoWordA ( char * pchRecoWord );
bool StartReco();
CSR();
bool Create( const DWORD dwLanguage = SP_CHINESE,
const bool bInproc = true );
bool LoadCrammarFile ( const WCHAR * pwchFilename );
void ProcessReco( const DWORD dwMilliseconds = 5000 ); //处理识别事件
bool IsRecoSuccess() const; //识别成功则返回true
bool IsRecoEnd() const; //识别结束则返回true
virtual ~CSR();
protected:
CComPtr<ISpRecognizer> m_pSREngine; // 语音识别引擎(recognition)的接口。
CComPtr<ISpRecoContext> m_pSRContext; // 识别引擎上下文(context)的接口。
CComPtr<ISpRecoGrammar> m_pSRGrammar; // 识别文法(grammar)的接口。
CComPtr<ISpStream> m_pInputStream; // 流()的接口。
CComPtr<ISpObjectToken> m_pToken; // 语音特征的(token)接口。
CComPtr<ISpAudio> m_pAudio; // 音频(Audio)的接口。(用来保存原来默认的输入流)
};
主窗口中的线程代码:
UINT CTestDlg::start(LPVOID lpParam)
{
CTestDlg * a=(CTestDlg *)lpParam;
a->SetDlgItemText(IDC_1,_T("关闭线程"));
//语音部分
CString s;
CSR sr;
while(a->run)
{
sr.Create(); //这个函数不能正确调用,返回值是false,这里出现问题
sr.LoadCrammarFile( L"grammar.xml" );
sr.StartReco();
sr.ProcessReco(1500);
if ( sr.IsRecoEnd() && sr.IsRecoSuccess() )
{
char temp[128];
sr.GetRecoWordA( temp );
s = temp;
if ( s == "启动")
{
a->m_edit=s;
a->UpdateData(FALSE);
AfxMessageBox ( "小车即将启动" );
}
else if ( s == "下一页" )
{
a->m_edit=s;
a->UpdateData(FALSE);
AfxMessageBox ( "小车即将停止" );
}
else if ( s == "左转" )
{
AfxMessageBox ( "小车即将左转" );
}
else if ( s == "右转" )
{
AfxMessageBox ( "小车即将右转" );
}
else if ( s == "加速" )
{
AfxMessageBox ( "小车即将加速" );
}
else if ( s == "减速" )
{
AfxMessageBox ( "小车即将减速" );
}
else if ( s == "退出程序" )
{
AfxMessageBox ( "程序即将退出" );
a->run=FALSE;
//PostQuitMessage(0);
}*/
sr.~CSR();
}
a->SetDlgItemText(IDC_1,_T("开启线程"));
a->run=FALSE;
return 0;
}
各位大神,请问有什么办法可以在线程中调用这个类的create函数。是不是因为这个类是dll所以不能放在线程中还是什么错了?
还是有什么其他办法可以做到我想的效果