⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctuxedothread.cpp

📁 调用tuxedo服务的dll库的源代码。其中用到了c++ qt 库4.3。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <atmi.h>         /* TUXEDO 头文件*/
#include <fml32.h>
#include "cmyapp.h"
#include "CTuxedoThread.h"
#include "TSEngineQT.h"
#include <QTime>
#include <QMutex>
#include <qt\q3ptrlist.h>
 #include <QWaitCondition>
//#include <qtsoap.h> 
//#include <winuser.h>
//#include "winerror.h"
#include <afxcmn.h>
extern TUXCALLBACK  tuxCallBack;
extern CMyApp myApp;
extern long g_hWnd;
extern FUNTUXEDO fun;
extern bool g_bInited;
extern bool g_bIniting;
extern TSEngineQT app;
extern QMutex g_Mutex;
extern int  g_nInitTimes;
extern bool g_bExit;
extern bool g_bNeedReconn;
extern QWaitCondition g_WaitCondi;
extern Q3PtrList<CTuxedoThread> CallsList;
DWORD g_tmLastCall;

CTuxedoThread::CTuxedoThread()
{
	m_bAsync=false;
	m_bJustFinished=false;
	m_bForInitOrCall=false;

	m_pSndBufFML=0;
	m_pRcvBufFML=0;
	m_nSndBufLen=0;
	m_nRcvBufLen=0;
	g_tmLastCall=0;
	m_ID=-1;
	m_bCalling=false;
	m_ErrID=0;
	m_bPretendInit=false;
 //int jjjj= startTimer(500); 
}

