问题如上,代码简化如下:
void ser_thread(void * iparam)
{
AfxSocketInit();
//class cser:public csocket
cser *a;
a->create(7777,"127.0.0.1");
a->listen(5);
......
}
void cli_thread(void * iparam)
{
AfxSocketInit();
//class ccli:public csocket
ccli *b;
b->create();
b->connect("127.0.0.1",7777);
....
}//OnAccept未被调用
void cser::OnAccept(int c)
{
AfxMessageBox("OnAccept",MB_OK,0);
CSocket::OnAccept(c);
}//将ser_thread改为
void ser_thread(void * iparam)
{
AfxSocketInit();
//class cser:public csocket
cser *a;
a->create(7777,"127.0.0.1");
a->listen(5);
CSocket d;
if(a->accept(d))
{
AfxMessageBox("Accept",MB_OK,0);//可以被调用
}
}
//如将下面代码放入主线程的OnInitDialog中就可以正常调用OnAccept,请问这是为身摸,如何才能在线程中正常使用
AfxSocketInit();
//class cser:public csocket
cser *a;
a->create(7777,"127.0.0.1");
a->listen(5);
void ser_thread(void * iparam)
{
AfxSocketInit();
//class cser:public csocket
cser *a;
a->create(7777,"127.0.0.1");
a->listen(5);
......
}
void cli_thread(void * iparam)
{
AfxSocketInit();
//class ccli:public csocket
ccli *b;
b->create();
b->connect("127.0.0.1",7777);
....
}//OnAccept未被调用
void cser::OnAccept(int c)
{
AfxMessageBox("OnAccept",MB_OK,0);
CSocket::OnAccept(c);
}//将ser_thread改为
void ser_thread(void * iparam)
{
AfxSocketInit();
//class cser:public csocket
cser *a;
a->create(7777,"127.0.0.1");
a->listen(5);
CSocket d;
if(a->accept(d))
{
AfxMessageBox("Accept",MB_OK,0);//可以被调用
}
}
//如将下面代码放入主线程的OnInitDialog中就可以正常调用OnAccept,请问这是为身摸,如何才能在线程中正常使用
AfxSocketInit();
//class cser:public csocket
cser *a;
a->create(7777,"127.0.0.1");
a->listen(5);
并且我将CSocket放在主线程中也是可以正确触发OnAccept的呀?如用CAsyncSocket的化就没必要放入子线程了,因为它本身就是非阻塞的呀。
while(::GetMsg(&msg,NULL,....) 之类的代码?如果你不是用户界面线程,这需要你自己做的你关于CSocket+OnAccept后面的话是对的,但是你怎么保证他没处于阻塞状态呢?为什么要跨越模型使用一种不合理的方法呢?
我是初接触CSocket和CAsyncSocket,比较菜,呵呵
您的程序看上去是单线程的,这个我用SOCKET或CAsyncSocket也都可以模拟,但我现在是将CAsyncSocket或CSocket的派生类放到子线程中创建后无法触发事件(FD_XXX),但不用事件直接用while(1){accept(client)}模式是可以的,我的疑问就是如何才能出发FD_XXX事件
去找找“用户UI线程”相关知识,这个需要几个月才能弄明白的,多线程设计是个很复杂的话题
我也遇到了这个问题,一直没想明白,因为我是把一个Worker Thread给重新封装了一下,没有想到消息循环。
明天去试试是不是这么回事。