【讨论】关于线程的错误,大家都进来看看~~~~~~~~~~~`````

suowei9 2003-12-29 10:16:22
程序报错,跟踪进入了 thrdcore.cpp 文件里,到达第114行出现错误

// first -- check for simple worker thread
DWORD nResult = 0;
if (pThread->m_pfnThreadProc != NULL)
{
nResult = (*pThread->m_pfnThreadProc)(pThread->m_pThreadParams); //这里报错
ASSERT_VALID(pThread);
}

可我不知道这个是什么错误??怎么个修改法?还望大家教导一下
...全文
223 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
haizhiyu 2003-12-30
  • 打赏
  • 举报
回复
似乎没有很好的办法,只能查找在线程中(或相关的部分)用到的资源,包括内存、句柄等,特别是new、Create...的地方。
brytison 2003-12-30
  • 打赏
  • 举报
回复
讨论得不错。
suowei9 2003-12-29
  • 打赏
  • 举报
回复
对,对,对,程序越运行越慢,内存占用很大

那最后的解决方法是什么呢??
haizhiyu 2003-12-29
  • 打赏
  • 举报
回复
我遇到过类似的问题,最终找到的错误是在该线程处理的数据指针释放方面的原因,最终运行错误的积累而使程序本溃.
suowei9 2003-12-29
  • 打赏
  • 举报
回复
GetLastError得到的是0

jimsleon 2003-12-29
  • 打赏
  • 举报
回复
有没有检查你的Log输出?里面什么信息?出现异常时你提供的现场信息太少:(
thisisyjs 2003-12-29
  • 打赏
  • 举报
回复
应该是这样的:
AfxBeginThread((AFX_THREADPROC)CVSDlg::OnRecvThread,(LPVOID)Client,THREAD_PRIORITY_NORMAL,0,0,NULL);
suowei9 2003-12-29
  • 打赏
  • 举报
回复
Sleep你可以忽略,我是为了给CPU一点空闲时间,防止CPU占用率太高
haizhiyu 2003-12-29
  • 打赏
  • 举报
回复
没有细看,但既然有事件等待Waitfor....,为什么还要sleep?
suowei9 2003-12-29
  • 打赏
  • 举报
回复
执行到 if(recv(*Client,buf,MAX_BUFFER,0)!=SOCKET_ERROR) 这一步的时候就跳进
CATCH块里了
suowei9 2003-12-29
  • 打赏
  • 举报
回复
楼上的,先谢谢:),我照你说的改了,但是错误还是一样的,并且现在更加明显了,只要有连接一来就报错,原先还要运行一阵才会报错的
vcforever 2003-12-29
  • 打赏
  • 举报
回复
AfxBeginThread(OnRecvThread,(LPVOID)Client,THREAD_PRIORITY_NORMAL,0,0,NULL);
这句中把你的Client的指针作为参数传递给线程函数

然后在线程函数中
UINT CVSDlg::OnRecvThread(LPVOID lParam)
{

SOCKET* pClient=(SOCKET*)lParam;
///然后用到Client的地方用*pClient来代替
。。。。。。。。
}
试一试!希望对你有所帮助!
thisisyjs 2003-12-29
  • 打赏
  • 举报
回复
UINT CVSDlg::OnRecvThread(LPVOID lParam)
这个函数是否声明为 static ?
suowei9 2003-12-29
  • 打赏
  • 举报
回复
AfxBeginThread(OnRecvThread,(LPVOID)Client,THREAD_PRIORITY_NORMAL,0,0,NULL);

UINT CVSDlg::OnRecvThread(LPVOID lParam)
{

SOCKET Client=(SOCKET)lParam;
try
{
while(1)
{
Sleep(200);
if(::WaitForSingleObject(g_eventKill,0)==WAIT_OBJECT_0)
return 0L;

char buf[MAX_BUFFER];
memset(buf,0,MAX_BUFFER);
if(recv(Client,buf,MAX_BUFFER,0)!=SOCKET_ERROR)
{
CString m_temp;
m_temp.Format("%s",buf);
m_temp.Trim();
if(m_temp!="")
{
if(!Sub(Client,m_temp))
{
closesocket(Client);
break;
}
}
}
else
{
return 0L;
}
}
}
catch(...)
{
CString m_Erro;
m_Erro.Format("%d",GetLastError());
m_LogFile.Open("Log.txt",FALSE);
m_LogFile.AppendString(lHandle,"线程发生错误",TRUE);
m_LogFile.AppendString(lHandle,m_Erro,TRUE);
m_LogFile.Close();
throw;

}
return 0L;
}
vcforever 2003-12-29
  • 打赏
  • 举报
回复
你的线程的参数是如何传递的呢?
估计是线程参数的问题,能否贴出代码?
蒋晟 2003-12-29
  • 打赏
  • 举报
回复
http://search.csdn.net/expert/topic/50/5005/2001/8/21/249613.htm
里面我的代码包含一个线程管理器,包含等待线程队列/运行线程队列和已结束线程队列的管理
会思考的草 2003-12-29
  • 打赏
  • 举报
回复
比较笨的办法,就是在每个涉及到对Client的操作之前,先判断该对象是否可用。如果不可用,就清理现场,终止线程。
Mr-Chen 2003-12-29
  • 打赏
  • 举报
回复
学习
会思考的草 2003-12-29
  • 打赏
  • 举报
回复
最好能在开辟线程的时候传递给它持久的对象指针。
会思考的草 2003-12-29
  • 打赏
  • 举报
回复
你用的是MFC的CWinThread类,这个东西在你用AfxBeginThread的时候就会创建一个C++对象,当线程结束后,C++对象依然是可以存在的,必须要delete掉。如果你设置其bAutoDelete属性也是可以的。
加载更多回复(12)

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