设计已经做得差不多了,但由于以前没有做过无界面的Socket程序,我想在做之前请教一下:
(前提:在服务中使用MFC已经解决了)1) 在没有界面的Windows服务中有否可能使用用户界面线程?
//主线程也是没有界面的
//不想使用工作者线程的原因是没法把线程入口点定义到类里面
//把m_pMainWnd置成空,可以使用么?2) 有人说在多线程中CSocket::OnReceive可能会不响应,是不是只针对工作者线程?有办法解决么?
//这对用户界面线程,有没有同样的问题?
//时间关系,最好不直接调用WindowsApi.3) AfxSockInit()和CoInitialize()需要调用吗?4) 如果在子线程里面创建CSocket,则不需调用Detach和Attach;对吗?
(前提:在服务中使用MFC已经解决了)1) 在没有界面的Windows服务中有否可能使用用户界面线程?
//主线程也是没有界面的
//不想使用工作者线程的原因是没法把线程入口点定义到类里面
//把m_pMainWnd置成空,可以使用么?2) 有人说在多线程中CSocket::OnReceive可能会不响应,是不是只针对工作者线程?有办法解决么?
//这对用户界面线程,有没有同样的问题?
//时间关系,最好不直接调用WindowsApi.3) AfxSockInit()和CoInitialize()需要调用吗?4) 如果在子线程里面创建CSocket,则不需调用Detach和Attach;对吗?
解决方案 »
- 又收到个offer,工资提前到账,小开心散个分同时分享下这周的面试
- 关于from 'class CWnd *' to 'class CEdit *'
- Formatting CString for rich edit control.
- 请教一个刻度划分的算法?
- 从文件中读入bmp图像,然后显示直方图,怎么做?
- 弱弱的问:引入头文件的“include”语句与其位置有关吗?
- 动态连接库可以用utlraedit修改吗?急
- CRectTracker橡皮盤類初級問題!送分
- 怎样在同一系统中既做服务器又作客户端?谢谢!
- LRESULT APIENTRY WndProc(... ...)过程头定义中的APIENTRY是何意?
- 我用vc6.0建立了一个多文档应用。 我想在建立一个child窗口(这个窗口上放控件),请问如何建立啊,紧急!
- 关于cfgmgr32.h使用问题
线埕定义到类里面去不是很简单吗?
static DWORD WINAPI ThreadFucn()
2)CSOCKET不适合用多线埕,如果要开多线埕最好用API不用MFC的类;
3)AfxSockInit()是要调用的(如果用的是CSocket)
4)同2)
那也是为什么CSocket::OnRecice()在多线埕中收不到消息通知的原因了;当然
在子线埕中你没必要使用Detach和Attach;
//GUI线程完全不可行吗?2) 有人在多线程中用过CSocket么?还是大家都用的是WinApi?如果这样我会很郁闷...:-(
gdy119可以再帮帮忙吗。另开窗给分都可以。
推荐使用API,不要用CSocket
//GUI线程完全不可行吗?2) 有人在多线程中用过CSocket么?还是大家都用的是WinApi?如果这样我会很郁闷...:-(
//-------------------------------------------------------------------------------------
GUI线埕完全不行!
多线埕中用CSocket容易出错,因为CSocket是封状的wsaasyncselect()模型必须要有窗口接收!
所以在多线埕中投递消息比较麻烦,但是还是可以用多线埕的!
怎么访问不到类的成员? 你将类的指针带到线埕里面去嘛!!!!!
CSOCKET不支持多线程(指工作者线程)
建议不要用消息方式,可以用 事件、I/O 重叠 或IOCP.
那末,一个线程一个Socket,使用CSocket::ReceiveFrom()来做Polling.最后请教一下,创建CSocket的实例时,如果在线程外面Create好然后做为参数传递到线程方法中,是不是需要这样:(我没有真的编过,所以请各位高人指教了)外面:AfxSockInit();
CSocket *mySocket = new CSocket();
mySocket->Create(xxx,xx,xx)
AfxBeginThread(myFunc, (LPVOID)mySocket->Detach());
delete mySocket;里面:
static UINT myClass::myFunc(LPVOID pParam)
{
CSocket mySocket;
SOCKET socketHandle = (SOCKET)pParam;
if (socketHandle != NULL)
{
mySocket->Attach(socketHandle);
while (true)
mySocket->ReceiveFrom(buf, xxx, xxx, xx);
}
}请问:
这样的程序没有使用消息方式来用CSocket,可以运行吗?关于Detach和Attach,我不是很清楚Detach该运行在Create前还是后,在Attach前还要不要再对于Attach到SOCKET的那个Socket再做一次Create。在外面的delete mySocket,是否会影响到里面的Socket?各位能否指教?我真罗嗦...这是俺这个话题的最后问题,解决了马上结贴子,谢谢。
即使你在线程中没有使用消息函数,
但是CSOCKET本身有一个消息循环,如果找不到一个有效指向的WINDOW来发送,系统自动报错的。
所以还是不行。
怪不得我在线程中使用CSocket经常出错
学习了