Brothers Inserito: 5 luglio 2005 Segnala Inserito: 5 luglio 2005 Problemi di lock in vb6 Come Scrivere e leggere un file allo stesso tempoho una form che mi da le connessioni di rete in tempo realecon refresh ogni 10 secondi Tipo:iP adress - local port - remote ip - remote port - State - etc.insomma un "netstat -ano 10"il tutto in una ListView Visualizzato a colonne.Domanda: Posso far scrivere tutto in un file e leggerlo allo stesso tempo?e cioè:Far salvare tutto in un file tipo log.txt senza sovrascriverloma aggiungendo sempre il testo ed eventualmente poi aprirlo in una altra form con una RichTextBox o altro componente mentre il file viene scritto .?Esiste un modo o devo fermare per forza il timer? Spero sia una domanda interessante e grazie a tutti anticipate.
jumpier Inserita: 5 luglio 2005 Segnala Inserita: 5 luglio 2005 Prova con AppendOpen MyFile For Append As #1 Print #1, MyStringClose #1Fammi sapere ...
Ospite bingobongo Inserita: 5 luglio 2005 Segnala Inserita: 5 luglio 2005 (modificato) un modo sarebbe:''dimensioni la lunghezza massima della stringa che andrai a scrivere (es. 255 char)'DIM XYZ AS STRING * 255 ''apri il file in modalità random'OPEN "C:\MIOFILE" FOR RANDOM SHARED AS # 1 LEN=LEN(XYZ$) ''quando ci devi scrivere una nuova stringa'ULT=LOF(1)\LEN(XYZ$)PUT #1,ULT+1,XYZ$''quando vuoi leggere quello che hai scritto e lo metti nella list box'LIST1.CLEARFOR X=1 TO LOF(1)\LEN(XYZ$) GET #1,X,XYZ$ LIST1.ADDITEM XYZ$NEXT Modificato: 5 luglio 2005 da bingobongo
Brothers Inserita: 6 luglio 2005 Autore Segnala Inserita: 6 luglio 2005 Ho provato i metodi che mi hanno scritto jumpier e bingobongoChe ringrazio ma non mi funzionano anche perche non ho capitoCome e dove applicarli.O forse non mi sono spiegato bene.Credo che li dovrei Applicare al Timer dove ho collocato il RefreshMa è meglio che scriva un po di codice per spiegarmi. Al Form_Load Applica i primi dati alle colonne================================================== ' Scrive nelle colonne i dati . .ColumnHeaders.Add , , "Local IP Address" 'etc.etc Ometto tutti gli altri .ColumnHeaders.Add (Faccio prima) . ' Richiama il Timer per il Refresh . Call Timer1_Timer==================================================Il Timer pulisce le colonne e riapplica i dati ogni 10 secondi==================================================Private Sub Timer1_Timer() ' Riapplica alle colonne i dati . With lvwStats.ListItems Set ListItem = .Add(, , TCPStat1.TCPTable.LocalIPAddress) ListItem.SubItems(1) = TCPStat1.TCPTable.LocalPort 'etc.etc Ometto gli altri L.SubItems (almeno 6) . Select Case TCPStat1.TCPTable.State Case enMIB_TCP_STATE_CLOSED: tmp = "closed" 'etc.etc Ometto gli altri Select Case che sono tanti (12) . End Select ListItem.SubItems = tmp End WithEnd Sub=================================================(Ho omesso molta ma molta parte del codice se nò veniva lungo un km) .Penso che il timer dovrebbe scrivere il file ogni 10 secondi ma Come Fare?Ed il peggio viene dopo quando voglio leggere il file che è in continua scrittura dal Timer.Aiuto e Perdonate l'inesperienza.
Ospite bingobongo Inserita: 6 luglio 2005 Segnala Inserita: 6 luglio 2005 (modificato) questa come dichiarazione in un modulo (se ne hai uno)GLOBAL XYZ AS STRING * 255 oppure nel form (se ne hai uno solo!)DIM SHARED XYZ AS STRING * 255 in un qualche punto (probabilmente all'avvio dell'applicazione) avrai l'apertura del file dove scrivi le varie informazioni e quindi il file sarà aperto con:OPEN "C:\MIOFILE" FOR RANDOM SHARED AS # 1 LEN=LEN(XYZ$) tutte le volte che acquisisci un'informazione che vuoi salvare nel fileXYZ$=lamiainformazionePUT #1,(LOF(1)\LEN(XYZ$))+1,XYZ$quando hai bisogno di visualizare le informazioni acquisite che hai detto metti in una list box (sembra che tu lo faccia a tempo nel qual caso mettile nel timer)LIST1.CLEARFOR X=1 TO LOF(1)\LEN(XYZ$)GET #1,X,XYZ$LIST1.ADDITEM XYZ$NEXT più di così non penso si possa spiegare Modificato: 6 luglio 2005 da bingobongo
Brothers Inserita: 6 luglio 2005 Autore Segnala Inserita: 6 luglio 2005 Grazie bingobongo sei uno molto paziente maSono io che non mi so spiegare beneIo ho tutto funzionante e vedo le connessioni attive ogni 10 secondi nella ListViewMa non so come scriverle nel file di txt (LogConn.txt)Quello che non capisco è come scrivere in LogConn.txt tutto quello che mi visualizza la ListView ,Cioe:devo istruire la ListView a scrivere nel file LogConn.txt tutto quello che visualizza?? Oppure devo istruire il Timer a scrivere nel file LogConn.txt tutto Quello che scrivenella ListView??e poi posso farlo per tutto il risultato complessivo oppure devo farlo colonna per colonna??.NB Ho provato come ,"credo" , mi suggerisci tu ma mi da diversi erroriTieni conto che sono un Molto principiante (Penso comunque che dovrò risolvere prima il problema della scrittura del file e poi in un secondo tempo affrontare quello della lettura per non confondermi ulteriormente.)
Brothers Inserita: 6 luglio 2005 Autore Segnala Inserita: 6 luglio 2005 (modificato) Con le istruzioni di jumpier Open LogConn.txt For Append As #1Print #1, MyString (Per ogni Stringa un Print )Close #1applicate al Timer il file viene scritto , ma non in colonne separate ma tutto in una unica colonna e al posto di "closed" o "listening" o "established" etc.etc.viene scritto "Vero" o "Falso"Non è ancora un gran che ma forse si può migliorare!!?? Ciao e grazie molte Modificato: 6 luglio 2005 da Brothers
Brothers Inserita: 8 luglio 2005 Autore Segnala Inserita: 8 luglio 2005 Risolto Con le istruzioni di jumpier Open LogConn.txt For Append As #1Print #1, MyString Close #1invece di un Print Per ogni Stringa un Print per una serie di stringhe nella solita rigae aggiungendo dei print uno con data e ora e uno con ======e venuto fuori un bel risultato che può accontentare ora il problema sarà leggerlo in contemporanea alla scrittura.
omabra Inserita: 16 luglio 2005 Segnala Inserita: 16 luglio 2005 RISPOSTA MOLTO LUNGA.non ricordo dove ho trovato questo codice, comunque devi aggiungere ad una form una listview che trovi sotto ai componeti aggiuntivi "Microsoft Windows Common Controls 6.0" (MSCOMCTL.OCX).All'apertura della form ti fa vedere tutte le porte di rete di sistema, lo stato in cui sono e l'IP dal quale sono eventualmente occupate.Copia tutto il codice sottostante all'interno di una form.Naturalmente puoi temporizzare lo script in modo che venga costantemente aggiornatoCIAO!Option ExplicitPrivate Type MIB_TCPROW dwState As Long dwLocalAddr As Long dwLocalPort As Long dwRemoteAddr As Long dwRemotePort As LongEnd TypePrivate Const ERROR_SUCCESS As Long = 0Private Const MIB_TCP_STATE_CLOSED As Long = 1Private Const MIB_TCP_STATE_LISTEN As Long = 2Private Const MIB_TCP_STATE_SYN_SENT As Long = 3Private Const MIB_TCP_STATE_SYN_RCVD As Long = 4Private Const MIB_TCP_STATE_ESTAB As Long = 5Private Const MIB_TCP_STATE_FIN_WAIT1 As Long = 6Private Const MIB_TCP_STATE_FIN_WAIT2 As Long = 7Private Const MIB_TCP_STATE_CLOSE_WAIT As Long = 8Private Const MIB_TCP_STATE_CLOSING As Long = 9Private Const MIB_TCP_STATE_LAST_ACK As Long = 10Private Const MIB_TCP_STATE_TIME_WAIT As Long = 11Private Const MIB_TCP_STATE_DELETE_TCB As Long = 12Private Declare Function GetTcpTable Lib "iphlpapi.dll" (ByRef pTcpTable As Any, ByRef pdwSize As Long, ByVal bOrder As Long) As LongPrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dst As Any, src As Any, ByVal bcount As Long) Private Declare Function lstrcpyA Lib "kernel32" (ByVal RetVal As String, ByVal Ptr As Long) As Long Private Declare Function lstrlenA Lib "kernel32" (ByVal Ptr As Any) As Long Private Declare Function inet_ntoa Lib "wsock32.dll" (ByVal addr As Long) As LongPrivate Declare Function ntohs Lib "wsock32.dll" (ByVal addr As Long) As Long Public Function GetInetAddrStr(Address As Long) As String GetInetAddrStr = GetString(inet_ntoa(Address))End FunctionPrivate Sub Form_Load()With ListView1 .View = lvwReport .ColumnHeaders.Add , , "Local IP Address" .ColumnHeaders.Add , , "Local Port" .ColumnHeaders.Add , , "Remote IP Address" .ColumnHeaders.Add , , "Remote Port" .ColumnHeaders.Add , , "Status "End WithDim TcpRow As MIB_TCPROWDim buff() As ByteDim lngRequired As LongDim lngStrucSize As LongDim lngRows As LongDim lngCnt As LongDim strTmp As StringDim lstLine As ListItemCall GetTcpTable(ByVal 0&, lngRequired, 1)If lngRequired > 0 Then ReDim buff(0 To lngRequired - 1) As Byte If GetTcpTable(buff(0), lngRequired, 1) = ERROR_SUCCESS Then lngStrucSize = LenB(TcpRow) 'first 4 bytes indicate the number of entries CopyMemory lngRows, buff(0), 4 For lngCnt = 1 To lngRows 'moves past the four bytes obtained above 'to get data and cast into a TcpRow stucture CopyMemory TcpRow, buff(4 + (lngCnt - 1) * lngStrucSize), lngStrucSize 'sends results to the listview With TcpRow Set lstLine = ListView1.ListItems.Add(, , GetInetAddrStr(.dwLocalAddr)) lstLine.SubItems(1) = ntohs(.dwLocalPort) lstLine.SubItems(2) = GetInetAddrStr(.dwRemoteAddr) lstLine.SubItems(3) = ntohs(.dwRemotePort) lstLine.SubItems(4) = (.dwState) Select Case .dwState Case MIB_TCP_STATE_CLOSED: strTmp = "closed" Case MIB_TCP_STATE_LISTEN: strTmp = "listening" Case MIB_TCP_STATE_SYN_SENT: strTmp = "sent" Case MIB_TCP_STATE_SYN_RCVD: strTmp = "received" Case MIB_TCP_STATE_ESTAB: strTmp = "established" Case MIB_TCP_STATE_FIN_WAIT1: strTmp = "fin wait 1" Case MIB_TCP_STATE_FIN_WAIT2: strTmp = "fin wait 1" Case MIB_TCP_STATE_CLOSE_WAIT: strTmp = "close wait" Case MIB_TCP_STATE_CLOSING: strTmp = "closing" Case MIB_TCP_STATE_LAST_ACK: strTmp = "last ack" Case MIB_TCP_STATE_TIME_WAIT: strTmp = "time wait" Case MIB_TCP_STATE_DELETE_TCB: strTmp = "TCB deleted" End Select lstLine.SubItems(4) = lstLine.SubItems(4) & "( " & strTmp & " )" strTmp = "" End With Next End IfEnd IfEnd SubPrivate Sub ListView1_ColumnClick(ByVal ColumnHeader As ColumnHeader) ListView1.SortKey = ColumnHeader.Index - 1 ListView1.SortOrder = Abs(Not ListView1.SortOrder = 1) ListView1.Sorted = True End SubPublic Function GetString(ByVal lpszA As Long) As String GetString = String$(lstrlenA(ByVal lpszA), 0) Call lstrcpyA(ByVal GetString, ByVal lpszA) End Function
Brothers Inserita: 18 luglio 2005 Autore Segnala Inserita: 18 luglio 2005 Ottimo codice , anche perchè usa un ocx già presente nel Vb6io usavo un altro trovato in giro (mzTCPStat) ma il codice che hai scritto tu misembra migliore , anche se più lungo.Grazie ciao
omabra Inserita: 27 luglio 2005 Segnala Inserita: 27 luglio 2005 Beh l'ocx è opzionale, lo usa solo per visualizzare i dati in quel modo. Nessuno vieta di scriverli all'interno di una listbox e quindi di non aggiunger alcun componente.Il codice non l'ho scritto io, l'ho trovato da qualche parte, giusto per titolo di cronaca...
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora