VC MFC 多线程 求教

忽悠 2011-05-03 01:53:13
我现在郁闷中,多线程就是建立主线程了,然后子线程,子线程共享变量,这个子线程如何区分,我没明白啊,比如说,我有3种方法,sun1(),sun2(),sun3(),然后3个用多线程去处理咋弄?在比如我要做socket通信,我要求多个客户端去访问服务器,而服务器要去开启线程处理每个客户端,这个有点不知道从哪里下手,给我个简单的例子吧,或者给我说说,来个“仙人指路”就好。

...全文
133 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
用心飞翔 2011-05-04
  • 打赏
  • 举报
回复
建议楼主先用对话框创建一个最简单的线程,把对话框的static text从1开始显示,然后2、3,了解好什么叫线程、进程等知识
King_hhuang 2011-05-03
  • 打赏
  • 举报
回复
为了不影响界面刷新,应该是开一个线程(只有一个)accept(放到线程中的while(true)循环中);accept到连接后,再开线程来处理这个客户端连接的读写操作(每个socket连接对应一个线程)
忽悠 2011-05-03
  • 打赏
  • 举报
回复
哦,前面有段写错了, threadConvert = AfxBeginThread(ThreadConvert, this);我放在了start里面。
void CServer_textDlg::OnBnClickedButtonstart()
{
// TODO: 在此添加控件通知处理程序代码
this->UpdateData();
m_pServer = new MServerSocket(this);
if (!m_pServer->Create(70))
{
MessageBox(_T("套接字创建失败"));
delete m_pServer;
m_pServer = NULL;
return;
}
else
{
AfxMessageBox(_T("启动成功"));
}
threadConvert = AfxBeginThread(ThreadConvert, this);//这里
if (!m_pServer->Listen())
MessageBox(_T("监听失败"));
}
这是我原先写的。然后把Accept放在线程里面,连接一个客户端就开启线程,是不是这样的?我自己对线程不太理解,看了不少资料云里雾里的。。现在就是想开启一个客户端就开启一个线程,一一对应,哎。。纠结了。
King_hhuang 2011-05-03
  • 打赏
  • 举报
回复
你这个是什么逻辑啊
你Accept之后,开线程又Accept,那你这程序还有完没完啊

你的线程中应该实现的功能是MClientSocket* socket = new MClientSocket(this);
与这个socket连接的通信(send、recv之类的操作)
忽悠 2011-05-03
  • 打赏
  • 举报
回复
UINT CServer_textDlg::ThreadConvert(LPVOID lParam)
{
CServer_textDlg* textDlg = (CServer_textDlg*)lParam;//定义指针调用

textDlg->AcceptConnect();
return 0;
}
可以帮我调试下吗?我可以发邮件,如果不行的话,帮我讲解下,我新手,日志如何跟踪。。
King_hhuang 2011-05-03
  • 打赏
  • 举报
回复
把你的线程函数ThreadConvert贴出来看看

通过日志跟踪一下,程序到底运行到哪个位置出错的
忽悠 2011-05-03
  • 打赏
  • 举报
回复
void CServer_textDlg::AcceptConnect()
{
MClientSocket* socket = new MClientSocket(this);
//接受客户端的连接
if (m_pServer->Accept(*socket))
{
m_socketlist.AddTail(socket);
threadConvert = AfxBeginThread(ThreadConvert, this);//这里有问题吧,好像,我客户端申请链接就出错。
}
else
delete socket;
}
错误原因:Debug Assertion Failed!
King_hhuang 2011-05-03
  • 打赏
  • 举报
回复
AfxBeginThread(ThreadConvert, this);你最好把你Accept到的那个socket作为参数传进去

另外你的程序是运行到哪里出错的?
忽悠 2011-05-03
  • 打赏
  • 举报
回复
King_hhuang,真是雪中送炭啊,感谢你抽空看我的代码。。。我现在很急。。= =!为啥Debug会出错
忽悠 2011-05-03
  • 打赏
  • 举报
回复
我加入了threadConvert = AfxBeginThread(ThreadConvert, this);但是编译成功后,启动服务器会出错。Debug Assertion Failed!这是为啥。。我郁闷
King_hhuang 2011-05-03
  • 打赏
  • 举报
