Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1

    [C#] Sovrascivere la data

    Salve a tutti, sto facendo una tesina sulla sincronizzazione dei clock, volevo sapere se era possibile sovrascrivere la data (System.DateTime.Now) di un pc con quella proveniente da un pc master...., se si con quale metodo?

    (anche una soluzione brutale mi va bene!) gh

  2. #2
    Puoi usare questa classe che avevo scritto un po' di tempo fa. È scritta in VB.NET, ma fai presto a convertirla in C#:
    codice:
    Public Class DateTimeEdit
        <Runtime.InteropServices.DllImport("kernel32.dll")> _
        Private Shared Function SetSystemTime(ByRef SystemTime As APISystemTime) As Boolean
        End Function
        <DebuggerStepThrough()> _
        Public Shared Sub SetSystemDateTime(ByVal NewDate As Date)
            If SetSystemTime(New APISystemTime(NewDate)) = False Then Throw New System.ComponentModel.Win32Exception()
        End Sub
        Private Structure APISystemTime
            Dim wYear As UInt16
            Dim wMonth As UInt16
            Dim wDayOfWeek As UInt16
            Dim wDay As UInt16
            Dim wHour As UInt16
            Dim wMinute As UInt16
            Dim wSecond As UInt16
            Dim wMilliseconds As UInt16
            Public Sub New(ByVal Value As Date)
                Value = Value.ToUniversalTime()
                wYear = System.Convert.ToUInt16(Value.Year)
                wMonth = System.Convert.ToUInt16(Value.Month)
                wDayOfWeek = System.Convert.ToUInt16(Value.DayOfWeek)
                wDay = System.Convert.ToUInt16(Value.Day)
                wHour = System.Convert.ToUInt16(Value.Hour)
                wMinute = System.Convert.ToUInt16(Value.Minute)
                wSecond = System.Convert.ToUInt16(Value.Second)
                wMilliseconds = System.Convert.ToUInt16(Value.Millisecond)
            End Sub
        End Structure
    End Class
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Originariamente inviato da MItaly
    Puoi usare questa classe che avevo scritto un po' di tempo fa. È scritta in VB.NET, ma fai presto a convertirla in C#:
    sorry ma non ho ben chiaro i passaggi che fa la tua classe, provengo da java e con vb non ho molta familiarità...

  4. #4
    Versione C# (convertita da un convertitore automatico):
    codice:
    public class DateTimeEdit
    {
    	[Runtime.InteropServices.DllImport("kernel32.dll")]
    	private static bool SetSystemTime(ref APISystemTime SystemTime)
    	{
    	}
    	[DebuggerStepThrough()]
    	public static void SetSystemDateTime(System.DateTime NewDate)
    	{
    		if (!SetSystemTime(new APISystemTime(NewDate))) throw new System.ComponentModel.Win32Exception(); 
    	}
    	private struct APISystemTime
    	{
    		public UInt16 wYear;
    		public UInt16 wMonth;
    		public UInt16 wDayOfWeek;
    		public UInt16 wDay;
    		public UInt16 wHour;
    		public UInt16 wMinute;
    		public UInt16 wSecond;
    		public UInt16 wMilliseconds;
    		public APISystemTime(System.DateTime Value)
    		{
    			Value = Value.ToUniversalTime();
    			wYear = System.Convert.ToUInt16(Value.Year);
    			wMonth = System.Convert.ToUInt16(Value.Month);
    			wDayOfWeek = System.Convert.ToUInt16(Value.DayOfWeek);
    			wDay = System.Convert.ToUInt16(Value.Day);
    			wHour = System.Convert.ToUInt16(Value.Hour);
    			wMinute = System.Convert.ToUInt16(Value.Minute);
    			wSecond = System.Convert.ToUInt16(Value.Second);
    			wMilliseconds = System.Convert.ToUInt16(Value.Millisecond);
    		}
    	}
    }
    .
    Per usarla ti basta passare al metodo statico SetSystemDateTime un oggetto DateTime che contenga la nuova data e ora.
    codice:
    DateTimeEdit.SetSystemDateTime(New DateTime(2007, 05, 28, 20, 15, 00)); //Imposta la data del sistema sul 28 Maggio 2007, ore 20.15.00
    La classe funziona in questo modo:
    1. quando richiami SetSystemDateTime tale metodo inizializza una struttura temporanea APISystemTime, che è la struttura usata dalla API SetSystemTime per memorizzare la data e l'ora di sistema, richiamandone il costruttore;
    2. il costruttore di APISystemTime imposta i campi della struttura sulla base della struttura System.DateTime (struttura usata all'interno del .NET Framework per memorizzare data e ora) che gli viene passata;
    3. SetSystemDateTime passa la struttura così inizializzata alla funzione privata SetSystemTime, che altro non è che uno stub che richiama l'omonima API della dll kernel32.dll, che si occupa di fatto di impostare la data e l'ora di sistema;
    4. la SetSystemTime, se qualcosa è andato storto, restituisce false; in questo caso SetSystemDateTime solleva un'eccezione Win32Exception, che automaticamente recupera i dati dell'ultimo errore che si è verificato durante le chiamate alle API.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    sei un grande....mi sembra tutto chiaro...ora lo provo e posto la conferma...grazie ancora!

  6. #6
    codice:
    Errore 1: Impossibile trovare il tipo o il nome dello spazio dei nomi 'Runtime'; probabilmente manca una direttiva using o un riferimento a un assembly 
    
    [Runtime.InteropServices.DllImport("kernel32.dll")] //qui
    nello using ho messo:
    codice:
    using System.Runtime;
    using System.Runtime.InteropServices;
    non so...

  7. #7
    Inserisci all'inizio
    codice:
    using System;
    oppure cambia la riga incriminata in
    codice:
    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    (in entrambi i casi comunque lascia gli using che hai già inserito).
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    già avevo fatto...



    non è che esiste un modo per avviare un clock virtuale collegato al clock della macchina su cui io posso interagire?

  9. #9
    Originariamente inviato da Killex
    già avevo fatto...

    E ti dà ancora quell'errore?
    non è che esiste un modo per avviare un clock virtuale collegato al clock della macchina su cui io posso interagire?
    Eh?
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Eh?
    mi spiego meglio...

    Praticamente io devo prendere il timestamp del clock di un pc master e inviarlo a dei pc slave che dovrebbero sovrascrivere o aggiustare il poprio clock fisico, poichè è un simulatore potrei far partire dei clock virtuali sugli slave, sovrascrivere e aggiustare i clock virtuali.

    Se riuscissi a capire come far partire un clock virtuale avrei risolto la metà dei miei problemi.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.