导出类
有没有好的模式?
有没有好的模式?
解决方案 »
- WIN7下用MSCOMM控件
- vc怎么调用压缩类?
- 求助,我分割了视图,定义了一个CFormView,但是这两个View类,要用同一个定时器?
- 串口通信与作图的问题
- recv()是阻塞函数把? while( cc=recv(ssock,buf,sizeof(buf)-1,0) ){
- 求高性能网络服务程序!
- 哪个帮忙解释一下HDC。。。在哪会用到这个。。
- 如果下列代码可以获取控件所在区域,那么对话框移动之后,怎麽再次获取?
- 如何在VC++中向ODBC数据库写入
- 请问一下MFC的删除字符并重新显示问题
- 请教怎么将xvid编码地的视频和pcm编码地音频写成MP4文件
- 请问该如何学习微软语音识别系统???
但是如何通知调用者呢?
可是网络通信那是个新的线程,要求双端通信新线程里面的数据如何通过导出类通知到调用者呢?
CCore是导出类
typedef int(*EventCallBack)(EVENTDATA* pData);
EventCallBack CallBackFun;都是类成员
调用者注册回调
int CCore::funRegEvent(DWORD dwFun)
{
CallBackFun=(EventCallBack)dwFun;
return 1;
}
//调用者调用登陆函数
int CCore::funLogin(const char* pszID,const char* pszPWD,int nState)
{
//启动通信线程
HANDLE hw=CreateThread(NULL,0,ThreadFun,(LPVOID)this,0,0);
if(hw)
{
CloseHandle(hw);
}
return 0;
}
ThreadFun 线程函数需要双端通信,获取的数据如何通过CCore对象传递到调用者呢?
调用者又该如何通过CCore对象通过ThreadFun 向外发送消息呢?
CCore 怎么直接和ThreadFun 线程函数通信吧?
ThreadFun 函数怎么设计好呢?
DWORD WINAPI ThreadFun (LPVOID lpThreadData)
{
CCore* pCoreObj=(CCore*)lpThreadData;
InitSocket(pCoreObj->m_Socket);
ConnectToRemote(IP,Port);
//使用select
fd_set readfds;
fd_set writefds;
timeval to;
to.tv_sec = 0;
to.tv_usec = 30000;//30秒超时
int nSelectResult=SOCKET_ERROR;
while(true)
{
FD_ZERO( &readfds );
FD_ZERO( &readfds );
FD_SET(pCoreObj->m_Socket, &readfds );
FD_SET(pCoreObj->m_Socket, &writefds );
nSelectResult=select(0, &readfds, &writefds, NULL, &to);
switch(nSelectResult)
{
case SOCKET_ERROR:
break;
case 0://timeout
break;
default:
{
if (FD_ISSET(pCoreObj->m_Socket, &readfds))
{
recv()//?
}
if (FD_ISSET(pCoreObj->m_Socket, &writefds))
{
send()//?
}
}
break;
}//switch
}
}
在外面调用DLL的类继承接口并实现接口,通过DLL的导出函数绑定接口指针以及通信类发送消息
class __declspec(dllexport) CCore
{
}
所以说调用者直接调用CCore中的方法是没问题的
调用者注册回调函数后,CCore对象也可以直接通知调用者了
现在问题是,调用者如何操作 工作线程
当你主动通知用户时(比如收到数据需要传给用户)就调用该回调函数,用户在回掉函数得到信息(比如你收到的网络数据)后,用户自己在回掉函数做处理。
当用户有数据传给你时,直接调用你导出的接口函数。
这样达到了你和用户的双向通信都有问题了。
我就是这么设计的
现在是工作线程和dll导出类怎么通信的问题