回复
void CServer_textDlg::AcceptConnect()
{
MClientSocket* socket = new MClientSocket(this);
//接受客户端的连接
if (m_pServer->Accept(*socket))
m_socketlist.AddTail(socket);
else
delete socket;
}

Accept成功后,就开一个线程AfxBeginThread专门处理这个连接
忽悠 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 king_hhuang 的回复:]
我有3种方法,sun1(),sun2(),sun3(),然后3个用多线程去处理咋弄?
如果你不考了线程同步的话,那你就直接开三个线程调用这三个函数啊
如果要做线程同步,一般有:
临界区(CCriticalSection)
事件(CEvent)
互斥量(CMutex)
信号量(CSemaphore)
几种方法,自己去了解一下先

socket的C/S模型你看看这个例子吧
h……
[/Quote]我是新手你的例子有点复杂,上面是我做的socket通信,服务器端的,不知道如何取弄。。哎。悲剧,你给的例子我也看了,有点看不懂。。
忽悠 2011-05-03
  • 打赏
  • 举报
回复
我搜索过了,看的云里雾里的,能给我讲下具体的实现吗?
void CServer_textDlg::OnBnClickedButtonstart()
{
// TODO: 在此添加控件通知处理程序代码
this->UpdateData();
m_pServer = new MServerSocket(this);
if (!m_pServer->Create(70))
{
MessageBox(_T("套接字创建失败"));
delete m_pServer;
m_pServer = NULL;
return;
}
else
{
AfxMessageBox(_T("启动成功"));
}

if (!m_pServer->Listen())
MessageBox(_T("监听失败"));
}

void CServer_textDlg::ReceiveData(MClientSocket* socket)
{
char bufferdata[BUFFERSIZE];
//接受客户端数据
int result = socket->Receive(bufferdata, BUFFERSIZE);
bufferdata[result] = '\0';
str.Format(_T("%s"),bufferdata);
int i = m_list.GetCount();
//将数据写入Listbox
if (str != "")
{
m_list.InsertString(m_list.GetCount(), str);
SetTimer(1,5000,NULL);
}
else
{
m_list.SetCurSel (i - 1);
}
}
void CServer_textDlg::AcceptConnect()
{
MClientSocket* socket = new MClientSocket(this);
//接受客户端的连接
if (m_pServer->Accept(*socket))
m_socketlist.AddTail(socket);
else
delete socket;
}
void CServer_textDlg::OnBnClickedButtonstop()
{
// TODO: 在此添加控件通知处理程序代码
CString temp_text = (_T("已断开"));
m_list.InsertString(m_list.GetCount(),temp_text);
m_pServer->Close();
}

void CServer_textDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (str = "")
{
AfxMessageBox(_T("11111111111111"));
KillTimer(1);
}
CDialog::OnTimer(nIDEvent);
}
谢谢了,如何把多线程写进去,要求就是每一个客户端连接就给一个线程,客户端断开连接就关闭那个线程。
  • 打赏
  • 举报
回复
通常的程序都是从入口函数开始
一直顺序的往下执行,直至结束

所谓多线程可以理解成,把某个函数独立起来运行,不依赖上述的顺序。写个简单的程序,希望你能理解

//线程函数
UINT ThreadFun(void*)
{
while(1)
printf("线程函数");
}

//主函数
int main()
{
CreateThread(ThreadFun);
while(1)
printf("主函数");
}

当然我这个程序有错误,自己去找资料看怎么用多线程吧

我有3种方法,sun1(),sun2(),sun3(),
CreateThread(sun1)、CreateThread(sun2)、CreateThread(sun3)

这里有资料
http://www.vckbase.com/document/listdoc.asp?mclsid=13&sclsid=1305
King_hhuang 2011-05-03
  • 打赏
  • 举报
回复
我有3种方法,sun1(),sun2(),sun3(),然后3个用多线程去处理咋弄?
如果你不考了线程同步的话,那你就直接开三个线程调用这三个函数啊
如果要做线程同步,一般有:
临界区(CCriticalSection)
事件(CEvent)
互斥量(CMutex)
信号量(CSemaphore)
几种方法,自己去了解一下先

socket的C/S模型你看看这个例子吧
http://download.csdn.net/source/2684063
ouyh12345 2011-05-03
  • 打赏
  • 举报
回复
搜索
socket 服务端

首先理解多线程

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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