Ein Beispiel von mir,
die Hauptklasse wo das schreiben in die Status DBF geschieht.
Code: Alles auswählen
CREATE CLASS VIONServer
PROTECTED:
VAR nID
EXPORTED:
VAR cAdrWebShop
VAR oFilInfo // Object fr FilialInfos und ProgrammInfos -> CLASS FilInfo
VAR oSmpServer // Object fr Smartphoneserver wenn aus DLL aufgerufen
METHOD init
METHOD Destroy // Logdatei schliesen
SYNC METHOD GenStatusDB // Status Tabellen erzeugen
SYNC METHOD AddStatus // Status in Tabelle hinzufgen
SYNC METHOD ScanStatus // Status auslesen und in Logdatei schreiben / anzeigen / Traceinfo
SYNC METHOD LogDatei // Text in Logdatei schreiben
SYNC INLINE METHOD AddLog(cText) // Eintrag in LogDatei mit VIONSrv():AddLog
VIONSrv():oLog:AddLog(cText)
return cText
METHOD Stop // Server : stoppen / beenden (bei Programm- Dienst Ende)
METHOD Start // Server : starten (bei Programm- Dienst Sart)
METHOD Pause // Server : Pause / anhalten (Aufruf aus Anpass, Vm2000 Reo, IsdnSend)
METHOD Weiter // Server : Weiter / wieder starten (Aufruf aus Anpass, Vm2000 Reo, IsdnSend)
INLINE METHOD GenTranferObj() // Transferobject fr internen Gebrauch
RETURN Transfer():New()
METHOD SendMail // Zentrale Stelle um Mails zu versenden (Server und VM2000)
METHOD TraceInfo
ENDCLASS
Hier die Methode umd die DBF zu erzeugen
Code: Alles auswählen
// ----------------------------------------------------------------------------------------
METHOD VIONServer:GenStatusDB()
// ----------------------------------------------------------------------------------------
LOCAL lRet := .F.
LOCAL aDbf := {}
LOCAL cDbServer := ::cVM2000Path+"VIONLOG"
LOCAL nDel := 0
//altd()
// Status VIONLOG
aDbf := {}
aadd( aDbf, { "INFO", "C", 100, 0 } )
aadd( aDbf, { "TS", "C", 13, 0 } )
aadd( aDbf, { "PORT", "N", 10, 0 } )
aadd( aDbf, { "THREADID", "N", 10, 0 } )
aadd( aDbf, { "THREADGES","N", 10, 0 } )
aadd( aDbf, { "ERROR", "N", 10, 0 } )
aadd( aDbf, { "AKTFUNC", "C", 30, 0 } )
aadd( aDbf, { "LEVEL", "N", 1, 0 } )
aadd( aDbf, { "TYP", "N", 1, 0 } )
IF !FExists(cDbServer + ".DBF" )
Risdbcreate( cDbServer, aDbf,"DBFNTX" )
VIONSrv():oLog:AddLog("GenStatusDB():'"+cDbServer+"' neu erzeugt")
else
select 0
USE ( cDbServer) EXCLUSIVE
IF !neterr()
select VIONLOG
lRet := .T.
IF ::lGui
szeig("l”sche alte Logeintr„ge...",,,, {|| dbeval({||IIF( Ts2DateTime(VIONLOG->ts)[1]<=date()-1,(dbdelete(),nDel++) ,NIL ) }) })
else
dbeval({||IIF( Ts2DateTime(VIONLOG->ts)[1]<=date()-1,(dbdelete(),nDel++) ,NIL ) })
ENDIF
IF nDel > 0
VIONSrv():oLog:AddLog("GenStatusDB(): loesche alte Datensaetze in '"+cDbServer+"' Anzahl: "+var2Char(nDel))
IF ::lGui
szeig("Packe Logdatei...",,,, {|| dbpack()})
else
dbpack()
endif
else
VIONSrv():oLog:AddLog("GenStatusDB(): nichts zum loeschen gefunden in '"+cDbServer+"' Anzahl: "+var2Char(nDel))
ENDIF
CloseDBF("VIONLOG")
else
VIONSrv():oLog:AddLog("GenStatusDB(): kein exclusiever Zugriff zum loeschen moeglich '"+cDbServer+"' ")
ENDIF
ENDIF
select 0
if USEIND( cDbServer, .F. ,,cDbServer,,,,"DBFNTX" )
select VIONLOG
lRet := .T.
endif
DbRelease("VIONLOG")
return lRet
... und zum schreiben
Code: Alles auswählen
// ----------------------------------------------------------------------------------------
METHOD VIONServer:AddStatus(cInfo, nPort, nLevel, nTyp)
// ----------------------------------------------------------------------------------------
LOCAL lRet := .F.
LOCAL nAltBereich := select()
LOCAL cStack := ""
LOCAL nProgPos := 1
LOCAL nPos := 1
LOCAL aThreadInfo
LOCAL nAktiv := 0
LOCAL lTreadInfo := .F.
DEFAULT nPort TO 0
DEFAULT cInfo TO ""
DEFAULT nLevel TO 1
DEFAULT nTyp TO 1
FOR nPos := 1 TO 4
cStack += Padright( procname( nProgPos ), 21,".") + "(" +str( procline( nProgPos ), 4) +") "
nProgPos++
NEXT
IF lTreadInfo
aThreadInfo := ThreadInfo( THREADINFO_TID+THREADINFO_TOBJ )
aeval(aThreadInfo,{|a|IIF( valtype(a[2])=="O",IIF( a[2]:active,nAktiv++,NIL) ,NIL )})
ENDIF
//altd()
if DBRequest("VIONLOG",.t.)
select VIONLOG
IF NetAnh()
replace VIONLOG->info with cInfo
replace VIONLOG->port with nPort
replace VIONLOG->threadId with ThreadID()
replace VIONLOG->threadGes with nAktiv
replace VIONLOG->ts with UPDTIME
replace VIONLOG->aktfunc with procname(nProgPos)
IF type("VIONLOG->level") == "N"
replace VIONLOG->level with nLevel
ENDIF
IF type("VIONLOG->typ") == "N"
replace VIONLOG->typ with nTyp
ENDIF
NetFrei()
VIONLOG->(dbcommit())
::ScanStatus(nLevel)
endif
lRet := DbRelease("VIONLOG")
endif
select(nAltBereich)
return lRet
Die Methode AddStatus wird aus anderen Thread's aufgerufen die als Parameter die Klasse 'VionServer' übergeben bekommen.
Z.Bsp. so,
Code: Alles auswählen
CLASS ServerThread FROM Thread
PROTECTED:
VAR nSocket
VAR nLastError
EXPORTED:
VAR nPort
VAR lGui
VAR oVIONServer
VAR lAktiv
VAR cName
VAR oSignal
VAR cIpAdr
VAR bAltError
METHOD init
METHOD atStart
METHOD execute
METHOD atEnd
METHOD stop
METHOD logClient
ENDCLASS
*************************************************************************************
*************************************************************************************
// -------------------------------------------------------------------------------------------
METHOD ServerThread:init( nPort,cName, oVIONServer,oSignal )
// -------------------------------------------------------------------------------------------
//LOCAL bAltFehler := errorblock( { | oError | FehlerChk( oError ) } )
DEFAULT nPort TO 0
DEFAULT oVIONServer TO NIL
DEFAULT cName TO ""
::Thread:init(,"VION-S "+cName+" "+var2char(nPort))
::nPort := nPort
::oVIONServer := oVIONServer
::cName := cName
::nSocket := 0
::lAktiv := .F.
::oSignal := oSignal
::nLastError := 0
::cIpAdr := ""
RETURN self
// -------------------------------------------------------------------------------------------
METHOD ServerThread:atStart
// -------------------------------------------------------------------------------------------
LOCAL cFehlertext := ""
LOCAL cLocalAdr := ::oVIONServer:cServerIP
::bAltError := errorblock( { | oError | ServerFehlerChk( oError,self,.t. ) } )
::oVIONServer:AddStatus("ServerThread gestartet - ThreadID :"+var2Char(::threadID),::nPort,1)
::nSocket := SocketCreate( SOCK_STREAM, ::nPort,,,@::nLastError )
IF ::nLastError <> 0
// Fehler erkannt
::oVIONServer:AddStatus("ST: ERROR SocketCreate() - SNr: "+var2Char(::nSocket)+" E:"+var2char(::nLastError)+" "+SocketErrorText(::nLastError),::nPort,2)
else
::oVIONServer:AddStatus("ST:SocketCreate() - SNr: "+var2Char(::nSocket),::nPort,1)
IF ::nSocket <> 0
::lAktiv := .T.
SocketListen( ::nSocket )
::setInterval(0)
ENDIF
ENDIF
RETURN self
// -------------------------------------------------------------------------------------------
METHOD ServerThread:atEnd
// -------------------------------------------------------------------------------------------
::nSocket := 0
::oVIONServer:AddStatus("ServerThread beendet - ThreadID :"+var2Char(::threadID),::nPort,1)
errorblock( ::bAltError )
RETURN self
So, das war jetzt ein Haufen Code, aber ich hoffe einigermasen verständlich!
Gruß Manni