多线程启动的问题请教!
有多个通道,一个通道启动一个线程来控制,怎样实现?
不胜感谢!
问题点数: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




