一个简单的问题

tiankongzhiying 2008-08-22 12:27:57
终止线程有什么好的方法。
我在做聊天室的时候 要实现一个修改姓名的功能,我的程序现在只能修改一次姓名,你第二次修改以后,他就会两个名字交替使用,我猜是两个两个姓名公用了一个线程,这是我的源程序void CCharroomDlg::OnModify()
{
// TODO: Add your control notification handler code here
// ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS))->GetAddress(dwIP);
DWORD ThreadId,threadID1;

function *fun = new function;
fun->sock = m_socket;
fun->hwnd = m_hWnd;
CString strname;
GetDlgItemText(IDC_EDIT_NAME,strname);
SetDlgItemText(IDC_EDIT_RECV,strname+"进入聊天室");
int len = strname.GetLength();
char* m_name = new char[len];
m_name = strname.GetBuffer(0);
for(int i = 0; i<len; i++)
{
fun->name[i] = m_name[i];
}
fun->name[len] = '\0';

if(flag)//刚开始时 它初时化为TRUE
{
hthread1 = CreateThread(NULL,0,RecvProc,(LPVOID)fun,0,NULL);
flag = FALSE;
closeHandle(hthread1);//hthread1在头文件中定义了。
}
//_endthreadex(uExitCode1);
else{
DWORD uExitCode1;
GetExitCodeThread(hthread1,&uExitCode1);
ExitThread(uExitCode1);
hthread1= CreateThread(NULL,0,RecvProc,(LPVOID)fun,0,&ThreadId);

CloseHandle(hthread2);
}

}
我也尝试过用上面的函数关闭线程,但是他把整个窗体都关闭了。
几经同学修改 现在变得面目全非了。最后还是没有实现修改名字的功能。
如果哪个有兴趣看我的整个程序,并能够帮我把我的问题解决了,请把邮箱地址留下,解决了直接加100分。
...全文
87 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
scq2099yt 2008-08-26
  • 打赏
  • 举报
回复
最好是线程自然结束
greatws 2008-08-25
  • 打赏
  • 举报
回复
GetExitCodeThread(hthread1,&uExitCode1);
ExitThread(uExitCode1); //把对话框线程关闭了
hthread1= CreateThread(NULL,0,RecvProc,(LPVOID)fun,0,&ThreadId);


你ExitThread调用的地方不对,应该在线程函数中调用,你这样一调,就是关闭主线程

还有,线程最好是让其自行结束。TerminateThread函数,虽然可以强行结束线程,但在线程中分配的内存、占据的临界区,这些都不会被释放
rookieme 2008-08-25
  • 打赏
  • 举报
回复
char* m_name = new char[len];
m_name = strname.GetBuffer(0);
这两句有问题,第一句为m_name申请了空间,第二句将m_name重新指向strname的空间,前者申请的空间泄漏了,第一句删去
线程的结束最好让线程自行结束:
定义一个全局或静态bool变量
在辅线程中不断查询此变量,TRUE时运行线程,在主线程中将此变量置FALSE, 线程自行结束
tiankongzhiying 2008-08-25
  • 打赏
  • 举报
回复
我自己顶一下

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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