有多个通道,一个通道启动一个线程来控制,怎样实现?不胜感谢!
解决方案 »
- 高手帮帮忙,我想让线程中几条语句执行完后,再转到别的线程,是当中的几条语句,怎么实现啊。在线急等。
- 如何实现 打印预览的内容 和 打印结果 显示的内容一致???????????
- HELP! DNS不能用了!
- 一个字符串转换成double类型的问题
- 关于转正待遇---各位有没有碰到过这种情况?
- 急求FFT!
- 我做了个聊天室程序,分为服务端和客户端,如果在两个不同的网吧中通讯是不是需要访问网吧主机的Proxy服务器?
- VC++和Java哪一个更有前途???
- 请教关于CTime的问题
- 请问,在程序中如何用Create方法创建一个FormView
- 计算机的并口通信问题!
- 怎样使用发送消息的方式实现CListBox的AddString()方法,就像使用发送WM_SETTEXT消息可以调用CWnd的SetWindowText()那样。。。。
{
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;
}