有多个通道,一个通道启动一个线程来控制,怎样实现?不胜感谢!

解决方案 »

  1.   

    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;
    }