录音为什么在单核电脑上没事,在双核电脑上录一段就出错了
如题:
利用api录音
回调过程
void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
CWaveRecord *pObject = (CWaveRecord *)dwInstance;
if( uMsg == WIM_DATA ) // 一个数据块被写满
pObject->OnSoundData(NULL, dwParam1); // 处理数据,在这里写入文件,并画图处理
else if (uMsg == WIM_CLOSE)
{
if(pObject->m_bRecording)
pObject->OnStopRecording(0,0); // 停止录音的操作
}
}
我对下面的说明不太明白,有那位大侠说一下,估计我的问题应该出现在这里。在单核电脑上录音很正常,在双核电脑上把画图的给屏蔽掉,也没错。
有三个要点需要特别关注:一是MSDN中注明在回调函数中严格限制系统调用,因此你不能随心所欲地设计方案,比如说直接将音频数据写入文件是不允许的。通常,你需要设计一个数据块链表结构进行缓冲,这多半涉及多线程编程。特别是如果你使用MFC中的CSocket类,那么必须清楚CSocket依赖一个名为CSocketWnd的内部类,而该类与TLS(线程局部存贮)有关,这意味着CSocket类是不支持多线程共享的。然而,Win32的SOCKET句柄是全局性。因此,获取CSocketWnd类对象的窗口句柄之后,我通过直接调用Win32 APIs使用CSocket::m_hSocket避开这个由MFC封装引起的问题。
二是系统是在另一个线程(不是你自己创建的线程)中调用回调函数,这会给使用TLS机制的程序带来一些微妙的影响。如果你使用MFC,AfxGetApp之类的函数返回值不正确。
三是尽可能地快速。
[解决办法]
多核线程会同时运行.需要同步好
[解决办法]
mark.
[解决办法]
应该是线程同步的问题。
[解决办法]
该回复于2009-09-08 15:14:04被版主删除
[解决办法]
我曾经录单时在TImage中画图,也出现过楼主说的怪事.后来改到TPicture中就好了.
TImage封装了一些东西,比如它会自动重绘等.也许是这些东西的副作用吧.
[解决办法]
up
[解决办法]
线程需要控制号同步。