PDA

View Full Version : [C++] Eseguire un "refresh" in background


MrModd
20-02-2009, 16:57
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.

cionci
20-02-2009, 17:54
Compilatore ? Librerie usate ?

MrModd
20-02-2009, 18:56
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>

MrModd
23-02-2009, 18:06
Quindi?

cionci
23-02-2009, 18:54
Spiega meglio cosa ti serve in particolare. Cosa ti manca per inviare un pwd ad intervalli regolari ? Usi i thread ?

MrModd
23-02-2009, 18:59
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.

cionci
23-02-2009, 19:06
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

MrModd
23-02-2009, 19:27
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...

cionci
23-02-2009, 19:29
Fai prima a killare il timer, te lo assicuro.
Cerca con il nome della funzione, troverai sicuramente degli esempi.

cionci
23-02-2009, 19:30
Tanto per chiarire: quelle che ti ho dato sono API Win32...non codice C standard ;)

MrModd
23-02-2009, 19:32
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()?

cionci
23-02-2009, 19:38
Non ho capito cosa intendi sinceramente :boh: Perché chiami in causa la cache ?

MrModd
23-02-2009, 19:41
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.

MrModd
24-02-2009, 16:00
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.

MrModd
25-02-2009, 19:37
Up... :read:

cionci
26-02-2009, 07:06
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.

MrModd
26-02-2009, 13:17
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.

cionci
26-02-2009, 13:19
Non da thread a thread, ma da chiamante a thread.

MrModd
26-02-2009, 13:31
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?

cionci
26-02-2009, 13:33
Sì, ma devi usare della memoria condivisa e tecniche per la mutua esclusione.

MrModd
26-02-2009, 13:45
Capito. Grazie.