CTuxedoThread::~CTuxedoThread()
{

}
extern void __stdcall TimerProc(HWND hWnd,unsigned int nMsg,unsigned int nTimerid,unsigned long dwTime);
int CTuxedoThread::WebSrvInit(char * wsdlAddr,char * servName,char * portName, char * userName, char * pwd)
{

 return 0;
}
int CTuxedoThread::KeepConnection()
{

   int r=RunInit();
   if(r)
   { 
      return 0;

   }
   else
      g_bInited=true;
   while(1)
   {
        msleep(50);
        int r=0;
		QString sErr="";
		
		while(CallsList.count())
		{   if (g_bExit)
			    break;
		    /*for(int i=1;i<60;i++)
			{
				fun.tpterm();
				r=RunInit();
            }*/
			CTuxedoThread * pThr;
			pThr=CallsList.getFirst();
			if(r)
			{	
				pThr->m_ErrID=r;
                pThr->m_msgDesc=sErr;
			}
		    else
			{	
				//fun.tpbegin(40,0);
				r=pThr->TuxFmlRunCall();
				//fun.tpcommit(0);
				if (r==12)
				{	QTime tm;
					tm.start();
					while(r)
					{
						if (g_bExit) break;
					    msleep(10);
						fun.tpterm();
						msleep(1000);
						//fun.tpbegin(70,0);
						r=RunInit();
						//fun.tpcommit(0);
						pThr->m_ErrID=r;
						pThr->m_msgDesc=m_msgDesc;
						if (r==0)		
						{
							//fun.tpbegin(20,0);
						    r=pThr->TuxFmlRunCall();
                            //fun.tpcommit(0);
						}
						sErr=pThr->m_msgDesc;
                        if(tm.elapsed()>20000)
							break;
					}
				}    
			}
			g_Mutex.lock();
			    CallsList.remove(uint(0));
				pThr->m_bJustFinished=true;
				pThr->m_bCalling=false;
			g_Mutex.unlock();
			/*if (!pThr->m_bJustFinished())
			{ 

				pThr->TuxFmlRunCall();
                m_bJustFinished=false;
                
			}*/

		}

        
        /*if(g_bNeedReconn)
		{
           g_Mutex.lock();
		   
           fun.tpterm();
		   r=RunInit();
		   if (r==0)
			   g_bNeedReconn=false;
		   g_Mutex.unlock();
		   g_WaitCondi.wakeAll();
            

		}*/
        if (g_bExit)
			break;
		 
   }
   fun.tpterm();
   return 0;

}
int CTuxedoThread::RunInit()
{
          // bool rrr= connect( this,SIGNAL(Inited(int)),&app,SLOT(Inited(int)));
         //   bool rrr= connect( this,SIGNAL(Inited(int)),this,SLOT(myInited(int)));
       //connect(
	       m_msgDesc=""; 
		   m_ErrID=0;
          // DWORD tmStart=GetTickCount();
		  /* QTime qtm;
		   //qtm.elapsed();
		   qtm.start();
			while(1)	 
			{
				if(m_bPretendInit && g_bIniting)
                   msleep(20);
				else
					break;
				
				if (abs(qtm.elapsed())>30000)
					break;
			}
			*/
          //  if(g_bInited)
			//	return 0;
			// g_Mutex.lock();
	        int r=0;
			char *sendbuf, *rcvbuf;

			long sendlen, rcvlen;

			int ret;
			char wsn[100];
			QString qs;
			   
			strcpy(wsn,"WSNADDR=");
			strcat(wsn,m_WSNADDR);
			fun.tuxputenv(wsn);
	         int sz=sizeof(TPINIT);
				TPINIT *tpinitbuf = (TPINIT*)fun.tpalloc( "TPINIT",NULL,sz); 
				strcpy(tpinitbuf->usrname,m_userName); 
				strcpy(tpinitbuf->passwd,m_pwd); 
				strcpy(tpinitbuf->cltname,m_cltName); 
				strcpy(tpinitbuf->grpname,m_grpName); 
            /*if(m_bAsync)
				tpinitbuf->flags = TPMULTICONTEXTS;  //Note: if flags = TPMULTICONTEXTS, and FmlCall is called in a thread, FmlCall will return error no 9: Protocol error
			else
                tpinitbuf->flags = 0;*/
            g_nInitTimes++;
			/*if (  g_nInitTimes>1) 
			tpinitbuf->flags =0;//TPMULTICONTEXTS;//TPSA_PROTECTED;// 0;
			else
				tpinitbuf->flags =0;*/
			//tpinitbuf->flags =TPMULTICONTEXTS;
			tpinitbuf->flags = 0;// if use TPMULTICONTEXTS, on 6.5 client will return 9.
			
			//for(int ii=0;ii<5;ii++)
			//{
			if ( fun.tpinit((TPINIT *) tpinitbuf) == -1) 
            {	 //fun.tpterm();
                 QString tpErrDes;
                 m_msgID=MSG_TUX_INIT_FAILED;
				
                 r=tperrno;
				 m_msgDesc.sprintf("Tperrno = %d . Init failed",tperrno);
				 if (r==12)
				 {
                    m_msgDesc=m_msgDesc+" Maybe the WSNADDR invalid or the Tuxedo service not running on the server.";

				 }
				 else if(r==9)
				 {
                    m_msgDesc=m_msgDesc+" Tuxedo is not properly installed.";

				 }
				 else
				 {
						tpErrDes=fun.tpstrerror(tperrno);
						m_msgDesc=m_msgDesc+tpErrDes;
						if(fun.tperrordetail)
						{
							int rd = fun.tperrordetail(0);     
							if (rd == -1)
							{  
								//(void) fprintf(stderr, "tperrordetail() failed!\n");       
								//(void) fprintf(stderr, "tperrno = %d, %s\n",tperrno, tpstrerror(tperrno));       
							}      
							else if (rd != 0) 
							{   tpErrDes=fun.tpstrerrordetail(rd, 0); 
								m_msgDesc=m_msgDesc+tpErrDes;
							}
						}
				 } 
			}
			else
			{
                 m_msgDesc="";
                 g_bInited=true;
                 m_msgID=MSG_TUX_INIT_OK;
				 r=0;
			}
			
           // fun.tpterm();
			//}
			fun.tpfree((char*)tpinitbuf); 
            // g_Mutex.unlock();
				
			if (m_bAsync)
			{   if(g_hWnd)
				{
                   bool bok=PostMessage((HWND)g_hWnd,WM_USER+m_msgID,0,0);
                  
				}
				else if(tuxCallBack)
				{
                 //   emit(Inited(CTuxedoThread *(this)));
					//emit(Inited(int(1)));
					//tuxCallBack(0,0,0);
                    
				}
			}
			m_ErrID=r;
			//g_tmLastCall=GetTickCount();
			g_bIniting=false;
			
			//m_bJustFinished=true;
			return r;// 0;



}
int  CTuxedoThread::TuxSetupCall(char * SrvName, char *inputBuf,char **outputBuf,long * outputLen)
{
   //m_SrvName=SrvName;
   strcpy(m_SrvName,SrvName);
   m_inputBuf=inputBuf;
   m_outputBuf=outputBuf;
   m_outputLen=outputLen;
   return 0;

}
int  CTuxedoThread::TuxFmlSetupCall(char * SrvName)
{
   //m_SrvName=SrvName;
   strcpy(m_SrvName,SrvName);
   action="FmlCall";
   return 0;

}
int CTuxedoThread::TuxFmlAllocBuf(long nSndBufLen,long nRcvBufLen)
{
   m_nSndBufLen=nSndBufLen;
   m_nRcvBufLen=nRcvBufLen;
   TuxFmlFreeBuf();
  //if(!m_pSndBufFML)
   if((m_pSndBufFML = (FBFR32*) fun.tpalloc( "FML32", NULL, m_nSndBufLen+1)) == NULL) 
   {
           m_msgDesc ="Buffer alloc failed";
           return ERROR_BUFF_ALLOC_FAILED;
    }
  //if(!m_pRcvBufFML)
    if((m_pRcvBufFML = (FBFR32*) fun.tpalloc("FML32", NULL, m_nRcvBufLen+1)) == NULL) 
	{
            fun.tpfree((char *)m_pSndBufFML);
			m_pSndBufFML=0;
			m_msgDesc ="Buffer alloc failed";
            return ERROR_BUFF_ALLOC_FAILED;

    }
    return 0;

}
int CTuxedoThread::TuxFmlFreeBuf()
{
	if(m_pSndBufFML)
	{
			fun.tpfree((char *)m_pSndBufFML);
			
			m_pSndBufFML=0;
	}
	if(m_pRcvBufFML)
    {
			fun.tpfree((char *)m_pRcvBufFML);
			m_pRcvBufFML=0;
    }
    return 0;
}
int CTuxedoThread::TuxFmlSetSndFld(long FldID,long nRow, char * pValue,long nLen)
{
   m_msgDesc="";
   int r=0;
   if(!m_pSndBufFML)
   {
      r=ERROR_BUFF_NOT_ALLOCATED;
      m_msgDesc="FML Buffer not allocated yet. Please call TuxFmlAllocBuf first.";
	  return r;

   }
   int ret = fun.Fchg32(m_pSndBufFML,FldID,nRow,pValue,nLen);
   if(ret==1)
   {
     
     return 0;
   }
   else
   { m_msgDesc.sprintf("Tperrno = %d . Init failed",tperrno);
     r=tperrno;
	 return r;
   }

}
int CTuxedoThread::TuxFmlGetRcvFld(long FldID,long nRow, char * pValue,long *pLen)
{
   
   m_msgDesc="";
   if(!m_pRcvBufFML)
   {
      m_msgDesc="FML Buffer not allocated yet. Please call TuxFmlAllocBuf first.";
	  return ERROR_BUFF_NOT_ALLOCATED;

   }
   char cc[100];
   strcpy(cc,"");
   int ret = fun.Fget32(m_pRcvBufFML,FldID,nRow,cc,(FLDLEN32*)pLen);
   //int ret = fun.Fget32(m_pRcvBufFML,FldID,nRow,pValue,(FLDLEN32*)pLen);
   strcpy(pValue,cc);
   if(ret==1)
   {
     //MessageBoxA(NULL,pValue,"",MB_OK);
     
     return 0;
   }
   else
   { m_msgDesc.sprintf("Tperrno = %d . Init failed",tperrno);
     return int(tperrno);
   }

}

