CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

多线程启动的问题请教!

楼主yufeng2002(CSDN,I like)2003-01-07 20:37:12 在 VC/MFC / 进程/线程/DLL 提问

有多个通道,一个通道启动一个线程来控制,怎样实现?  
   
  不胜感谢! 问题点数:20、回复次数:5Top

1 楼icelight(给我一个接口,我能驱动地球……………仪)回复于 2003-01-07 20:53:38 得分 0

??你想问什么??  
   
  将每个通道作为参数传给线程不就行了吗?  
   
  说详细点。Top

2 楼yufeng2002(CSDN,I like)回复于 2003-01-07 21:00:27 得分 0

怎么传递?  
   
  每个通道控制数据的传递  
   
  可否具体一点的代码?Top

3 楼denis95(denis95)回复于 2003-01-07 21:07:02 得分 20

BOOL   CTermSrvPort::ChannelOpen()  
  {  
  CRTU*   pRTU   =   NULL;  
  while   (!   m_rtuList.IsEmpty())  
  {  
  pRTU   =   (CRTU*)(m_rtuList.RemoveHead());  
  delete   pRTU;  
  }  
   
  //初始化rtu链表  
  Close   ();  
  if   (!Create   ())  
  {  
  TRACE("socket   create   failed\n");  
  return   FALSE;  
  }  
  if   (!   Connect   (m_szDestIPAddress,m_nDestPort)   )  
  {  
  TRACE("socket   connect   failed\n");  
  //return   FALSE;  
  }  
   
  char szID[NAMEMAXLEN];  
  char szName[NAMEMAXLEN];  
  char szProtocol[NAMEMAXLEN];  
  char szSlaveID[NAMEMAXLEN];  
   
  PDBPROCESS dbproc;      
  PLOGINREC login;        
   
  RETCODE result_code;  
   
  login   =   dblogin();  
  DBSETLUSER   (login,   SMSDBLOGIN);  
  DBSETLAPP   (login,   SMSDBAPPNAME);  
  DBSETLPWD   (login,   SMSDBPASSWORD);  
  DBSETLVERSION(login,DBVER60);  
   
  dbsetlogintime   (3);  
  if   ((dbproc =   dbopen   (login,   SMSDBSRV))   ==   NULL)  
  {  
  TRACE("登录失败\n");  
  return   FALSE;  
  }  
   
  dbuse   (dbproc,   SMSDBNAME);  
   
  dbfcmd   (dbproc,   (char   *)"select   id,名称,协议,站址   from   %s   where   所属通道=   '%s'   and   使用标志   =   1   and   所属项目   =   '%s'   ",  
  TAB_RTU_PARA,m_szName,   m_szProjectName   );  
  dbsqlexec   (dbproc);  
  result_code   =   dbresults(dbproc);  
   
  dbbind   (dbproc, 1,   NTBSTRINGBIND,   (DBINT)   0,   (unsigned   char*)szID);  
  dbbind   (dbproc, 2,   NTBSTRINGBIND,   (DBINT)   0,   (unsigned   char*)szName);  
  dbbind   (dbproc, 3,   NTBSTRINGBIND,   (DBINT)   0,   (unsigned   char*)szProtocol);  
  dbbind   (dbproc, 4,   NTBSTRINGBIND,   (DBINT)   0,   (unsigned   char*)szSlaveID);  
   
  while   (dbnextrow(dbproc)   !=   NO_MORE_ROWS)  
  {  
  if   (stricmp(szProtocol,"ModbusSRTU530p")   ==   0)  
  {  
  pRTU   =   new   CModbusSRTU530p;  
  }  
  else   if   (stricmp(szProtocol,"ModbusEPM420")   ==   0)  
  {  
  pRTU   =   new   CModbusEPM420;  
  }  
  else  
  {  
  ASSERT   (FALSE);  
  }  
   
  ASSERT   (pRTU   !=   NULL);  
   
  pRTU->m_nRTUID   =   atoi(szID);  
  strcpy(pRTU->m_szName,szName);  
  pRTU->m_nSlaveID   =   atoi(szSlaveID);  
   
  pRTU->m_pTermSrvPort   =   this;  
  m_rtuList.AddTail(pRTU);  
  }  
  result_code   =   dbclose(dbproc);  
   
  AfxBeginThread(TermSrvPortProc,this);  
   
  return   TRUE;  
  }  
   
   
  /*  
  *   函数介绍:为每一个通道开启一个进程,用于与term   server的网络端口进行循环通信  
  这个函数直到pTermPort->m_bExitThread为TRUE的时候才返回  
  *   输入参数:通道指针  
  *   输出参数:无  
  *   返回值     :TRUE->成功,FALSE->失败  
  */  
   
  UINT   TermSrvPortProc(LPVOID   param)  
  {  
  CTermSrvPort*   pTermPort   =   (CTermSrvPort*)param;  
  ASSERT   (pTermPort   !=   NULL);  
   
  pTermPort->m_bThreadRunning   =   TRUE;  
  CRTU*   pRTU   =   NULL;  
  /*下面程序进入规约处理循环*/  
  while   (!   pTermPort->m_rtuList.IsEmpty())  
  {  
  if   (pTermPort->m_bExitThread)  
  {  
  pTermPort->m_bThreadRunning   =   FALSE;  
  return   FALSE; //线程退出标志被置位,线程将退出  
  }  
   
  POSITION   pos   =   pTermPort->m_rtuList.GetHeadPosition();  
  while   (pos   !=   NULL)  
  {  
  pRTU   =   (CRTU*)(pTermPort->m_rtuList.GetNext   (pos));  
  pRTU->ProtocolProc   ();  
  Sleep(100);  
  if   (pTermPort->m_bExitThread)  
  {  
  pTermPort->m_bThreadRunning   =   FALSE;  
  return   FALSE; //线程退出标志被置位,线程将退出  
  }  
  }  
  }  
   
  pTermPort->m_bThreadRunning   =   FALSE;  
  return   TRUE;  
  }Top

4 楼icelight(给我一个接口,我能驱动地球……………仪)回复于 2003-01-07 21:07:25 得分 0

你说的通道指什么?NAMEPIPE?Top

5 楼yufeng2002(CSDN,I like)回复于 2003-01-07 21:14:17 得分 0

控制数据的。有8台机器向服务器的数据卡发送数据,用8个通道分别控制,然后不同处理!Top

相关问题

  • 请教多线程的自动启动?
  • 多线程启动的问题,为什么会出错.
  • 请问如何在多线程中启动WORD并打印文档
  • 多线程啊多线程
  • 多线程socket!!!
  • 多线程
  • 多线程
  • 多线程
  • 多线程
  • CSocket 多线程

关键词

  • 数据
  • dbproc
  • namemaxlen
  • prtu
  • 通道
  • login
  • trace

得分解答快速导航

  • 帖主:yufeng2002
  • denis95

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo