程序在运行一段时间后提示错误:Debugg Assertion Failed,错误是在thrdcore.cpp的第231行,即ASSERT(pThread != AfxGetApp())出错,这个错误是什么原因导致的?在线程函数里面我载入了一个dll,释放后返回。
解决方案 »
- 如何获得一个目录下的所有文件夹的名称?
- 做了个小的聊天室程序,一连接server就报错
- Skin++给主菜单加载图标问题!!
- 使用TCP/IP协议,实现三次握手
- 哪儿有详细介绍UNICODE(从入门到精通)的技术文章?谢谢!!!
- 如何取得當前的用戶名
- 想成为HACKER的进来! WIN2000漏洞大全!
- COM+组件调用时间不断增长问题?
- 错误 3 error C2679: 二进制“=”: 没有找到接受“const CHANGE_INFO”类型的右操作数的运算符(或没有可接受的转换) c:\program files\microsoft visual studio 8\vc\include\
- 请推荐几个关于修改pe文件的好网站!(急)
- 哪里有介绍CDialogResize类源代码的文章呀
- 各位大哥大姐,小弟求个VC++通讯录程序
另外在wincore.cpp的第991行,CWnd::DestroyWindow()也有一个错误。这两个错误都是在注掉线程函数的时候出现。线程函数里面没有涉及到窗口的操作,因为在线程函数里面载入的dll,所有代码不好发,请大家帮忙提示一下可能是什么原因。
UINT ModuleFunc(LPVOID a_pThreadInfo)
{
STThreadInfo* pThreadInfo = (STThreadInfo*)a_pThreadInfo; ACE_Barrier* pDataCopyBarrier = pThreadInfo->m_pBarrier;
CString sModuleName = pThreadInfo->m_sModuleName;
UINT nMsgUserDefined = pThreadInfo->m_nMsgDefined;
UINT nClientID = pThreadInfo->m_nClientID;
LPVOID pClientStream = pThreadInfo->m_pStream;
_bstr_t strCon = pThreadInfo->m_strCon;
LPVOID SendDataFunc = pThreadInfo->m_pFunc;
LPCSTR sDataSeries = pThreadInfo->m_pData;
UINT nDataSeriesAmount = pThreadInfo->m_nDataLen;
char* pDataRcvBuffer = new char[nDataSeriesAmount];
memcpy(pDataRcvBuffer, sDataSeries, nDataSeriesAmount);
pDataCopyBarrier->wait();
try
{
//载入模块
HINSTANCE hInst;
hInst = LoadLibrary(sModuleName);
typedef (*ACCEPTDATAPROC) (UINT a_nCmdID, LPCSTR a_sDataSeries, UINT a_nDataSeriesAmount, UINT a_nClientID, LPVOID a_cClientAddr,_bstr_t a_strCon, LPVOID a_SendDataFunc);
ACCEPTDATAPROC AcceptData = (ACCEPTDATAPROC)GetProcAddress(hInst,"AcceptData");
//调用模块函数
if (AcceptData)
{
AcceptData(nMsgUserDefined, (LPCSTR)pDataRcvBuffer, nDataSeriesAmount, nClientID, pClientStream, strCon, SendDataFunc);
}
FreeLibrary(hInst);
}
catch(...)
{
delete[] pDataRcvBuffer;
return 1;
}
delete[] pDataRcvBuffer;
return 0;
}
这是线程函数
还可以尝试把线程中的代码搬到主线程,然后线程中发送消息等来通知主线程执行对应的代码
{
#ifndef _MT
nExitCode;
bDelete;
#else
// remove current CWinThread object from memory
AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
CWinThread* pThread = pState->m_pCurrentWinThread;
if (pThread != NULL)
{
ASSERT_VALID(pThread);
ASSERT(pThread != AfxGetApp());