View Full Version : [C++] Eseguire un "refresh" in background
Ciao, ho realizzato un programma che si interfaccia con il router usando le winsock e la porta telnet. Ho un problema: dopo un certo tempo di inattività il router chiude la connessione. Come faccio per mettere un refresh ad intervalli regolari mentre il programma continua le sue funzioni?
Come refresh mi basta l'invio di un pwd.
Compilatore ? Librerie usate ?
Il compilatore è Dev-Cpp (Vecchio, stravecchio, abbandonato e ancora vecchio, lo so, ma è quello che usiamo a scuola)
Le librerie sono:
#include <iostream>
#include <conio2.h>
#include <winsock.h>
Spiega meglio cosa ti serve in particolare. Cosa ti manca per inviare un pwd ad intervalli regolari ? Usi i thread ?
Spiega meglio cosa ti serve in particolare. Cosa ti manca per inviare un pwd ad intervalli regolari ? Usi i thread ?
No, quello che dovrei fare è proprio un thread, il mio è un programma lineare.
Ad intervalli di (esempio) 2 minuti, se non c'è attività nel programma, deve inviare un "pwd\n" senza però interrompere il resto del programma. Cioè l'utente deve sempre poter interagire.
Ok, allora puoi creare un thread con CreateThread oppure puoi creare un timer con SetTimer. Magari puoi creare un timer che lancia un thread, forse è la soluzione migliore ;)
Ogni volta che l'utente esegue un comando usi KillTimer per uccidere il timer ed inserirne uno nuovo.
http://msdn.microsoft.com/en-us/library/ms644906.aspx
http://msdn.microsoft.com/en-us/library/ms682453(VS.85).aspx
Perfetto, è quello che cercavo. Ora provo a capire come funzionano queste funzioni, ma non so a che punto riesco ad arrivare... Mi sembrano abbastanza complicate...
Comunque diciamo che posso fare a meno di killare il timer. L'importante è che mentre viene eseguito il pwd e lo svuotamento della cache della winsock il programma principale non faccia operazioni sulla rete. Devo vedere un po' come fare...
Fai prima a killare il timer, te lo assicuro.
Cerca con il nome della funzione, troverai sicuramente degli esempi.
Tanto per chiarire: quelle che ti ho dato sono API Win32...non codice C standard ;)
Uhm sennò stavo pensando di cambiare il comando da dargli.
Il mio problema è che leggo ciò che il router risponde per mostrarlo a schermo o per analizzare il tipo di risposta. Se mentre faccio un'operazione del genere mi parte il pwd la cache della winsock comprenderà la risposta del comando inviato dal thread principale e quella del pwd.
Se io però metto "./\n", non dovrei avere risposta. No?
EDIT:
Come funziona il timer? Cioè come va messo? E' tipo Sleep()?
Non ho capito cosa intendi sinceramente :boh: Perché chiami in causa la cache ?
Scusa intendevo buffer: ciò che recv() scrive su variabile. Se non uso questa funzione si accodano tutte le risposte del server e ciò non va bene. Devo svuotarla prima del pwd.
EDIT: Ci sto capendo qualcosa. Ora ci giocherello un po' e domani ti faccio sapere a che punto sto.
Il thread ora funziona egregiamente (tranne un problema che mi da se lo creo da una funzione diversa da main) però non ho capito come si usa SetTimer().
EDIT: Ho trovato un'alternativa molto più semplice ed elegante al SetTimer(): SuspendThread() e ResumeThread(). Tra l'altro è anche molto più semplice da gestire; con SetTimer() avrei problemi con le variabili, dato che il timer è avviato in una funzione e il punto da cui dovrei eliminarlo è in un'altra funzione.
EDIT2:
Una domanda. Su questo (http://msdn.microsoft.com/en-us/library/ms682516(VS.85).aspx) esempio a che serve tutto ciò che riguarda l'array pDataArray[MAX_THREADS]?
Ho provato ad eliminarlo e funziona lo stesso. Se è inutile mi libererebbe un po' di righe di codice.
EDIT2:
Una domanda. Su questo (http://msdn.microsoft.com/en-us/library/ms682516(VS.85).aspx) esempio a che serve tutto ciò che riguarda l'array pDataArray[MAX_THREADS]?
Ho provato ad eliminarlo e funziona lo stesso. Se è inutile mi libererebbe un po' di righe di codice.
A passare dati al thread. Nell'esempio gli viene passato il suo indice ed un altro dato di prova. Se dovessi raccogliere i risultati di una elaborazione sarebbe l'ideale, invece di dover lavorare su variabile condivise.
Ok, quindi siccome non devo trasferire dati da thread a thread lo posso eliminare. Posso risparmiare qualche riga di codice.
Grazie per l'aiuto!
Ciao.
Non da thread a thread, ma da chiamante a thread.
Non da thread a thread, ma da chiamante a thread.
Ah beh comunque non mi serve.
Giusto per curiosità, è possibile trasferire dati da thread a thread?
Sì, ma devi usare della memoria condivisa e tecniche per la mutua esclusione.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.