int CTuxedoThread::TuxFmlRunCall()
{
	   //char * rcvbuf,*sendbuf;
	 /*DWORD tmStart=GetTickCount();
     while(1)	 
	 {
		 if(!g_bIniting)
    	 {
            break;     
         

	     }
		 else
			 Sleep(10);
		 if (abs(GetTickCount()-tmStart)>30000)
			 return -1;
	 }*/
       m_msgDesc=""; 
	   m_ErrID=0;
	   long rcvlen,ret;
	   int r=0;
       /*if(!g_bInited)
	   {
          m_msgDesc ="Tuxedo not initialized";
		  MessageBoxA(NULL,"NOT INITED","",MB_OK);
          return ERROR_TUX_NOT_INITED;

	   }*/
      // g_Mutex.lock();
	  // for (int ii=1;ii<60;ii++)
	  // {
		 //  if(!g_bInited)
	    //     r=RunInit();
	   /* DWORD tmPass=abs(GetTickCount()-g_tmLastCall);
		
	  if(tmPass>60000)
	   {   
            fun.tpterm();
			g_bInited=false;
			r=RunInit();
			//if(r)
			//	return r;

	   }*/
	   if(!g_bInited)
	   {   m_msgDesc= "Not initialized";
		   return ERROR_TUX_NOT_INITED;
	   }
	   g_tmLastCall=GetTickCount();
	   bool bTriedReInit =false;
	  // g_Mutex.lock();
	   bool bWait=false;
	 // if (g_bNeedReconn)
	 //	   bWait=g_WaitCondi.wait( &g_Mutex,60000);

   CallAgain:
	   // ret = fun.tpcall ( m_SrvName,  (char *)m_pSndBufFML, 0, (char **)&m_pRcvBufFML, &m_nRcvBufLen,0);

	   ret = fun.tpcall ( m_SrvName,  (char *)m_pSndBufFML, 0, (char **)&m_pRcvBufFML, &m_nRcvBufLen, TPNOBLOCK);
	  
       if(ret == -1)
	   {
              QString tpErrDes;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -