在这次项目中,需要实现语音播放功能。但是发现在播放语音时,无法进行其他操作。然后想到了多线程。
可是从没有用过所谓的多线程,故在此记下自己第一次学习使用的多线程。
首先,创建一个线程:
void CLXTDlg::OnBnClickedButtonVoice()
{
hThread = CreateThread(
NULL, // SD
0, // initial stack size
(LPTHREAD_START_ROUTINE)ThreadProc, // thread function
NULL, // thread argument
0, // creation option
&threadID // thread identifier
);
}
然后,写下下面这样的全局函数,就是那个线程要执行的操作:
void ThreadProc()
{
ISpVoice * pVoice = NULL;
::CoInitialize(NULL);
//获取ISpVoice接口:
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if( SUCCEEDED( hr ) )
{
CString str;
CWnd* h_d = AfxGetApp()->GetMainWnd(); //获取主窗口的句柄
h_d->GetDlgItem(IDC_APOETRY_EDIT)->GetWindowText(str); //IDC_APOETRY_EDIT为编辑框的ID
pVoice->SetRate(-3);//语速
hr = pVoice->Speak(str,0,NULL);
pVoice->Release();
pVoice = NULL;
}
::CoUninitialize();
}
要实现上面的语音播放功能还需在文件最上面添加:
#include <sapi.h>
#pragma comment(lib,"ole32.lib") //CoInitialize CoCreateInstance需要调用ole32.dll
#pragma comment(lib,"sapi.lib") //sapi.lib在SDK的lib目录,必需正确配置