Oppure

Loading
21/03/10 18:59
robrock80
Intendevo dire che nella riga
ULONGLONG systemTimeIn_ms( uli.QuadPart/10000 ); 

viene invocato il costruttore di ULONGLONG e io invece avevo scambiato systemTimeIn_ms per una funzione.

Comunque ho risolto: mi sono creato la mie funzioni per calcolare il tempo in millisecondi a partire da un anno da passare in input alla funzione. Ecco il codice in caso qualcuno si dovessa imbattere nello stesso problema

long long int getCurrentTimeMillis(unsigned int startYear) {
	int getPassedDaysSinceBeginningOfCurrentYear(SYSTEMTIME *);
	SYSTEMTIME timeInfo;
	GetSystemTime(&timeInfo);
	long long int timeMillis = -1;
	if (startYear < timeInfo.wYear) {
		int passedDays = getPassedDaysSinceFirstDayOfYear(startYear, timeInfo.wYear - 1)
				+ getDaysCountFromYearToYear(&timeInfo);
		timeMillis =
			timeInfo.wMilliseconds
			+ (timeInfo.wSecond*1000)
			+ ((timeInfo.wMinute*60)*1000)
			+ (((timeInfo.wHour*60)*60)*1000)
			+ ((((passedDays * 24)*60LL)*60LL)*1000LL);
	}
    return timeMillis;
}


int getPassedDaysSinceBeginningOfCurrentYear(SYSTEMTIME *timeInfo) {
	BOOL isLeapYear = ((*timeInfo).wYear) % 4 == 0;
	//Escludo l'ultimo mese dal conteggio perchè non potrà mai essere trascorso al momento dal calcolo
	int daysPerMonth[12] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30};
	//Oggi non è trascorso
	int days = (isLeapYear && ((*timeInfo).wMonth) > 2)? ((*timeInfo).wDay) : ((*timeInfo).wDay) - 1;
	int i;
	for (i = 0; i < ((*timeInfo).wMonth); i++) {
		days += daysPerMonth[i];
	}
	return days;
}

int getDaysCountFromYearToYear(unsigned int startYear, unsigned int endYear) {
	int leapYears = 0;
	int	normalYears = 0;
	if (startYear <= endYear) {
		while (startYear <= endYear) {
			if (!(startYear % 400 == 0
					|| (startYear % 4 == 0 && startYear % 100 != 0))) {
				normalYears++;
			} else {
				leapYears++;
			}
			startYear++;
		}
	}
	return (normalYears * 365) + (leapYears * 366);
}


Grazie a tutti per i vostri aiuti
Ultima modifica effettuata da robrock80 21/03/10 20:09
aaa
21/03/10 19:12
HeDo

mah...

quel codice è così così, innanzitutto gli anni bisestili non sono solo ogni 4 anni:

it.wikipedia.org/wiki/…

oltre al fatto che non capisco l'utilità di quel codice nè una sua qualsiasi applicazione.
aaa
21/03/10 19:22
robrock80
L'utilità??? Ho bisogno di ottenere un riferimento a un dato momento in maniera univoca e questo per un applicazione multithreading basata sul controllo dei momenti è fondamentale e comunque se il codice è così così potresti anche darmi una mano per miglioralo
Ultima modifica effettuata da robrock80 21/03/10 19:27
aaa
21/03/10 19:33
Ho scritto tante applicazioni multithreaded ma non ho avuto mai necessità di questo tipo ... In effetti, non capisco a cosa ti possa servire un riferimento di tempo, sicuramente molto impreciso rispetto all'esecuzione di codice in un sistema moderno ...

Secondo me, stai sbagliando approccio ... per la sincronizzazione di thread, esistono specifici meccanismi a livello di sistema operativo ... dipende poi da qual è "esattamente" il problema ...
21/03/10 19:45
robrock80
Si lo sò, ma seccome dovevo gestire un timeout ho la necessita di calcolarmi il tempo in millisecondi in modo che il thread sappia se è trascorso o meno, cosa che non avrei potuto comunque fare con un mutex o un semaforo. E visto che dovevo cintearmi a crerare una funzione per calcolare il tempo in millisecondi mi sono detto perchè non scriverne una simile a System.currentTimeMillis di java?

P.S.: fra poco ricorreggo codice riguardo gli anni bisestili


... Ok, funzione corretta
Ultima modifica effettuata da robrock80 21/03/10 19:56
aaa
21/03/10 20:25
Postato originariamente da robrock80:

Si lo sò, ma seccome dovevo gestire un timeout ho la necessita di calcolarmi il tempo in millisecondi in modo che il thread sappia se è trascorso o meno


E cosa c'entrano gli anni, i mesi, i giorni ... se devi solo gestire timeout di millisecondi?

E in che senso (spiega meglio) devi gestire i timeout?

Gli oggetti di sincronizzazione hanno la possibilità di gestire automaticamente dei timeout ...

Spiega meglio, perchè tu non stai sicuramente seguendo la strada giusta ...
21/03/10 20:37
robrock80
Ok... Praticamente stò creando un gestore di shell remota e siccome la funzione recv per ricevere dal socket molto spesso si blocca ho dovuto far partire un thread che mi riceve il flusso dati mentre l'applicazione controlla se il thread si sia bloccato: in quest'ultimo caso sblocca il thread dopo un certo timeout. Se mi dai l'indirizzo mail ti invio il codice perchè orammai ho scritto veramente molto
aaa
21/03/10 20:43
Il timeout per la funzione recv si imposta tramite la funzione

setsockopt

passando la costante

SO_RCVTIMEO

e la struttura apposita per indicare il tempo. Trovi tutto nella documentazione della funzione.

Come ti dicevo, devi usare la corretta via per risolvere i problemi, non te ne devi inventare altre che hanno poco senso ...