text:
>
> puoi postare anche lo sceheltro della classe che usi come DataContext?
    class cRicevuta
    {
        public string Mittente;
        public string IndirizzoMittente;
        public string CapMittente;
        public string LocalitàMittente="Roma";
        public string ProvinciaMittente="Roma";
        public string Destinatario;
        public string IndirizzoDestinatario;
        public string CapDestinatario;
        public string LocalitàDestinatario="Roma";
        public string ProvinciaDestinatario="Roma";
        public int Pezzi = 1;
        public decimal Peso = 1;
        public string Contenuto = "Documenti";
        public decimal Importo;
        public int PagatoNonPagato = 1;
        public DateTime Data = DateTime.Now.Date;
    }
    class cStampaRicevuta:cNotify
    {
        cRicevuta ricevuta;
        public cStampaRicevuta()
        {
            ricevuta = new cRicevuta();
            listaRicevute = new ObservableCollection<cRicevuta>();
            ricevuta.Mittente = "fabio";
            ricevuta.IndirizzoMittente = "via tal de tali, 12";
            ricevuta.CapMittente = "00100";
            listaRicevute.Add(ricevuta);
            ricevuta = new cRicevuta();
            ricevuta.Mittente = "pippo";
            ricevuta.IndirizzoMittente = "via tizio, 23";
            ricevuta.CapMittente = "00100";
            listaRicevute.Add(ricevuta);
        }
        public ObservableCollection<cRicevuta> listaRicevute;
        #region Campi
        public string Mittente
        {
            get { return ricevuta.Mittente; }
            set
            {
                if (Mittente != value)
                {
                    ricevuta.Mittente = value;
                    OnChanged("Mittente");
                }
            }
        }
        public string IndirizzoMittente
        {
            get { return ricevuta.IndirizzoMittente; }
            set
            {
                if (IndirizzoMittente != value)
                {
                    ricevuta.IndirizzoMittente = value;
                    OnChanged("IndirizzoMittente");
                }
            }
        }
        public string CapMittente
        {
            get { return ricevuta.CapMittente; }
            set
            {
                if (CapMittente != value)
                {
                    ricevuta.CapMittente = value;
                    OnChanged("CapMittente");
                }
            }
        }
        public string LocalitàMittente
        {
            get { return ricevuta.LocalitàMittente; }
            set
            {
                if (LocalitàMittente != value)
                {
                    ricevuta.LocalitàMittente = value;
                    OnChanged("LocalitàMittente");
                }
            }
        }
        public string ProvinciaMittente
        {
            get { return ricevuta.ProvinciaMittente; }
            set
            {
                if (ProvinciaMittente != value)
                {
                    ricevuta.ProvinciaMittente = value;
                    OnChanged("ProvinciaMittente");
                }
            }
        }
        public string Destinatario
        {
            get { return ricevuta.Destinatario; }
            set
            {
                if (Destinatario != value)
                {
                    ricevuta.Destinatario = value;
                    OnChanged("Destinatario");
                }
            }
        }
        public string IndirizzoDestinatario
        {
            get { return ricevuta.IndirizzoDestinatario; }
            set
            {
                if (IndirizzoDestinatario != value)
                {
                    ricevuta.IndirizzoDestinatario = value;
                    OnChanged("IndirizzoDestinatario");
                }
            }
        }
        public string CapDestinatario
        {
            get { return ricevuta.CapDestinatario; }
            set
            {
                if (CapDestinatario != value)
                {
                    ricevuta.CapDestinatario = value;
                    OnChanged("CapDestinatario");
                }
            }
        }
        public string LocalitàDestinatario
        {
            get { return ricevuta.LocalitàDestinatario; }
            set
            {
                if (LocalitàDestinatario != value)
                {
                    ricevuta.LocalitàDestinatario = value;
                    OnChanged("LocalitàDestinatario");
                }
            }
        }
        public string ProvinciaDestinatario
        {
            get { return ricevuta.ProvinciaDestinatario; }
            set
            {
                if (ProvinciaDestinatario != value)
                {
                    ricevuta.ProvinciaDestinatario = value;
                    OnChanged("ProvinciaDestinatario");
                }
            }
        }
        public DateTime Data
        {
            get { return ricevuta.Data; }
            set
            {
                if (Data != value)
                {
                    ricevuta.Data = value;
                    OnChanged("Data");
                }
            }
        }
        public cRicevuta Ricevuta
        {
            get { return ricevuta; }
            set
            {
                if (ricevuta!=value)
                {
                    ricevuta = value;
                    OnChanged("Ricevuta");
                    Aggiorna();
                }
            }
        }
        public cRicevuta RicevutaSelezionata
        {
            get { return ricevuta; }
            set
            {
                if (ricevuta!=value)
                {
                    Ricevuta = value;
                    OnChanged("RicevutaSelezionata");
                }
            }
        }
        public int Pezzi
        {
            get { return ricevuta.Pezzi; }
            set
            {
                if (Pezzi!=value)
                {
                    ricevuta.Pezzi = value;
                    OnChanged("Pezzi");
                }
            }
        }
        public decimal Peso
        {
            get { return ricevuta.Peso; }
            set
            {
                if (Peso!=value)
                {
                    ricevuta.Peso = value;
                    OnChanged("Peso");
                }
            }
        }
        public string Contenuto
        {
            get { return ricevuta.Contenuto; }
            set
            {
                if (Contenuto!=value)
                {
                    ricevuta.Contenuto = value;
                    OnChanged("Contenuto");
                }
            }
        }
        public int PagatoNonPagato
        {
            get { return ricevuta.PagatoNonPagato; }
            set
            {
                if (PagatoNonPagato!=value)
                {
                    ricevuta.PagatoNonPagato = value;
                    OnChanged("PagatoNonPagato");
                }
            }
        }
        public decimal Importo
        {
            get { return ricevuta.Importo; }
            set
            {
                if (Importo!=value)
                {
                    ricevuta.Importo = value;
                    OnChanged("Importo");
                }
            }
        }
        #endregion
        public void Add()
        {
            if(!listaRicevute.Contains(ricevuta))
                listaRicevute.Add(ricevuta);
            Ricevuta = new cRicevuta();
            Aggiorna();
        }
        public void Delete()
        {
            if (listaRicevute.Contains(ricevuta))
                listaRicevute.Remove(ricevuta);
        }
        public void Aggiorna()
        {
            OnChanged("Mittente");
            OnChanged("IndirizzoMittente");
            OnChanged("CapMittente");
            OnChanged("LocalitàMittente");
            OnChanged("ProvinciaMittente");
            ecc.
        }
    }
> quando sei in esecuzione con il debugger attaccato non ha informazioni
> nella output window?
>
I dettagli vengono caricati  regolarmente.
Per quanto riguarda l'assegnazione del datacontext, lo assegno al
monento della chiamata:
frmRicevute frm=new frmRicevute();
cStampaRicevute ric=new cStampaRicevute();
frm.DataContext=ric;
frm.Show;


title: WPF listview itemssource e selecteditem da XAML

author: Mauro Servienti [MVP]

text:
Ciao Fabio,
You wrote on 11/02/2011 :
>         public ObservableCollection<cRicevuta> listaRicevute;
ma sono dei field e non delle proprietà? il motore di data binding
funziona solo con le proprietà.



author: Fabio

text:
On 11 Feb, 11:07, Mauro Servienti [MVP] <mauroservie...@online.nospam>
wrote:
> Ciao Fabio,
>
> You wrote on 11/02/2011 :
>
> >         public ObservableCollection<cRicevuta> listaRicevute;
>
> ma sono dei field e non delle proprietà? il motore di data binding
> funziona solo con le proprietà.
>
quali sono fileds?
> .m
>
> --
> Mauro Servienti
> {C67C0157-5D98-4733-A75E-93CAEE4BADC8}
> Microsoft MVP - Visual C# / MCTShttp://
mvp.support.microsoft.com
> blog @
http://milestone.topics.it



text:
Ciao Fabio,
You wrote on 11/02/2011 :
>>>         public ObservableCollection<cRicevuta> listaRicevute;
>>
>> ma sono dei field e non delle proprietà? il motore di data binding
>> funziona solo con le proprietà.
>>
>
> quali sono fileds?
public ObservableCollection<cRicevuta> listaRicevute;
è un field, una proprietà sarebbe:
public ObservableCollection<cRicevuta> listaRicevute
{
   get;
   private set;
}
.m
--
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @
http://milestone.topics.it



text:
On 11 Feb, 11:20, Mauro Servienti [MVP] <mauroservie...@online.nospam>
wrote:
> Ciao Fabio,
>
> You wrote on 11/02/2011 :
>
> >>>         public ObservableCollection<cRicevuta> listaRicevute;
>
> >> ma sono dei field e non delle proprietà? il motore di data binding
> >> funziona solo con le proprietà.
>
> > quali sono fileds?
>
> public ObservableCollection<cRicevuta> listaRicevute;
>
> è un field, una proprietà sarebbe:
>
> public ObservableCollection<cRicevuta> listaRicevute
> {
>    get;
>    private set;
>
> }
>
Si è vero ho fatto un test ed ora va'.
Grazie per l'aiuto.
Ciao
Fabio


title: relazione tra binari compilati in debug oppure no

author: AleTV

text:
Dei binari compilati in modalitą debug possono essere usati senza problemi
assieme a binari compilati non in modalitą debug?
Spiego meglio il contesto.
Sito
asp.net
 con iis 6 su win 2003 ed uso di ajax.
Nella bin del sito sono presenti un po' di dll generate in modalitą debug.
Se nel web.config imposto la clausola debug a true nella sezione compilation
(lavoro in C#) problemi zero.
Se la imposto a false, in una pagina che sfrutta ajax per il classico
messaggio "attendere prego" causa elaborazione lunghetta lato db (un 7
minuti), ottengo sempre dopo 2 minuti precisi l'errore in basso a sx
nascosto da ie che mi dice:
"
Dettagli errore pagina Web
Agente utente: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0;
Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR
3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.2;
OfficeLiveConnector.1.5; OfficeLivePatch.1.3; .NET4.0C; MS-RTC LM 8)
Timestamp: Wed, 15 Dec 2010 17:24:07 UTC
Messaggio: Sys.WebForms.PageRequestManagerServerErrorException: Errore
sconosciuto durante l'elaborazione della richiesta sul server. Codice di
stato restituito dal server: 500
Linea: 5
Carattere: 62099
Codice: 0
URI:
blabla.com/ScriptResource.axd?d=j7vE4KnwZkrNoeraSdrRQMxFTzG92BM6Jz994eeOHMT7pt_BgXA22C4IUGDjvjqmVtCmm3qz0FOq4290FmJ0QHoLRgz2m5x1VBkX8LnEwWHw3pOsgHh65-Cw9uzupd85-bK-rSwPsQx_H-90nV61xluNMMw1&t=6976383c
"
Mi vien da pensare che c'entri qualcosa il fatto di mischiare i binari
compilati in modalitą diverse (il sito tiene i sorgente aspx e cs, quindi
asp.net
 quando ricompila al volo lo fa immagino rispettando la clausola
debug presente nel web.config del sito).
Idee?


author: Alessandro Riolo

text:
"AleTV" <
sti...@libbero.it
> wrote:
> Idee?
Tantissime :)
Ma prima: io non terrei mai i sorgenti in produzione. Anzi, per dirla tutta
io in produzione dalle aspx, ascx e via di seguito otterrei al massimo 2
assembly (chiamiamoli Web.dll e Web.UI.dll, il primo con il code behind, ed
il secondo con pagine/controlli/la qualsiasi tutti compilati e assemblati),
oltre ovviamente alle svariate librerie mie o di terze parti, ed ai
placeholder per far funzionare la WIA. Idem per la configurazione, in
produzione deve essere Release, se vuoi fare Debug, fallo in un ambiente di
sviluppo.
--
ale
http://ale.riolo.co.uk


text:
"Alessandro Riolo" <
alessand...@gmail.com
> ha scritto nel messaggio
news:ieb6a4$5im$1...@news.eternal-september.org...
> "AleTV" <
sti...@libbero.it
> wrote:
>> Idee?
>
> Tantissime :)
>
> Ma prima: io non terrei mai i sorgenti in produzione.
Si, ok, chiaro.
Ma per enne motivi ora preferisco tenere i sorgenti in produzione (ci faccio
debug direttamente con VS- visto che per star tranquillo l'ho installato
pure sul server :-) - quando mi serve, visto l'ambiente di produzione non è
esattamente di produzione in senso lato...).
La mia domanda era per sapere se, per dettagli tecnici che non so, dei
binari che escono da una compilazione in modalità debug possono diventare
incompatibili con binari che escono da una compilazione in modalità
non-debug (leggi, binari debug nella bin con binari non debug compilati al
volo da da
asp.net
).


title: .NET e elaborazione immagini 3D

author: Pidi

text:
Un saluto a tutti.
Devo creare un'interfaccia grafica per un progetto inizialmente
costruito in Matlab. Si tratta di partire da immagini 3D (trattate
inizialmente come matrici tridimensionali), che vanno interpolate con un
piano che le taglia secondo un certo angolo. Il risultato, 2D, deve
essere visualizzato insieme all'oggetto 3D di partenza.
Mi servirebbero quindi delle librerie, da integrare con .NET che
permettano sia la visualizzazione che l'elaborazione delle immagini.
Inizilamente avevo pensato a VTK, ma sto avendo dei problemi ad
agganciarle a Visual Studio (2005 o 2008), soprattutto per quanto
riguarda i controlli Windows Forms.
Qualcuno mi può consigliare qualche libreria che possa fare al caso mio?
Vi ringrazio


title: .NET e elaborazione immagini 3D

author: Raffaele Rialdi [MVP]

text:

Se devi creare una UI che contenga 2D, 3D e UI, senza dubbio WPF fa per
te.
Essendo basato su DirectX hai performance grafiche elevate ed allo
stesso tempo dispone di una serie di controlli che ti permettono di
creare una UI di ottimo livello.
Con Winform hai GDI+ che ha performance decisamente più scadenti perché
tutta la grafica viene gestita dalla CPU invece che dalla GPU.
--
Raffaele Rialdi
http://www.iamraf.net
Weblog:
http://blogs.ugidotnet.org/raffaele
Microsoft MVP profile
https://mvp.support.microsoft.com/profile/raffaele
UGIdotNET -
http://www.ugidotnet.org/


title: .NET e elaborazione immagini 3D

text:
Il 05/06/2011 21:15, Raffaele Rialdi [MVP] ha scritto:
> Se devi creare una UI che contenga 2D, 3D e UI, senza dubbio WPF fa per te.
> Essendo basato su DirectX hai performance grafiche elevate ed allo
> stesso tempo dispone di una serie di controlli che ti permettono di
> creare una UI di ottimo livello.
Non lo coonscevo, sembra interessante!
Il mio problema è che devo ricreare in ambiente .net un codice molto
simile a quello descritto qua:
http://www.mathworks.com/help/techdoc/visualize/f5-3558.html
Come si può vedere ci sono funzioni, tipo "surf", "rotate", "slice", che
sono già presenti in diversi toolbox di matlab.
Con wpf o eventuali toolbox o librerie aggiuntive posso ritrovare le
stesse funzioni o devo costruirmele io?


title: .NET e elaborazione immagini 3D

text:

Con WPF puoi descrivere una scena completa in 3D, decidere la viewport,
dove sta la "camera" (il punto di vista), etc. etc.
Se descrivi la scena in termini matematici e poi descrivi come vuoi
vederla, ovviamente funziona tutto.
Le rotazioni sono già implementate e comunque sono la cosa più semplice
visto che si tratta solo di fare moltiplicazioni di matrici.
A quanto capisco surf fa solo la presentazione, quindi ci sei.
Slice invece calcola la fetta 2D, quindi interseca un piano con il
solido e calcola la superficie risultante. Non mi risulta ci sia nulla
del genere nè in WPF, nè in Directx, tantomento in winform che *non* ha
nulla per lavorare in 3D.
A me è capitato di usare OpenGL per fare cose simili (disegnare dei
solidi elementari) ma anche con OpenGL il calcolo di
minimi/massimi/intersezioni etc. era tutto a carico mio e non tutti i
calcoli sono propriamente banali. Puoi cercare librerie di modellazione
o di videogames per vedere se trovi qualcosa di pronto (per esempio le
collisioni sono un problema classico dei videogame).
Ad ogni modo se vuoi fare quanto ho visto su quel link usando winform
otterrai performance pessime.
Inoltre ricordati che WPF ragiona in modo vettoriale, quindi tutto
quello che puoi esprimere in modo vettoriale è ovviamente un guadagno
rispetto ai voxel.
BTW, il libro di riferimento per WPF in 3D è quello di Charles Petzold.



title: .NET e elaborazione immagini 3D

text:
Il 06/06/2011 14:25, Raffaele Rialdi [MVP] ha scritto:
> A quanto capisco surf fa solo la presentazione, quindi ci sei.
> Slice invece calcola la fetta 2D, quindi interseca un piano con il
> solido e calcola la superficie risultante. Non mi risulta ci sia nulla
> del genere nè in WPF, nè in Directx, tantomento in winform che *non* ha
> nulla per lavorare in 3D.
Ho già dovuto lavorare con openGL, quindi per me non sarebbe tanto il
problema di "disegnare la scena". Quello che immaginavo potesse crearmi
problemi (e tu me lo stai confermando) era proprio l'intersezione tra
piano e volume...
> A me è capitato di usare OpenGL per fare cose simili (disegnare dei
> solidi elementari) ma anche con OpenGL il calcolo di
> minimi/massimi/intersezioni etc. era tutto a carico mio e non tutti i
> calcoli sono propriamente banali. Puoi cercare librerie di modellazione
> o di videogames per vedere se trovi qualcosa di pronto (per esempio le
> collisioni sono un problema classico dei videogame).
>
> Ad ogni modo se vuoi fare quanto ho visto su quel link usando winform
> otterrai performance pessime.
Il problema è che vogliono a tutti i costi una gui stile windows form,
quindi se proprio non può essere .net dovrà essere una swing java o
qualcosa di simile. Il problema comunque rimane, se devo in ogni caso
appoggiarmi a directx o openGL. Non può essere per esempio uno script
matlab o tantomeno una gui creata da matlab.
E se creassi l'interfaccia con .net ma richiamassi al suo interno le
funzioni matlab? Può essere una soluzione percorribile?
> Inoltre ricordati che WPF ragiona in modo vettoriale, quindi tutto
> quello che puoi esprimere in modo vettoriale è ovviamente un guadagno
> rispetto ai voxel.
>
> BTW, il libro di riferimento per WPF in 3D è quello di Charles Petzold.
Darò sicuramente un'occhiata


title: .NET e elaborazione immagini 3D

text:
Pidi wrote:
> Ho già dovuto lavorare con openGL, quindi per me non sarebbe tanto il
> problema di "disegnare la scena". Quello che immaginavo potesse crearmi
> problemi (e tu me lo stai confermando) era proprio l'intersezione tra piano e
> volume...
Quello è un classico problema ... dovrai farti questi conti a manina o
usare una libreria di terze parti.
> Il problema è che vogliono a tutti i costi una gui stile windows form, quindi
> se proprio non può essere .net dovrà essere una swing java o qualcosa di
> simile. Il problema comunque rimane, se devo in ogni caso appoggiarmi a
> directx o openGL. Non può essere per esempio uno script matlab o tantomeno
> una gui creata da matlab.
Con WPF puoi costruire una grafica analoga a quella di Winform.
Ovviamente la puoi costruire di gran lunga migliore ma se la vuoi
simile/uguale a winform è ovviamente fattibile.
> E se creassi l'interfaccia con .net ma richiamassi al suo interno le funzioni
> matlab? Può essere una soluzione percorribile?
Dipende se matlab espone un sdk che ti permette di fare questo tipo di
integrazione. Non saprei.



title: [WPF] Selezione di un menuitem da codice

author: marcosabba

text:
Ciao a tutti.
Mi ï¿œ capitato di dover aprire un menu contestuale tramite tasto "INS", e
sto provando in tutti i modi, senza successo, a preselezionare una voce
di un sottomenu da codice.
In breve, il mio menu contestuale presenta un primo livello con un
menuitem dotato di un sottomenu popolato tramite ItemsSource, e il mio
problema ï¿œ che purtroppo negli Items di questo sottomenu non riesco a
vedere la collezione "visuale" dei componenti ui (da cui potrei provare
a chiamare Focus()) ma vedo solo gli oggetti bindati, che sono gli
oggetti viewmodel sottostanti del datacontext.
Come posso risalire al componente?
FrameworkElement fe =
_contextMenu.ItemContainerGenerator.ContainerFromItem((_contextMenu.Items[menuIndex]
as MenuItem).Items[0]) as FrameworkElement;
Questa cosa non funziona, mi torna null. Eppure il menï¿œ ï¿œ lï¿œ davanti ai
miei occhi!
Se qualcuno ha un'idea gliene sarï¿œ grato.
Ciao


text:
Il 08/04/2011 15:43, marcosabba ha scritto:
> Ciao a tutti.
> Mi è capitato di dover aprire un menu contestuale tramite tasto "INS", e
> sto provando in tutti i modi, senza successo, a preselezionare una voce
> di un sottomenu da codice.
> In breve, il mio menu contestuale presenta un primo livello con un
> menuitem dotato di un sottomenu popolato tramite ItemsSource, e il mio
> problema è che purtroppo negli Items di questo sottomenu non riesco a
> vedere la collezione "visuale" dei componenti ui (da cui potrei provare
> a chiamare Focus()) ma vedo solo gli oggetti bindati, che sono gli
> oggetti viewmodel sottostanti del datacontext.
> Come posso risalire al componente?
Non sono riuscito a risolvere il problema alla radice, per cui l'ho
aggirato facendo una cosa davvero brutta, ma funzionante, per cui ve la
riporto nel caso in cui il mio problema capiti a qualcun altro:
ho raggiunto il livello del sottomenu in cui avevo ancora accesso al
componente, poi ho chiamato Focus():
(_contextMenu.Items[menuIndex] as MenuItem).Focus();
poi ho usato la libreria TestApi (
http://testapi.codeplex.com/
) per
simulare la pressione di un tasto (rightarrow) in modo tale da portare
il focus sul primo elemento della lista:
Microsoft.Test.Input.Keyboard.Type(System.Windows.Input.Key.Right);
DispatcherOperations.WaitFor(DispatcherPriority.SystemIdle);
Ciao a tutti.


title: sqlcommand - leggere messaggi

author: Paolo opg

text:
ciao a tutti,

sto provando a leggere i messaggi restituiti da un sqlcommand (stored
procedure su sql 2008 r2), ma non riesco a capire come fare.

se eseguo la sp con sql manager restituisce una stringa di testo, che e'
quello che voglio leggere da codice.

ho provato con sqlcommand.executescalar ma ottengo un oggetto nullo.

c'e' qualche metodo dell'oggetto sqlcommand specifico per recuperare questa
stringa?

la stored procedure non la genero io ed e' pure criptata nel db, quindi non
posso modificarne il comportamento...

grazie

Paolo

--
Paolo opg

BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--


title: sqlcommand - leggere messaggi

text:
Paolo opg <
spamc...@tiscali.it
> wrote in
news:Xns9F99809D9980Bsp...@193.43.96.1
:

> ciao a tutti,
>
> sto provando a leggere i messaggi restituiti da un sqlcommand (stored
> procedure su sql 2008 r2), ma non riesco a capire come fare.
>
[cut]

trovato.
cercavo sull'oggetto sbagliato...

bisogna gestire l'evento InfoMessage della connessione su cui si esegue il
comando.



title: Wpf StoryBoard, come funziona?

author: vbMizio

text:
Ciao,
eccomi ancora qui con qualche domandina con le funzionalita' multimediali di
WPF.
In particolare sto cercando di "suonare" una sequenza di clip. Provando a
scartabellare un po' in giro, ho capito (sperando di non sbagliare) che
l'oggetto StoryBoard (System.Windows.Media.Animation.Storyboard) potrebbe
essere quello che fa per me.
Una volta creato un oggetto di tipo Storyboard, aggiungo alla collection
Children, piu' oggetti di tipo System.Windows.Media.MediaTimeline.
Dopo aver aggiunto i vari children, tramite la pressione di un button, avvio
il play dei filmati, semplicemente chiamando il metodo Begin del mio oggetto
Storyboard, e passando come argomento il riferimento ad un oggetto di tipo
MediaElement.
A questo punto, a differenza di quanto mi sarei aspettato, viene
visualizzata l'ultima clip inserita, mentre avrei pensato che iniziasse la
prima, per poi passare alla seconda e cosi' via.
Avete qualche spunto per poter avere il comportamento da me voluto?
Sto lavorando con VB2010, ma naturalmente anche esempi in C# sono ben voluti
:-)
Grazie e ciao


title: Matrici dichiarate come Dummy()() As Tipo vs Dummy(,) As Tipo

text:
Per del parsing di testo, sto usando la notazione
di matrici dichiarate come Dummy()()() As Tipo
sono del tipo riga, colonna, token
invece di quella più ovvia  Dummy(,,) As Tipo
L'ho fatto un po' a naso lo ammetto, senza indagare troppo,
ma chiedo conferma del fatto che la prima notazione, con
tante parentesi, sottenda una struttura dati sparsa, e
quindi potenzialmente risparmiosa, specie se ci sono
sottostrutture di dimensioni molto diverse, laddove la
matrice ennedimensionale iper-rettangolare avrebbe allocato
spazio per il caso più sfavorevole di ciascun indice, salvo
poi lasciare vuote le celle sovradimensionate.
E' vero che è sparsa (e compatta) la notazione ()()() ?
Cmq, il fatto che occorra fare tante redim, una di primo
livello, tante al secondo livello, tante al quadrato per il
terzo (per quanto redim variabili e quindi flessibili), mi
fa sospettare che la struttura dati sottostante sia
grossomodo organizzata o come lista, o magari come array di
puntatori, ed array di puntatori a puntatori etc.
E' verosimile ?
Questi vari strati di indirection aggiuntivi, hanno essi
stessi un costo, un overspace, suppongo, che probabilmente
smorza (magari in casi sfavorevoli di dati rettangolari,
sovrasta) il risparmio della matrice sparsa.
Ora il costo della classica matrice tridimensionale A(,,) o
cmq con qualsiasi numero di dimensioni, è facile da stimare.
Per stimare invece l'occupazione di memoria totale
dell'aggregato alternativo, A()()(), che codice dovrei
scrivere ? Annidato tra i metodi, c'è magari un metodo per
sapere in una botta il numero di elementi totali di tutte le
righe colonne etc ?
Mi son spiegato un po' confusamente, e mi scuso (devo
portare la micia dal vet tra mezz'ora e volevo lanciare la
bottiglia prima di partire, che non so a che ora sono a casa).
Ciao e grassie
Soviet


author: LudovicoVan

text:
On Jan 19, 1:46 pm, Soviet_Mario <Soviet.Ma...@CCCP.MIR> wrote:
>
> Per del parsing di testo, sto usando la notazione
> di matrici dichiarate come Dummy()()() As Tipo
>
> sono del tipo riga, colonna, token
>
> invece di quella più ovvia  Dummy(,,) As Tipo
>
> L'ho fatto un po' a naso lo ammetto, senza indagare troppo,
> ma chiedo conferma del fatto che la prima notazione, con
> tante parentesi, sottenda una struttura dati sparsa, e
> quindi potenzialmente risparmiosa, specie se ci sono
> sottostrutture di dimensioni molto diverse, laddove la
> matrice ennedimensionale iper-rettangolare avrebbe allocato
> spazio per il caso più sfavorevole di ciascun indice, salvo
> poi lasciare vuote le celle sovradimensionate.
>
> E' vero che è sparsa (e compatta) la notazione ()()() ?
Sparsa si', compatta non saprei perche' e' un dettaglio implementativo
(in realta' mi aspetterei di no, cioe' mi aspetterei di trovare array
di puntatori non necessariamente relativi ad aree contigue di
memoria).
> Cmq, il fatto che occorra fare tante redim, una di primo
> livello, tante al secondo livello, tante al quadrato per il
> terzo (per quanto redim variabili e quindi flessibili), mi
> fa sospettare che la struttura dati sottostante sia
> grossomodo organizzata o come lista, o magari come array di
> puntatori, ed array di puntatori a puntatori etc.
>
> E' verosimile ?
Direi di si', ma che e' anche alquanto irrilevante.
> Questi vari strati di indirection aggiuntivi, hanno essi
> stessi un costo, un overspace, suppongo, che probabilmente
> smorza (magari in casi sfavorevoli di dati rettangolari,
> sovrasta) il risparmio della matrice sparsa.
E' tutta la solita questione di compromesso fra spazio e velocita'. Ma
e' anche la solita questione che ottimizzazione si fa contro specifici
vincoli: cioe' dipende dal tuo caso specifico quale strada vale la
pena di prendere.
> Ora il costo della classica matrice tridimensionale A(,,) o
> cmq con qualsiasi numero di dimensioni, è facile da stimare.
>
> Per stimare invece l'occupazione di memoria totale
> dell'aggregato alternativo, A()()(), che codice dovrei
> scrivere ? Annidato tra i metodi, c'è magari un metodo per
> sapere in una botta il numero di elementi totali di tutte le
> righe colonne etc ?
No, credo che in un modo o nell'altro si tratti di iterare su tutta la
gerarchia per ottenere un count totale. Ma qui potrei stare
dimenticando qualcosa...
> Mi son spiegato un po' confusamente, e mi scuso (devo
> portare la micia dal vet tra mezz'ora e volevo lanciare la
> bottiglia prima di partire, che non so a che ora sono a casa).
Ti consiglierei un ricerca su Internet per jagged arrays in .Net:
troverai molti articoli, piu' o meno approfonditi, sulle differenze
funzionali e prestazionali rispetto agli array multi-dimensionali.
HTH,
-LV


text:
Il 19/01/2011 20:48, LudovicoVan ha scritto:
> On Jan 19, 1:46 pm, Soviet_Mario<Soviet.Ma...@CCCP.MIR>  wrote:
>>
>> Per del parsing di testo, sto usando la notazione
>> di matrici dichiarate come Dummy()()() As Tipo
>>
>> sono del tipo riga, colonna, token
>>
>> invece di quella più ovvia  Dummy(,,) As Tipo
>>
>> L'ho fatto un po' a naso lo ammetto, senza indagare troppo,
>> ma chiedo conferma del fatto che la prima notazione, con
>> tante parentesi, sottenda una struttura dati sparsa, e
>> quindi potenzialmente risparmiosa, specie se ci sono
>> sottostrutture di dimensioni molto diverse, laddove la
>> matrice ennedimensionale iper-rettangolare avrebbe allocato
>> spazio per il caso più sfavorevole di ciascun indice, salvo
>> poi lasciare vuote le celle sovradimensionate.
>>
>> E' vero che è sparsa (e compatta) la notazione ()()() ?
>
> Sparsa si', compatta non saprei perche' e' un dettaglio implementativo
> (in realta' mi aspetterei di no, cioe' mi aspetterei di trovare array
> di puntatori non necessariamente relativi ad aree contigue di
> memoria).
ci ripensavo dopo avere scritto e troppo tardi, che avevo
scritto una cosa ambigua e travisabile.
Si : intendevo compatta nel senso di niente spazi LOGICI
vuoti. Che non sia fisicamente compatta, era implicito nella
definizione di sparsa, come mi hai confermato.
Era ossimorica se no, come domanda. Accidenti alla fretta :(
>
>> Cmq, il fatto che occorra fare tante redim, una di primo
>> livello, tante al secondo livello, tante al quadrato per il
>> terzo (per quanto redim variabili e quindi flessibili), mi
>> fa sospettare che la struttura dati sottostante sia
>> grossomodo organizzata o come lista, o magari come array di
>> puntatori, ed array di puntatori a puntatori etc.
>>
>> E' verosimile ?
>
> Direi di si', ma che e' anche alquanto irrilevante.
beh, in sé non mi frega in effetti. Solo che per ogni
tabella di puntatori, o tabella di tabelle, dello spazio se
ne va via, volevo considerare solo quell'aspetto : risparmio
da un lato sulle celle vuote, spreco sul versante delle
tavole di puntatori, esponenzialmente crescente con i
livelli di indirezione (vero che pure il risparmio cresce
esponenzialmente). Mi chiedevo se altri si fossero già posti
il problema di cosa è più economico fare.
Come velocità di mero accesso credo che la matrice classica
ennedimensionale, sia più rapida.
Se però si fa tira e molla, redim su redim, allora penso che
la matrice sparsa possa prevalere, perché in generale
rialloca solo pezzi che è necessario, non sposta che il
minimo, e non ultimo non richiede di trovare chunk di
memoria libera contigua di dimensioni elevate, ma dove c'è
un buco ci piazza qualcosa ... sempre se intuisco giusto
com'è implementata, ovviamente.
>
>> Questi vari strati di indirection aggiuntivi, hanno essi
>> stessi un costo, un overspace, suppongo, che probabilmente
>> smorza (magari in casi sfavorevoli di dati rettangolari,
>> sovrasta) il risparmio della matrice sparsa.
>
> E' tutta la solita questione di compromesso fra spazio e velocita'.
non proprio : ponevo la questione spazio risparmiato da un
lato (evidente) e spazio sprecato dall'altro (meno evidente)
per le varie tavole intermedie.
Come velocità si, c'è anche qui la questione cui accennavo
sopra, e che stavolta mi interessava meno.
> Ma
> e' anche la solita questione che ottimizzazione si fa contro specifici
> vincoli: cioe' dipende dal tuo caso specifico quale strada vale la
> pena di prendere.
beh, diciamo che non conoscendo niente a priori dei dati da
distribuire, e mettendo in conto di fare una valanga di
redim, e di avere a che fare con righe lunghe e corte
irregolarmente, avevo già optato per la matrice sparsa.
Anche perché mi piace la notazione (mi ricorda quella del C
con le quadre) :)
Eppure un po' di paranoie vengono sempre, a scelta fatta.
>
>> Ora il costo della classica matrice tridimensionale A(,,) o
>> cmq con qualsiasi numero di dimensioni, è facile da stimare.
>>
>> Per stimare invece l'occupazione di memoria totale
>> dell'aggregato alternativo, A()()(), che codice dovrei
>> scrivere ? Annidato tra i metodi, c'è magari un metodo per
>> sapere in una botta il numero di elementi totali di tutte le
>> righe colonne etc ?
>
> No, credo che in un modo o nell'altro si tratti di iterare su tutta la
> gerarchia per ottenere un count totale. Ma qui potrei stare
> dimenticando qualcosa...
capito. Potrei aggiungere qualche tracciante in fase di
costruzione allora, perché almeno una volta, quando viene
creata e riempita, questa scansione bisogna pur farla. Devo
ancora capire come cercare di misurare le matrici intermedie
(sottoreferenziate con meno parentesi), se e come si possa fare.
>
>> Mi son spiegato un po' confusamente, e mi scuso (devo
>> portare la micia dal vet tra mezz'ora e volevo lanciare la
>> bottiglia prima di partire, che non so a che ora sono a casa).
>
> Ti consiglierei un ricerca su Internet per jagged arrays in .Net:
grazie ... non conoscevo il termine jagged, e cercando
sparse magari non avrei trovato granché.
> troverai molti articoli, piu' o meno approfonditi, sulle differenze
> funzionali e prestazionali rispetto agli array multi-dimensionali.
A te stanno simpatiche ?
TRa l'altro, semanticamente, trovo comodissima
l'assegnazione tra "sezioni" a dimensionalità intermedia con
matrici opportune, tipo :
dim A(5) as byte
dim B(3)(5) as byte
B(2) = A
A = B(1)
a righe, o ancor più compatto a "superfici"
dim C(5)(4) as byte
dim D(6)(5)(4) as byte
D(1) = C '' assegna una sezione piatta 2D
C(2) = D(1)(3) '' assegna una riga 1D
(magari mi son confuso, era solo un esempio dimostrativo,
nel codice ho assegnato solo righe in effetti)
imho è molto conciso ed espressivo.
Con matrici ennedimensionali di diverso rank, non so se si
riesca a scrivere espressioni così brevi e, credo, anche
efficienti.
cmq mo googlo su jagged arrays
ciao
Soviet
> HTH,
>
> -LV


text:

Se capisco cosa intendi per spazi *logici*, da quel punto di vista non
esistono strutture sparse...
> >> Cmq, il fatto che occorra fare tante redim, una di primo
> >> livello, tante al secondo livello, tante al quadrato per il
> >> terzo (per quanto redim variabili e quindi flessibili), mi
> >> fa sospettare che la struttura dati sottostante sia
> >> grossomodo organizzata o come lista, o magari come array di
> >> puntatori, ed array di puntatori a puntatori etc.
>
> >> E' verosimile ?
>
> > Direi di si', ma che e' anche alquanto irrilevante.
>
> beh, in sé non mi frega in effetti. Solo che per ogni
> tabella di puntatori, o tabella di tabelle, dello spazio se
> ne va via, volevo considerare solo quell'aspetto : risparmio
> da un lato sulle celle vuote, spreco sul versante delle
> tavole di puntatori, esponenzialmente crescente con i
> livelli di indirezione (vero che pure il risparmio cresce
> esponenzialmente). Mi chiedevo se altri si fossero già posti
> il problema di cosa è più economico fare.
Una risposta gia' te l'ho data: e' una valutazione che si fa nel caso
specifico. Poi ovviamente uno potrebbe anche pensare di sviluppare un
piccolo modello matematico che da' l'occupazione dello spazio in
funzione della struttura dati scelta. Ma richiede la conoscenza di
alcuni dettagli implementativi che e' da verificare se sono
documentati come stabili. Qui qualcun altro, forse uno degli MVP,
potrebbe esserti d'aiuto.
> Come velocità di mero accesso credo che la matrice classica
> ennedimensionale, sia più rapida.
> Se però si fa tira e molla, redim su redim, allora penso che
> la matrice sparsa possa prevalere, perché in generale
> rialloca solo pezzi che è necessario, non sposta che il
> minimo, e non ultimo non richiede di trovare chunk di
> memoria libera contigua di dimensioni elevate, ma dove c'è
> un buco ci piazza qualcosa ... sempre se intuisco giusto
> com'è implementata, ovviamente.
Meglio non intuire: meglio documentarsi...
> A te stanno simpatiche ?
A volte sono la soluzione piu' "corretta": that's all I care for. :)
-LV


title: Configurazione servizio windows

author: Stefano Paparesta

text:
Buondì a tutti,
devo scrivere un servizio windows che apre "n" porte seriali e riceve
delle pesate da "n" bilance... insomma nella creazione del servizio
dovrò crearmi "n" thread che aprono le seriali e leggono i dati in
arrivo, questi dati vengono salvati nel db.
La mia domanda, in questa fase, più che sull'implementazione del
servizio si incentra su come collegarmi a tale servizio con un
programma di amministrazione. Tale programma dovrebbe farmi vedere le
pesate che arrivano dal servizio sun un form e in seconda battuta deve
permettermi di configurare i parametri del servizio. Per cui di questi
programmi amministrativi ce ne saranno tipo un paio attivi, come posso
sviluppare questo task ? Direi con WCF, o sbglio ? Per ricevere in
tempo reale devo usare dei callbacks o ci sono altre tecniche che
posso usare ?
Grazie mille
Stefano


title: Configurazione servizio windows

text:
Ciao Stefano,
You wrote on 17/02/2011 :
> sviluppare questo task ? Direi con WCF, o sbglio ? Per ricevere in
> tempo reale devo usare dei callbacks o ci sono altre tecniche che
> posso usare ?
WCF, tutta la vita per esporre un endpoint per permettere ad un client
di connettersi. L'ideale sarebbe andare in polling e non chiedere al
servizio di fare push. Ma se proprio è necessario fare push allora, con
pochi client, e infrastruttura di rete permettendo, potresti invertire
le parti:
- il client si connette;
- fa handshacking e autenticazione;
- da al server l'indirizzo di un endpoint a cui ranggiugerlo;
- si disconnette e aspetta che il server lo chiami per comunicare le
pesate;
Hai l'inghippo che devi decidere quale è la logica per cui il server
stabilisce che il client non è più raggiungibile e smette quindi di
informalro.
Altra strada potrebbe essere quella del broadcast su UDP dal server
verso il mondo.
.m
--
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @
http://milestone.topics.it
whynot [ at ] topics [ dot ] it


title: Configurazione servizio windows

text:
Grazie Mauro,
in effetti, memore di consigli passati, ho pensato subito al polling,
però in questo caso non saprei come impostarlo. Per l'impostazione del
push come dici te è interessante, il broadcast ho paura che sia un po'
troppo per la rete
Stefano


title: Validazione del modello in un contesto MVVM

author: Giulio Petrucci

text:
Ciao a tutti,
mi trovo nel seguente scenario: un editor di grafi realizzato in WPF.
Ogni nodo ha un nome, due figli dello stesso nodo non possono avere lo
stesso nome. A livello di business posso esprimere la cosa come:
class Node {
	string Name { ... }
	List<Node> Children { get; }
}
class NodeService
{
	AddChild(Node root, Node child)
	{
		var omonimo = root.Children.FirstOrDefault(n => n.Name == child.Name);
		if (omonimo != null && omonimo != child)
			throw new InvalidOperationException();
		root.Children.Add(child)
	}
}
Sto cercando di immaginare l'interazione con l'utente:
1. l'utente clicca di destro sul nodo 'A' che ha già due figli 'B' e 'C'
2. dal menù contestuale sceglie "Add Child" ->
	2.1 sotto al nodo A appare un nodo senza nome che prende il focus,
3. l'utente scrive 'C' e preme invio;
4. visto che il nome non è ammesso (esiste un "fratello" con lo stesso
nome), il livello di business solleva una InvalidOperationException
5. all'utene viene mostrato un popup con il messaggio di errore
6. si torna al punto 2.1
7. l'utente scrive 'D' e preme invio
8. il nuovo nodo viene aggiunto... e tutti vissero felici e contenti.
Ora, faccio davero fatica a capire come il livello dei view-model possa
interagire con questo modello, tenendo conto che per ogni nodo
visualizzato c'è un NodeViewModel che insiste su un oggetto Node.
Qualcuno mi da una mano?
:-)
Ciao e grazie,
Giulio
--


text:
Giulio Petrucci wrote:
> Sto cercando di immaginare l'interazione con l'utente:
> 1. l'utente clicca di destro sul nodo 'A' che ha già due figli 'B' e 'C'
> 2. dal menù contestuale sceglie "Add Child" ->
> 	2.1 sotto al nodo A appare un nodo senza nome che prende il focus,
> 3. l'utente scrive 'C' e preme invio;
> 4. visto che il nome non è ammesso (esiste un "fratello" con lo stesso nome),
> il livello di business solleva una InvalidOperationException
> 5. all'utene viene mostrato un popup con il messaggio di errore
> 6. si torna al punto 2.1
> 7. l'utente scrive 'D' e preme invio
> 8. il nuovo nodo viene aggiunto... e tutti vissero felici e contenti.
>
> Ora, faccio davero fatica a capire come il livello dei view-model possa
> interagire con questo modello, tenendo conto che per ogni nodo visualizzato
> c'è un NodeViewModel che insiste su un oggetto Node.
>
> Qualcuno mi da una mano?
> :-)
Io ritengo ci sia la necessità di avere due distinti livelli:
- il viewmodel impedisce che il modello possa divenire invalido. In
sostanza quando l'utente tenta di dare un nome omonimo, non permette di
impostarlo e lo marca come invalido usando il meccanismo di validzione
grafico di wpf.
- al modello tocca un controllo più 'sostanziale' e rigido, la cui
incoerenza fa scattare un eccezione che ti obbliga di tornare indietro
sui tuoi passi (ricarichi l'ultima situazione valida tramite undo o da
db). Questo serve solo a garantire la consistenza dei dati e, almeno in
teoria, non dovrebbe mai intervenire se non perché uno smart-user ha
'gabbato' la UI.
Per il primo sistema puoi guardare la validazione wpf da triggerare
durante la digitazione. Di default viene mostrato un rettangolo rosso
attorno al controllo ma puoi impostare quello che vuoi (anche uno user
control con tutti i dettagli del caso).
--
Raffaele Rialdi
http://www.iamraf.net
Weblog:
http://blogs.ugidotnet.org/raffaele
Microsoft MVP profile
https://mvp.support.microsoft.com/profile/raffaele
UGIdotNET -
http://www.ugidotnet.org/


text:
Ciao Raf,
innanzitutto grazie della risposta.
Andiamo con ordine...
On 8/10/2011 3:46 PM, Raffaele Rialdi [MVP] wrote:
> Io ritengo ci sia la necessità di avere due distinti livelli:
> - il viewmodel impedisce che il modello possa divenire invalido. In
> sostanza quando l'utente tenta di dare un nome omonimo, non permette di
> impostarlo e lo marca come invalido usando il meccanismo di validzione
> grafico di wpf.
  - al modello tocca un controllo più 'sostanziale' e rigido, la cui
> incoerenza fa scattare un eccezione che ti obbliga di tornare indietro
> sui tuoi passi (ricarichi l'ultima situazione valida tramite undo o da
> db).
La prima "obiezione" (violando quindi il principio per cui "Raf ha
sempre ragione" :-p) è questa: ma in questo modo non dovrei "duplicare"
i controlli? Se la regola di business che sottosta alla validazione
dovesse cambiare dovrei cambiare a mano codice diverso in due punti... e
considerando il numero di regole con cui avrò a che fare nel caso reale,
la cosa mi "abbatte"... :-D
Ciao,
Giulio
--


text:
Giulio Petrucci wrote:
> Ciao Raf,
>
> innanzitutto grazie della risposta.
Prego :)
> La prima "obiezione" (violando quindi il principio per cui "Raf ha sempre
> ragione" :-p)
LOL :D
> è questa: ma in questo modo non dovrei "duplicare" i controlli?
> Se la regola di business che sottosta alla validazione dovesse cambiare
> dovrei cambiare a mano codice diverso in due punti... e considerando il
> numero di regole con cui avrò a che fare nel caso reale, la cosa mi
> "abbatte"... :-D
Dipende dal contesto specifico ma il tipo di validazione non è proprio
uguale anche se potresti avere qualcosa in comune (quindi condivisibile
per minimizzare quel problema).
Sul lato UI:
- fai i controlli man mano che i dati vengono inseriti ma il modello
non è ancora completo, quindi può capitare che l'inserimento di un
altro campo renda invalido il precedente.
- potresti non lavorare direttamente sul modello ma su dei DTO. A causa
della differenza la validazione sarebbe necessariamente differente
rispetto al modello che poi viene persistito.
- puoi voler restringere l'usabilità del modello anche se questo
rimarrebbe comunque conforme. Per esempio in un front-end web potresti
non supportare una naming convention perchè implicherebbe un numero di
feature che non hai previsto.
Sul lato 'server':
- la validazione deve essere semplice e limitarsi a dare un responso
booleano (eventualmente loggando i dettagli). La semplicità è
essenziale per evitare di corrompere il modello.
- potresti avere maggiori dati a disposizione per eseguire una
validazione di più basso livello. Per esempio una query su db.
Ho buttato giù le prime che mi sono venute in mente, non so quanto
siano aderenti al tuo caso, ma sono scampoli di memorie di lavori
passati :)



text:
Ciao Raf,
On 8/10/2011 4:38 PM, Raffaele Rialdi [MVP] wrote:
> Dipende dal contesto specifico ma il tipo di validazione non è proprio
> uguale anche se potresti avere qualcosa in comune (quindi condivisibile
> per minimizzare quel problema).
Hai centrato il punto: bisogna minimizzare la differenza.
Esiste un qualche procedimento """standard""" (cioè un qualche approccio
paradigmatico e/o di riferimento) a cui potersi ispirare?
> Sul lato UI:
> - fai i controlli man mano che i dati vengono inseriti ma il modello non
> è ancora completo, quindi può capitare che l'inserimento di un altro
> campo renda invalido il precedente.
...mumble mumble...
> - potresti non lavorare direttamente sul modello ma su dei DTO. A causa
> della differenza la validazione sarebbe necessariamente differente
> rispetto al modello che poi viene persistito.
Qui la cosa si complicherebbe ulteriormente perché la validazione
sarebbe a "tre livelli" (UI, Dto, modello). Ma preferisco non pensarci. :-D
> Sul lato 'server':
> - la validazione deve essere semplice e limitarsi a dare un responso
> booleano (eventualmente loggando i dettagli). La semplicità è essenziale
> per evitare di corrompere il modello.
Quindi dici meglio il risultato booleano che una bella eccezione?



text:
Giulio Petrucci wrote:
> Hai centrato il punto: bisogna minimizzare la differenza.
> Esiste un qualche procedimento """standard""" (cioè un qualche approccio
> paradigmatico e/o di riferimento) a cui potersi ispirare?
non saprei ... a mio avviso è troppo contestuale, fa parte dell'analisi
>> - fai i controlli man mano che i dati vengono inseriti ma il modello non
>> è ancora completo, quindi può capitare che l'inserimento di un altro
>> campo renda invalido il precedente.
>
> ...mumble mumble...
magari non è il tuo caso ma può accadere
> Qui la cosa si complicherebbe ulteriormente perché la validazione sarebbe a
> "tre livelli" (UI, Dto, modello). Ma preferisco non pensarci. :-D
non è così infrequente :)
> Quindi dici meglio il risultato booleano che una bella eccezione?
beh la validazione spara un booleano, poi se vuoi sollevare l'eccezione
lo puoi chiaramente fare ed è sicuramente il caso se hai passato le
validazioni ui ma non quelle lato server.
Ciao



author: Andrea Saltarello

text:
Giulio Petrucci <sis...@nonono.boh> wrote:
> Esiste un qualche procedimento """standard""" (cioè un qualche approccio
> paradigmatico e/o di riferimento) a cui potersi ispirare?
>
Vuoi una risposta "estetica" o "pragmatica"? :-)
P.S.: sono in ferie: qualunque sia la tua scelta, risponderò cmq sett prox
:-)


text:
Ciao Andrea,
On 8/11/2011 9:32 PM, Andrea Saltarello wrote:
> Vuoi una risposta "estetica" o "pragmatica"? :-)
ma che domanda... :-)
La risposta è (ovviamente):
*ENTRAMBE*!!!
> P.S.: sono in ferie: qualunque sia la tua scelta, risponderò cmq sett prox
> :-)
Goditi le ferie. :-)
Ci sentiamo prossimamente!
Grazie,
Giulio
--


text:
On 11/08/2011 21:32, Andrea Saltarello wrote:
> Vuoi una risposta "estetica" o "pragmatica"? :-)
>
> P.S.: sono in ferie: qualunque sia la tua scelta, risponderò cmq sett prox
> :-)

Recentemente mi sono riletto il thread e... tornato dalle ferie? ;-)

Ciao,
Giulio

--


text:
Il 03/10/2011 14:47, Giulio Petrucci ha scritto:

> Recentemente mi sono riletto il thread e... tornato dalle ferie? ;-)
>

LOL! Vieni al DDD Day (
http://www.ddd-day.it
) sabato e ne parliamo? :-)

--
.A
GUISA -
http://www.guisa.org

UGIdotNET -
http://www.ugidotnet.org

Read my blog at:
http://blogs.ugidotnet.org/pape


text:
On 03/10/2011 16:22, Andrea Saltarello wrote:
> LOL! Vieni al DDD Day (
http://www.ddd-day.it
) sabato e ne parliamo? :-)

LOL!
Qui in azienda se ne stava parlando, il problema - per quanto riguarda
il sottoscritto - è che sabato si sposa un mio amico. :-)
BTW: pubblicate webcast/slides?

Ciao,
Giulio

--


text:
Il 03/10/2011 17:23, Giulio Petrucci ha scritto:
> On 03/10/2011 16:22, Andrea Saltarello wrote:
>> LOL! Vieni al DDD Day (
http://www.ddd-day.it
) sabato e ne parliamo? :-)
>
> LOL!
> Qui in azienda se ne stava parlando, il problema - per quanto riguarda
> il sottoscritto - è che sabato si sposa un mio amico. :-)
e tu porta anche l'amico :-)

> BTW: pubblicate webcast/slides?
le slide sicuramente si, ci stiamo organizzando per registrare le
sessioni: incrocia i "diti" :-)



title: [CCNET] 1.5 con TFS

text:
Qualcuno ha provato CCNET 1.5 con TFS 2008?
Nel caso, funziona?
--
ale
http://ale.riolo.co.uk


title: [CCNET] 1.5 con TFS


title: [CCNET] 1.5 con TFS

author: Igor Antonacci

text:
Alessandro Riolo explained on 20/10/2010 :
> Qualcuno ha provato CCNET 1.5 con TFS 2008?
> Nel caso, funziona?
Ciao,
ho svariate installazioni di
CC.NET
 alle spalle e posso
confermarti che la configurazione da te proposta funziona...
...a patto che tu installi ALMENO Team Explorer 2008 (+SP1).
Occhio che, il plugin per TFS ï¿œ buggato: se sei in una LAN,
devi far girare il servizio di
CC.NET
 con le credenziali dell'utente
TFS.
Sono qui per maggiori info.
Igor.


title: [CCNET] 1.5 con TFS

text:
"Igor Antonacci" <
bitbr...@hotmail.com
> wrote:
> ho svariate installazioni di
CC.NET
 alle spalle
Qualcuna anch'io ;)
> e posso
> confermarti che la configurazione da te proposta funziona...
Great to know! Le ultime due volte che ï¿œ cambiata la minor version ho avuto
svariati problemi, questa volta prima di provarci ho cercato un po in giro,
e sulla Jira del progetto c'erano troppi bug per convincermi a perderci del
tempo.
> ...a patto che tu installi ALMENO Team Explorer 2008 (+SP1).
Nessun problema (i progetti per cui vorrei aggiornare sono su VS2010 e
VS2008 SP1).
> Occhio che, il plugin per TFS ï¿œ buggato: se sei in una LAN,
> devi far girare il servizio di
CC.NET
 con le credenziali dell'utente
> TFS.
Effettivamente faccio cosï¿œ anch'io ... non con i server che usano SVN perï¿œ!
> Sono qui per maggiori info.
Cheers mate! :)
--
ale
http://ale.riolo.co.uk


title: struct

author: GennarinOSpion

text:
Ciao,

una sctruct viene istanziata in memoria (se ho ben capito nello stack)
quando la utilizzo o anche solamente per il fatto che l'ho definita nel
codice del programma?

grazie


title: struct

text:

Le dichiarazioni:
Point p;
oppure
Point p = new Point();
sono equivalenti ed allocano automaticamente un Point nello stack
(quindi niente GC).
Le struct sono valuetype e questo significa che ogni volta che passi un
Point ad un metodo, questo riceverà una copia del tuo Point (quindi se
dentro il metodo fai modifiche al Point rimarranno locali a quel
metodo).

La definizione:
struct Point{....}
non alloca nulla ma genera codice e metadati (che occupano ovviamente
memoria ma non alloca alcun oggetto di tipo Point).

--
Raffaele Rialdi
http://www.iamraf.net

Weblog:
http://blogs.ugidotnet.org/raffaele

Microsoft MVP profile
https://mvp.support.microsoft.com/profile/raffaele

UGIdotNET -
http://www.ugidotnet.org/


title: struct

text:
Il 26/10/2011 18:46, Raffaele Rialdi [MVP] ha scritto:
> ono equivalenti ed allocano automaticamente un Point nello stack (quindi
> niente GC).
> Le struct sono valuetype e questo significa che ogni volta che passi un
> Point ad un metodo, questo riceverà una copia del tuo Point (quindi se
> dentro il metodo fai modifiche al Point rimarranno locali a quel metodo).

grazie


title: struct

text:
"Raffaele Rialdi [MVP]" <
malta@n0spam_vevy.com
> wrote in message
news:mn.d4667dbae...@n0spamvevy.com...

> Le dichiarazioni:
> Point p;

Quella e' una definizione.

> Le struct sono valuetype e questo significa che ogni volta che passi un
> Point ad un metodo, questo riceverà una copia del tuo Point

Solo se il parametro e' passato by value.

> La definizione:
> struct Point{....}

Quella e' una dichiarazione.

-LV


title: struct

text:
LudovicoVan wrote:
>> Le dichiarazioni:
>> Point p;
>
> Quella e' una definizione.

[...]

>> La definizione:
>> struct Point{....}
>
> Quella e' una dichiarazione.
>

Mi hai fatto venire la curiosità e sono andato a vedere nelle specs C#.
A quanto leggo non esiste una nomenclatura standard visto che si legge
"Local variable declaration", "struct declaration" e ancora chiama le
definizioni dei metodi sia "declarations" che "definitions"



title: struct

text:
"Raffaele Rialdi [MVP]"  wrote in message
news:mn.fb457dba5...@n0spamvevy.com...
> LudovicoVan wrote:
> >> Le dichiarazioni:
> >> Point p;
> >
> > Quella e' una definizione.
> [...]
> >> La definizione:
> >> struct Point{....}
> >
> > Quella e' una dichiarazione.
>
> Mi hai fatto venire la curiositï¿œ e sono andato a vedere nelle specs C#.
> A quanto leggo non esiste una nomenclatura standard visto che si legge
> "Local variable declaration", "struct declaration" e ancora chiama le
> definizioni dei metodi sia "declarations" che "definitions"

Ti confermo che quella e' la nomenclatura giusta: dichiarazione di tipi,
definizione di istanze. Il motivo dell'ambiguita' nella documentazione
(tralasciando ovviamente il fatto che in rete si trova di tutto di piu' e
c'e' anche molto di scorretto) e' che quando per esempio in un metodo scrivi
"int a = 1;" stai facendo dichiarazione e definizione insieme. (Per chi ha
esperienza di Pascal, questa distinzione e' analoga a quella che in Pascal
passa fra interface e implementation.)

-LV


title: struct

text:
LudovicoVan wrote:
> Ti confermo che quella e' la nomenclatura giusta: dichiarazione di tipi,
> definizione di istanze. Il motivo dell'ambiguita' nella documentazione
> (tralasciando ovviamente il fatto che in rete si trova di tutto di piu' e
> c'e' anche molto di scorretto) e' che quando per esempio in un metodo scrivi
> "int a = 1;" stai facendo dichiarazione e definizione insieme. (Per chi ha
> esperienza di Pascal, questa distinzione e' analoga a quella che in Pascal
> passa fra interface e implementation.)
>

Io parlo proprio del reference del linguaggio, non della
documentazione.

Ad ogni modo due note 'bibbie' la vedono in modo opposto:

Kernighan/Ritchie dicono:
"You should note that we are using the words definition and declaration
carefully when we refer to external variables in this section.
'Definition' referst to the place where the variable is created or
assigned storage; 'declaration' refers to places where the nature of
the variable is stated but no storage is allocated"

Stroustrup dice:
"The construct class X {...}; is called a class definition because it
defines a new type."

Evidentemente è cambiata la nomenclatura dai linguaggi procedurali a
quelli OOP (mia mera deduzione).



title: struct

author: GM

text:
Il 31/10/2011 18:09, Raffaele Rialdi [MVP] ha scritto:
> LudovicoVan wrote:
>> Ti confermo che quella e' la nomenclatura giusta: dichiarazione di
>> tipi, definizione di istanze. Il motivo dell'ambiguita' nella
>> documentazione (tralasciando ovviamente il fatto che in rete si trova
>> di tutto di piu' e c'e' anche molto di scorretto) e' che quando per
>> esempio in un metodo scrivi "int a = 1;" stai facendo dichiarazione e
>> definizione insieme. (Per chi ha esperienza di Pascal, questa
>> distinzione e' analoga a quella che in Pascal passa fra interface e
>> implementation.)
>>
>
> Io parlo proprio del reference del linguaggio, non della documentazione.
>
>
> Ad ogni modo due note 'bibbie' la vedono in modo opposto:
>
> Kernighan/Ritchie dicono:
> "You should note that we are using the words definition and declaration
> carefully when we refer to external variables in this section.
> 'Definition' referst to the place where the variable is created or
> assigned storage; 'declaration' refers to places where the nature of the
> variable is stated but no storage is allocated"
>
> Stroustrup dice:
> "The construct class X {...}; is called a class definition because it
> defines a new type."
>
> Evidentemente è cambiata la nomenclatura dai linguaggi procedurali a
> quelli OOP (mia mera deduzione).
>
No, IMHO nessuna ambiguità:

stroustrup dice *class* definition e quel costrutto (con le graffe) sta
definendo una classe, cioà un nuovo tipo.
Se invece scrivi class X; (senza le graffe) quella è una dichiarazione
di classe.
E qui stiamo parlando di dichiarazione/definizione di un TIPO

Non ti confondere con la definizione/dichiarazione di una variabile,
dove il discrimine è quello citato da K&R.


title: struct

text:
"Raffaele Rialdi [MVP]"  wrote in message
news:mn.fc417dba8...@n0spamvevy.com...

> Io parlo proprio del reference del linguaggio, non della documentazione.

OK, io mi limito a chiamarla tutta genericamente documentazione.

> Ad ogni modo due note 'bibbie' la vedono in modo opposto:

La nomenclatura corretta resta quella che indicavo: come detto, c'e' una
certa ambiguita' nell'uso.  Poi Stroustrup e' notoriamente uno un po'...
particolare, ma e' vero anche che tu non hai dato il contesto di quella
citazione.

Comunque penso sia inutile stare a cavillare: se non mi trovi credibile,
cosi' sia!  ;)

-LV


title: struct

text:
GM wrote:
> No, IMHO nessuna ambiguità:
>
> stroustrup dice *class* definition e quel costrutto (con le graffe) sta
> definendo una classe, cioà un nuovo tipo.
> Se invece scrivi class X; (senza le graffe) quella è una dichiarazione di
> classe.
> E qui stiamo parlando di dichiarazione/definizione di un TIPO

L'equivalente della definition di Stroustrup in C è il typedef dove
invece K/R usano il termine declaration.

>
> Non ti confondere con la definizione/dichiarazione di una variabile, dove il
> discrimine è quello citato da K&R.

la nomenclatura del K/R a riguardarla è coerente ma opposta a quanto
leggo invece sullo Stroustrup.

Cmq non me ne faccio un problema nè voglio sollevarne una questione.
Ho solo risposto a LV che ha rimarcato la differenza di termini.
L'importante è capirsi :)



title: struct

text:
LudovicoVan wrote:
> La nomenclatura corretta resta quella che indicavo: come detto, c'e' una
> certa ambiguita' nell'uso.  Poi Stroustrup e' notoriamente uno un po'...
> particolare, ma e' vero anche che tu non hai dato il contesto di quella
> citazione.
>

È la voce riportata nell'indice come "class definition"

> Comunque penso sia inutile stare a cavillare: se non mi trovi credibile,
> cosi' sia!  ;)
>

:)
Non voglio cavillare e quando ho scritto quel che ho scritto non ci ho
pensato sopra due volte, è solo una questione di abitudine (certamente
alimentata dalle mie letture).



title: WPF e threading

text:
Ciao a tutti,

ho una applicazione WPF che "parla" con un server remoto tramite WCF. Il
client registra sé stesso come callback, in modo che il server possa
fare "push" sul client. Insomma:

Per testare il client in maniera abbastanza "corposa" mi è venuto in
mente: scrivo una emulazione del server che espone una finestra con un
paio di bottoni, quando l'utente li preme vengono mandati i messaggi al
client e blablabla.

So far, so good.

Quando il client fa login, lo fa internamente a un background worker per
mostrare nella finestra di login una progress bar circolare. Questo fa
sì che il metodo "login" sulla mia implementazione del fake-server venga
richiamata su un thread che non è quello della UI, pertanto quando i
commands del viewmodel del server sollevano un evento
CanExecuteChange(), ottengo una eccezione che mi dice che il thread non
è quello giusto.

Al di là del caso particolare, mi piacerebbe poter approfondire il
funzionamento del threading a livello di UI. Qualcuno può darmi qualche
consiglio o linkarmi qualche risorsa?

Grazie,
Giulio

--


title: WPF e threading

text:
Giulio Petrucci wrote:
> Quando il client fa login, lo fa internamente a un background worker per
> mostrare nella finestra di login una progress bar circolare. Questo fa sì che
> il metodo "login" sulla mia implementazione del fake-server venga richiamata
> su un thread che non è quello della UI, pertanto quando i commands del
> viewmodel del server sollevano un evento CanExecuteChange(), ottengo una
> eccezione che mi dice che il thread non è quello giusto.
>
> Al di là del caso particolare, mi piacerebbe poter approfondire il
> funzionamento del threading a livello di UI. Qualcuno può darmi qualche
> consiglio o linkarmi qualche risorsa?
>

Con WPF il Dispatcher ti mette a disposizione la Invoke in modo
similare a quanto avveniva con winform.

Io mi sono scritto un piccolo extension method che uso per rendere più
semplice la riconciliazione dei thread:

public static class DispatcherExtension
{
	public static object Invoke(this Dispatcher Dispatcher, Action action,
params object[] pars)
	{
		return Dispatcher.Invoke(action, pars);
	}
}

Per usarlo chiami:
App.Current.Dispatcher.Invoke(() => MyViewModel.Metodo(...));

--
Raffaele Rialdi
http://www.iamraf.net

Weblog:
http://blogs.ugidotnet.org/raffaele

Microsoft MVP profile
https://mvp.support.microsoft.com/profile/raffaele

UGIdotNET -
http://www.ugidotnet.org/


title: WPF e threading

text:
On 11/11/2011 16:52, Raffaele Rialdi [MVP] wrote:
> Con WPF il Dispatcher ti mette a disposizione la Invoke in modo similare
> a quanto avveniva con winform.

Perfetto.
Domani sono in ferie, lunedì provo e poi ti faccio sapere.

Ciao,
Giulio

--


title: WPF e threading

text:
Giulio Petrucci wrote:
> Perfetto.
> Domani sono in ferie, lunedì provo e poi ti faccio sapere.
>

La sett prox sono tutta la settimana a WPC quindi porta pazienza se non
riesco a risponderti subito.

BTW questi problemi sono tutti risolti con async/await di C#5... niente
più invoke, niente più callback :)



title: WPF e threading

text:
Ciao Raf,

On 11/11/2011 16:52, Raffaele Rialdi [MVP] wrote:
> Con WPF il Dispatcher ti mette a disposizione la Invoke in modo similare
> a quanto avveniva con winform.
[cut]

C'ero arrivato ma avevo messo il "dispatching" nel posto sbagliato.
Comunque grazie per la risposta, ora la cosa pare funzionare bene.

Ciao,
Giulio

--


title: WPF e threading

text:
Ciao a tutti,

On 11/11/2011 10:54, Giulio Petrucci wrote:
> Ciao a tutti,
>
> ho una applicazione WPF che "parla" con un server remoto tramite WCF. Il
> client registra sé stesso come callback, in modo che il server possa
> fare "push" sul client. Insomma:
>
> Per testare il client in maniera abbastanza "corposa" mi è venuto in
> mente: scrivo una emulazione del server che espone una finestra con un
> paio di bottoni, quando l'utente li preme vengono mandati i messaggi al
> client e blablabla.
>
> So far, so good.
>
> Quando il client fa login, lo fa internamente a un background worker per
> mostrare nella finestra di login una progress bar circolare. Questo fa
> sì che il metodo "login" sulla mia implementazione del fake-server venga
> richiamata su un thread che non è quello della UI, pertanto quando i
> commands del viewmodel del server sollevano un evento
> CanExecuteChange(), ottengo una eccezione che mi dice che il thread non
> è quello giusto.

in pratica la soluzione è questa: nell'implementazione di ICommand, è
l'evento CanExecuteChanged che va sollevato "dentro" al dispatcher:

public class MyCommand : ICommand
{
	...
	public void OnCanExecuteChanged() {
		App.Current.Dispatcher.Invoke(() => this.CanExecuteChange(...));
	}
}

Ciao,
Giulio

--


title: EF con mysql

author: Sander

text:
Qualcuno ha fatto qualche progetto con MySQL e con i loro 'Connector'
che implementino Entity Framework su c#/wpf/ fw 4? Io li sto provando
(6.3.5) e funzionano bene, almeno per le crud di base.
Se qualcuno ne ha già saggiato anche la robustezza a lungo
termine...magari puo togliermi questo dubbio prima di imbarcarmi.
Grazie!
Alessandro


title: [WP7] - Problema con "Open in Expression Blend"

author: Andrea Angella

text:
?Ciao a tutti,
ho creato una applicazione di base di tipo Windows Phone 7 tramite Visual
Studio 2010 Professional. Nel momento in cui cerco di aprirlo in Expression
Blend 4 ottengo il seguente messaggio:
"The project "WindowsPhoneApplication1.csproj" could not be opened. The
Windows Phone project could not be opened because a valid installation of
the Microsoft Windows Phone Developer Tools could not be found. Please
reinstall or repair the tools and try again."
Ho fatto il repair ma il problema rimane.
E' capitata la stessa cosa a qualcuno?
Grazie


author: Mila Daniel

text:
Andrea Angella explained :

Ciao, che versione di Blend stai usando, ï¿œ quella compresa nel paccheto
di sviluppo per windows phone o lo avevi giï¿œ prima installato?
In ogni caso a me funziona corretamente, prova magari scaricarti
l'ultimo release dei tool da qui:
http://bitly.in/dcaae
Saluti, Daniel.


author: Corrado Cavalli [MVP]

text:
After serious thinking Andrea Angella wrote :

Non ï¿œ che stai usando una versione dei tools in Beta? l'installazione
ha regolarmente registrato le estensioni per Windows Phone in Blend, se
crei un nuovo progetto vedi i progetti Phone? Hai provato a vedere se
hai Blend per Windows Phone?


text:
?"After serious thinking Andrea Angella wrote", mi prendi in giro?  :)
Allora praticamente io avevo installato la beta ed avevo blend 3 installato
sulla macchina. A settembre ho rimosso la beta e installato la versione
finale. Poi recentemente partendo proprio dal post di Lorenzo ho lanciato
l'update
di Ottobre. Alla fine ho installato la suite Expression Ultimate 4 scaricata
da DreamSpark.
Vedendo che l'opzione non funzionava ho provato a fare il "ripristino" che
ha richiesto parecchio tempo.
Quindi la mia domanda e' cosa fareste voi?
Disistallo/Reinstallo completamente Blend 4 e WP7 tools ?
Ho anche la versione 2008 di Visual Studio sulla macchina.
Mmmm cosa intendi per registrare le estensioni per Windows Phone in Blend?
Effettivamente non ho i template su Blend, quello e' il problema.
"Andrea Angella"  wrote in message
news:iaahpr$nq8$1...@news.eternal-september.org...



text:
Andrea Angella wrote :

Io rimuoverei i tools di Windows Phone e anche tutta l'installazione di
Blend e poi proverei a reinstallare prima Blend4 e poi i tools


text:
?Alla fine ho dovuto reinstallare tutto secondo le tue indicazioni. Ora
funziona.
Grazie
"Corrado Cavalli [MVP]"  wrote in message
news:8j72a3...@mid.individual.net...



title: come si testa un windows service ?

author: neroMalpelo

text:
Salve a tutti

sto realizzando un windows service che ogni N minuti compie una certa
operazione.
Come posso eseguire i test senza dover ricompilare il tutto, arrestare e
disinstallare la versione precedente e rieseguire il setup ?
insomma se compilo e non mi segnala errori come faccio a sapere cosa non
va a runtime ?

grazie per la pazienza


title: come si testa un windows service ?

author: Mauro Servienti [MVP]

text:
Ciao neroMalpelo,

You wrote on 20/10/2011 :
> sto realizzando un windows service che ogni N minuti compie una certa
> operazione.
> Come posso eseguire i test senza dover ricompilare il tutto, arrestare e
> disinstallare la versione precedente e rieseguire il setup ?
> insomma se compilo e non mi segnala errori come faccio a sapere cosa non va a
> runtime ?

tipicamente si realizza una soluzione con 3 progetti:

a) una dll con tutta la logica di business;
b) un progetto per hostare la dll in un servizoo per windows, che altro
non fa che avviare un nuovo thread in cui eseguire la logica di "a";
c) un progetto console che fa la stessa cosa di "b" ma rende semplice
il debug;

.m

--
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com/profile/mauro

blog @
http://milestone.topics.it

whynot [ at ] topics [ dot ] it


title: come si testa un windows service ?

author: Raffaele Rialdi [MVP]

text:
Mauro Servienti [MVP] wrote:
> tipicamente si realizza una soluzione con 3 progetti:
>
> a) una dll con tutta la logica di business;
> b) un progetto per hostare la dll in un servizoo per windows, che altro non
> fa che avviare un nuovo thread in cui eseguire la logica di "a";
> c) un progetto console che fa la stessa cosa di "b" ma rende semplice il
> debug;
>
> .m

+1 quella strategia è fondamentale per evitare di diventare pazzi :)

Se però poi serve debuggare proprio il processo del servizio ci sono
almeno due strategie:
- usare la classe Trace per sparare stringhe diagnostiche (grazie ad un
apposito tracelistener ed eventuali traceswitch)

- usare "attach process" di
vs.net
 per debuggare il servizio che sta
già girando. In questo caso sarà necessario che
vs.net
 venga avviato
come administrator altrimenti non avrà i privilegi per poter fare
l'attach di un processo che gira con credenziali differenti dall'utente
loggato.

--
Raffaele Rialdi
http://www.iamraf.net

Weblog:
http://blogs.ugidotnet.org/raffaele

Microsoft MVP profile
https://mvp.support.microsoft.com/profile/raffaele

UGIdotNET -
http://www.ugidotnet.org/


title: come si testa un windows service ?

text:
Ciao Raffaele,

You wrote on 20/10/2011 :
> +1 quella strategia è fondamentale per evitare di diventare pazzi :)
>
> Se però poi serve debuggare proprio il processo del servizio ci sono almeno
> due strategie:
> - usare la classe Trace per sparare stringhe diagnostiche (grazie ad un
> apposito tracelistener ed eventuali traceswitch)
>
> - usare "attach process" di
vs.net
 per debuggare il servizio che sta già
> girando. In questo caso sarà necessario che
vs.net
 venga avviato come
> administrator altrimenti non avrà i privilegi per poter fare l'attach di un
> processo che gira con credenziali differenti dall'utente loggato.

Aggiungo una porcata che ti permette di debuggare la OnStart, se
proprio devi:

while( !Debugger.IsAttached )
{
  Thread.Sleep( 1000 );
}

in questo modo hai un tempo sufficiente per agganciare il processo
appena avviato prima che il sistema operativo ti falci per timeout in
fase di avvio.



title: come si testa un windows service ?

text:
Mauro Servienti [MVP] wrote:
> Aggiungo una porcata che ti permette di debuggare la OnStart, se proprio
> devi:
>
> while( !Debugger.IsAttached )
> {
>   Thread.Sleep( 1000 );
> }
>
> in questo modo hai un tempo sufficiente per agganciare il processo appena
> avviato prima che il sistema operativo ti falci per timeout in fase di avvio.
>

:)
anche se comunque dentro la onstart sarebbe meglio fare il meno
possibile anche per evitare di rischiare il timeout sulla partenza del
servizio o di rallentare la macchina al boot.

Di solito si lancia un thread che poi attende qualche sorta di evento
dall'esterno per iniziare a fare quello che deve.



title: come si testa un windows service ?

text:
On 20 Ott, 09:13, Raffaele Rialdi [MVP] <
malta@n0spam_vevy.com
> wrote:
> Mauro Servienti [MVP] wrote:
> > tipicamente si realizza una soluzione con 3 progetti:
>
> > a) una dll con tutta la logica di business;
> > b) un progetto per hostare la dll in un servizoo per windows, che altro non
> > fa che avviare un nuovo thread in cui eseguire la logica di "a";
> > c) un progetto console che fa la stessa cosa di "b" ma rende semplice il
> > debug;
>
> > .m
>
> +1 quella strategia è fondamentale per evitare di diventare pazzi :)

+2 :)

Il caso vuole che proprio oggi litigo con un servizio win!

Al3x


title: come si testa un windows service ?

text:
> a) una dll con tutta la logica di business;
> b) un progetto per hostare la dll in un servizoo per windows, che altro non
> fa che avviare un nuovo thread in cui eseguire la logica di "a";
> c) un progetto console che fa la stessa cosa di "b" ma rende semplice il
> Il caso vuole che proprio oggi litigo con un servizio win!
>
> Al3x

ciao Al3x
tu come stai procedendo ?
Ad essere sincero non ho chiaro come realizzare il punto b e c.
Hai qualche suggerimento ?


title: come si testa un windows service ?

text:
On 21/10/2011 14:52, neroMalpelo wrote:
> Ad essere sincero non ho chiaro come realizzare il punto b e c.
> Hai qualche suggerimento ?

//punto A
public class MioServizioStrabello
{
	public MioServizioStrabello() { ... }
	public void Start()
	{
		//qui fai lo start del servizio
	}
	public void Stop()
	{
		//qui fai lo stop del servizio
	}
}

//punto B
public classe MioServizioStrabelloService : ServiceBase
{
	protected MioServizioStrabello service;
	public MioServizioStrabelloService(MioServizioStrabello mss)
	{
		this.service = mss;
	}

	public override void OnStart(string[] args)
	{
		new Thread(new ThreadStart(() => this.service.Start())).Start();
	}
	public override void OnStop() { this.service.Stop(); }
}

//punto C
//eseguendo in debug questa console app puoi debuggare il servizio
public class Program {
	public static void Main(string[] args)
	{
		var service = new MioServizioStrabello();
		service.Start();
		Console.ReadLine();
	}
}

ho scritto il codice di volata, senza syntax checker e senza testarlo.
Quindi *ovviamente* non funziona. :-) Ma spero possa essere un buon
punto di partenza.

Buon lavoro e facci sapere come va,
Giulio

--


title: come si testa un windows service ?

text:

grazie Giulio, volentieri ! postero' l'esito
:-)


title: come si testa un windows service ?

text:
>
> //punto C
> //eseguendo in debug questa console app puoi debuggare il servizio
> public class Program {
> public static void Main(string[] args)
> {
> var service = new MioServizioStrabello();
> service.Start();
> Console.ReadLine();
> }
> }
>
> ho scritto il codice di volata, senza syntax checker e senza testarlo.
> Quindi *ovviamente* non funziona. :-) Ma spero possa essere un buon
> punto di partenza.

scusa Giulio, ho VS2005 e var service = new MioServizioStrabello(); non
lo accetta.
di che tipo e' la variabile service , di tipo ServiceBase ?

grazie e ciao


title: come si testa un windows service ?

text:
> //punto C
> //eseguendo in debug questa console app puoi debuggare il servizio
> public class Program {
> public static void Main(string[] args)
> {
> var service = new MioServizioStrabello();
> service.Start();
> Console.ReadLine();
> }
> }
>
> ho scritto il codice di volata, senza syntax checker e senza testarlo.
> Quindi *ovviamente* non funziona. :-) Ma spero possa essere un buon
> punto di partenza.
>
> Buon lavoro e facci sapere come va,
> Giulio
>

scusate,  ho il seguente codice per fare una app da console  ma non me
lo fa compilare e mi dice che
"Errore	1	Il tipo o il nome dello spazio dei nomi 'ServiceProcess' non
esiste nello spazio dei nomi 'System'; probabilmente manca un
riferimento a un assembly"

**************

using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;

namespace debaco
{
     class Program
     {
         public static void Main(string[] args)
         {
             ServiceBase service = new mioServizio();
             service.Start();
             Console.ReadLine();
         }
     }
}
**************

cosa sbaglio ?


title: come si testa un windows service ?

text:
Ciao neroMalpelo,

On 21/10/2011 16:39, neroMalpelo wrote:
> scusa Giulio, ho VS2005 e var service = new MioServizioStrabello(); non
> lo accetta.
> di che tipo e' la variabile service , di tipo ServiceBase ?

La variabile 'service' è di tipo MioServizioStrabello... ma la puoi
dichiarare come istanza di una qualsiasi superclasse, a seconda delle
esigenze. Per l'esempio postato, puoi tranquillamente dichiararla come
MioServizioStrabello.
Se non ricordo male "var" è una "novità" introdotta dal framework 3.5,
non so se VS2005 lo supporti.

Ciqo,
Giulio

--


title: come si testa un windows service ?

text:
Ciao neroMalpelo,

On 21/10/2011 16:46, neroMalpelo wrote:
> scusate, ho il seguente codice per fare una app da console ma non me lo
> fa compilare e mi dice che
> "Errore 1 Il tipo o il nome dello spazio dei nomi 'ServiceProcess' non
> esiste nello spazio dei nomi 'System'; probabilmente manca un
> riferimento a un assembly"

> **************
>
> using System.Collections.Generic;
> using System.Text;
> using System.ComponentModel;
> using System.Data;
> using System.Diagnostics;
> using System.ServiceProcess;
[cut]
> cosa sbaglio ?

Hai importato la libreria system.serviceprocess.dll?

Ciao,
Giulio

--


title: WPF controllo Popup

author: Fabio

text:
Salve a tutti
Vorrei realizzare una autocompletetextbox ed ho utilizzato una textbox
e un popup. Il popup contiene una listbox che a sua volta contiene i
dati. Funziona tutto tranne la selezione con il mouse.
In sostanza ho mantenuto il focus sempre sulla textbox e poi ho
gestito la pressione dei tasti per spostarmi nella listbox. Quando
clicco sull'item della listbox con il mouse mi si chiude il popup (con
quel click attivo la listbox ed avendo impostato la chiusura del popup
al click, non ottendo la selezione desiderata).
Saluti
Fabio


title: WPF controllo Popup

text:

Ho risolto utilizzando l'HitTest della listbox:
        private void lbListaNomi_PreviewMouseMove(object sender,
MouseEventArgs e)
        {
            Point pt = e.GetPosition((UIElement)sender);
            HitTestResult hr = VisualTreeHelper.HitTest(lbListaNomi,
pt);
            if (hr != null)
            {
                FrameworkElement elemento = hr.VisualHit as
FrameworkElement;
                while ((elemento is ListBoxItem) == false && elemento !
= null)
                {
                    elemento = VisualTreeHelper.GetParent(elemento) as
FrameworkElement;
                }
                if (elemento != null)
                {
                    tbClienti cliente = (elemento as
ListBoxItem).Content as tbClienti;
                    int i = lbListaNomi.Items.IndexOf(cliente);
                    lbListaNomi.SelectedIndex = i;
                }
            }
        }
Saluti
Fabio


title: MSBuild: come editare i files?

text:
Ciao a tutti,
sto iniziando a studiare "bene" MSBuild e ho bisogno che qualcuno
risponda a una domanda da novizio: come editate i files MSBuild?
Ciao,
Giulio
--


title: MSBuild: come editare i files?

text:

Ciao Giulio,
Visto che i file di MSBuild sono semplici documenti XML e' sufficiente
avere un editor XML in grado almeno di riconoscere gli XML Schema in
modo da avere il supporto durante la digitazione. E' possibile
utilizzare direttamente Visual Studio che offre automaticamente
l'Intellisense.
Il file di schema core di msbuild si trova al seguente path:
"C:\Program Files\Microsoft Visual Studio 10.0\Xml\Schemas\1033\MSBuild
\Microsoft.Build.Core.xsd"


title: [WPF] Ridimensionamento componente tree e datatemplate di un tree item

author: marcosabba

text:
Salve a tutti, mi presento: Marco Sabatini, sviluppatore c# e collega
del "più famoso" Giulio Petrucci.
Come da oggetto, mi sono imbattuto nella necessità di usare per diverse
parti di un progetto uno stesso componente di terze parti che è
all'incirca un adattamento di un TreeView per un uso più agevole di
MVVM, chiamiamolo TreeViewEditor.
Nel mio caso ho quindi diverse View che includono questo TreeViewEditor
popolato con dati diversi, aggiungendo poi altre properties, e per
rendere la cosa più generica possibile, i treeviewitems usano un
templateselector che selezione datatemplates diversi a seconda del
viewmodel che vogliono visualizzare.
Uno di questi datatemplates include una grid la cui ultima colonna è un
textbox, e il mio obbiettivo è quello di fare il resize automatico della
textbox al ridimensionamento della finestra che contiene tutta la treeview.
In un caso precedente ero riuscito a fare la cosa, senza datatemplates
però, in un modo simile:
<!-- all'interno di uno HierarchicalDataTemplate... -->
<Grid Name="SlotFieldGrid" Width="{Binding
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type
UserControl}}, Path=GridWidth}"> <!-- etc etc -->
dove GridWidth è la property che aggiorno quando avviene l'evento
SizeChanged della finestra contenitore, e
static DependencyProperty GridWidthProperty =
DependencyProperty.Register("GridWidth", typeof(double),
typeof(ActionListView), new PropertyMetadata(OnGridWidthChanged));
//...
public double GridWidth
{
	get { return (double)GetValue(GridWidthProperty); }
	set { SetValue(GridWidthProperty, value); }
}
Il tutto mi funzionava perché la FindAncestor trova per l'appunto una
ActionListView, riesce a bindare GridWidth e aggiorna la Wifth della
grid di conseguenza.
Nel nuovo caso, nel datatemplate il FindAncestor trova invece il
componente TreeViewEditor, e non la view che lo include, in cui potrei
definire la famigerata GridWidth da bindare, quindi il meccanismo non
funziona.
La mia domanda è: posso "aggiungere" a un componente terzo una property
come la mia GridWidth senza modificarne il sorgente, cioè senza andare
ad aggiungere fisicamente la property alla sua classe?
Oppure come risolvere la cosa?
Chiedo scusa per la prolissità, la sintesi non è il mio forte :/


text:
Il 20/12/2010 16:17, marcosabba ha scritto:
> Nel nuovo caso, nel datatemplate il FindAncestor trova invece il
> componente TreeViewEditor, e non la view che lo include, in cui potrei
> definire la famigerata GridWidth da bindare, quindi il meccanismo non
> funziona.
Per il momento ho risolto inserendo nello xaml che contiene il
datatemplate che deve essere usato la visibilità del namespace della
view che contiene la property GridWidth, che infatti viene bindata
perché FindAncestor ricerca esattamente lo stesso tipo di quella view,
(e uso GridWidth come Path), e la Width della grid si ridimensiona a dovere.
Poi probabilmente c'è qualche soluzione più elegante, però, visto che il
datatemplate è specifico per quella view particolare, non ci ho visto
nulla di male nell'usare un FindAncestor così "diretto".
Ciao


title: intercettare il  valore di una cella  di una riga selezionata da una ListView

author: giulio

text:
Ciao,
scusate la domanda...un po' banale...
come faccio ad intercettare, dall' esterno il valore di una cella
appartenente ad una riga selezionata in una ListView?
In pratica ho una ListView con i campi:
id, news, ....
nella ListView ho attivo solo il LinkButton con il Command impostato a
select.
cosi:
<asp:LinkButton ID="LinkButton2" runat="server" CommandName="Select"
OnCommand="CommandBtn_Click" >Codice:
                            <asp:Label ID="NewsIdLabel" runat="server"
Text='<%# Eval("NewsId") %>' />

                            Data:
                            <asp:Label ID="DataLabel" runat="server"
Text='<%# Eval("Data") %>' />

                            Titolo:
                            <asp:Label ID="TitoloLabel" runat="server"
Text='<%# Eval("Titolo") %>' />

                            </asp:LinkButton>
ora, ho in un panel separato il pulsante "modifica" (vedi:
http://dev.mikaelsoderstrom.se/scripts/jquery/ribbon/
)
il mio problema, č passare l' Id della riga selezionata ad un altra pagina
nel momento in cui viene premuto il link "modifica", pagina in cui vi č una
DetailsView da usare per modificare i dati.
Spero di essere riuscito a spiegarmi.
Grazie 100000 in anticipo.


author: LudovicoVan

text:
On Sunday, January 30, 2011 6:27:50 PM UTC, giulio wrote:
>
> id, news, ....
> nella ListView ho attivo solo il LinkButton con il Command impostato a
> select.
> cosi:
>
> <asp:LinkButton ID="LinkButton2" runat="server" CommandName="Select"
> OnCommand="CommandBtn_Click" >Codice:
>                             <asp:Label ID="NewsIdLabel" runat="server"
> Text='<%# Eval("NewsId") %>' />
>
>
>                             Data:
>                             <asp:Label ID="DataLabel" runat="server"
> Text='<%# Eval("Data") %>' />
>
>
>                             Titolo:
>                             <asp:Label ID="TitoloLabel" runat="server"
> Text='<%# Eval("Titolo") %>' />
>
> <hr />
>
>                             </asp:LinkButton>
>
> ora, ho in un panel separato il pulsante "modifica" (vedi:
>
http://dev.mikaelsoderstrom.se/scripts/jquery/ribbon/
> )
>
> il mio problema, ï¿½ passare l' Id della riga selezionata ad un altra pagina
> nel momento in cui viene premuto il link "modifica", pagina in cui vi ï¿½ una
> DetailsView da usare per modificare i dati.
D'acchitto mi viene da dire che potresti fare un post-back dal pulsante modifica, dopodiche' nel code-behind puoi leggere i valori della riga selezionata correntemente nella listbox, e con quelli poi fare, per esempio (e' probabilmente il modo piu' semplice), un redirect con l'ID nella query string...
-LV


text:
"LudovicoVan"  ha scritto nel messaggio
news:94f995a0-29b3-4488...@glegroupsg2000goo.googlegroups.com...
On Sunday, January 30, 2011 6:27:50 PM UTC, giulio wrote:
>
> id, news, ....
> nella ListView ho attivo solo il LinkButton con il Command impostato a
> select.
> cosi:
>
> <asp:LinkButton ID="LinkButton2" runat="server" CommandName="Select"
> OnCommand="CommandBtn_Click" >Codice:
>                             <asp:Label ID="NewsIdLabel" runat="server"
> Text='<%# Eval("NewsId") %>' />
>
>
>                             Data:
>                             <asp:Label ID="DataLabel" runat="server"
> Text='<%# Eval("Data") %>' />
>
>
>                             Titolo:
>                             <asp:Label ID="TitoloLabel" runat="server"
> Text='<%# Eval("Titolo") %>' />
>
> <hr />
>
>                             </asp:LinkButton>
>
> ora, ho in un panel separato il pulsante "modifica" (vedi:
>
http://dev.mikaelsoderstrom.se/scripts/jquery/ribbon/
> )
>
> il mio problema, ďż˝ passare l' Id della riga selezionata ad un altra
> pagina
> nel momento in cui viene premuto il link "modifica", pagina in cui vi ďż˝
> una
> DetailsView da usare per modificare i dati.
D'acchitto mi viene da dire che potresti fare un post-back dal pulsante
modifica, dopodiche' nel code-behind puoi leggere i valori della riga
selezionata correntemente nella listbox, e con quelli poi fare, per esempio
(e' probabilmente il modo piu' semplice), un redirect con l'ID nella query
string...
-LV
Grazie 1000 per la risposta(č una ListView)....ma come faccio:
" potresti fare un post-back dal pulsante modifica, dopodiche' nel
code-behind puoi leggere i valori della riga selezionata correntemente nella
listview"
Grazie 100000


text:
On Sunday, January 30, 2011 8:03:34 PM UTC, giulio wrote:
> [...] come faccio:
> " potresti fare un post-back dal pulsante modifica, dopodiche' nel
> code-behind puoi leggere i valori della riga selezionata correntemente nella
> listview"
Guarda, fra le altre, le proprieta' SelectedIndex e SelectedValue di ListView sulla documentazione (e gli esempi riportati). Cosa esattamente fare dipende dai dettagli della tua pagina e di come costruisci la ListView. Altra cosa, potresti cercare "
asp.net
 listview selected item" o cose simili: troverai di tutto di piu'...
-LV


title: guida asp.net 2.0

author: binaryMode

text:
Ciao,

su
html.it
 ho torvato una guida su guida
asp.net
 2.0, secondo voi è
sempre valida o conviene cercare una guida più attuale?

grazie


title: WPF Crystal Report viewer per VS 2010

text:
Salve a tutti
Vorrei visualizzare il mio report, ma ho problemi nel reperire il
viewer di crystal report.
Ho installato crystal report per visual studio 2010, ho provato a
visualizzare il controllo che mi interessa, ma anche selezionando la
checkbox del controllo in questione nella lista dei controlli
disponibili per wpf, non lo aggiunge alla mia toolbox. Ho provato a
visualizzare, nella mia toolbox, tutti i controlli ed ho notato che
che il viewer per crystal report sembra disabilitato.
Quali potrebbero essere le cause.
Ciao
Fabio


title: WPF Crystal Report viewer per VS 2010

text:

Ho risolto.
Facendo riferimento a questo link:
http://aspalliance.com/1991_Using_the_New_WPF_Viewer_with_SAP_Crystal_Reports_for_Visual_Studio_2010.2
ho risolto il mio problema.
Saluti e Buon Anno
Fabio


title: [wpf] Eseguire un comando dal doppio click su un ListView item

author: Giulio Petrucci

text:
Ciao a tutti,

ho una listview che contiene una lista di clienti.
Vorrei che al doppio click su un item della list view venga scatenato un
comando (che poi dovrebbe essere eseguito dalla shell dell'applicazione
che apre una tab con i dettagli del cliente). On-line ho trovato solo
esempi che gestiscono l'evento nel code behind della view... ed è una
strada che vorrei stra-evitare. Qualcuno può darmi qualche dritta?

Grazie e buona giornata/settimana,
Giulio

--


text:
Ciao Giulio,

You wrote on 26/08/2013 :
> ho una listview che contiene una lista di clienti.
> Vorrei che al doppio click su un item della list view venga scatenato un
> comando (che poi dovrebbe essere eseguito dalla shell dell'applicazione che
> apre una tab con i dettagli del cliente). On-line ho trovato solo esempi che
> gestiscono l'evento nel code behind della view... ed ï¿œ una strada che vorrei
> stra-evitare. Qualcuno puï¿œ darmi qualche dritta?

dentro Radical c'ï¿œ un behavior per WPF che fa esattamente quello, puoi
o usare Radical o "scopiazzarti" come ï¿œ fatto, se non ricordo male sta
in una classe che si chiama ListViewManager

.m

--
blog @ //
milestone.topics.it


text:
Ciao Mauro,

On 26/08/2013 14.11, Mauro Servienti [MVP] wrote:
> dentro Radical c'è un behavior per WPF che fa esattamente quello, puoi o
> usare Radical o "scopiazzarti" come è fatto, se non ricordo male sta in
> una classe che si chiama ListViewManager

Ottimo!
Lo prendo come spunto anche per imparare qualcosa in più sui behaviour.
:-)

Grazie,
Giulio

--


text:
Ciao Giulio,

You wrote on 26/08/2013 :
>> dentro Radical c'ï¿œ un behavior per WPF che fa esattamente quello, puoi o
>> usare Radical o "scopiazzarti" come ï¿œ fatto, se non ricordo male sta in
>> una classe che si chiama ListViewManager
>
> Ottimo!
> Lo prendo come spunto anche per imparare qualcosa in piï¿œ sui behaviour.
> :-)

giï¿œ il fatto che tu lo dica all'inglese ï¿œ grave :-D

--
blog @ //
milestone.topics.it


text:
Ciao Mauro,

On 26/08/2013 14.18, Mauro Servienti [MVP] wrote:
> già il fatto che tu lo dica all'inglese è grave :-D

D'oh!!!
:-D

Ciao,
Giulio

--


title: VS2010 e MVVM

author: Mauro Gamberini

text:
Volendolo provare MVVM, ho scaricato
WPF M-V-VM Toolkit 0.1
Ho visto che il template viene installato
sulla versione 2008 di VS. Poco male,
importo poi la soluzione in VS2010.
E' normale o sbaglio qualcosa io?
Grazie.
---------------------------
Mauro Gamberini
Microsoft MVP - Excel
http://www.riolab.org/
http://www.maurogsc.eu/


title: VS2010 e MVVM

author: Andrea Saltarello

text:
Il 27/06/2011 10:16, Mauro Gamberini ha scritto:
> E' normale o sbaglio qualcosa io?
non conosco il toolkit che citi, ma ti consiglio di utilizzare MVVM
Light Toolkit:
http://mvvmlight.codeplex.com/
Di fatto � quello pi� utilizzato, quindi quello con la maggior
disponibilit� di: tutorial, supporto...
--
.A
GUISA -
http://www.guisa.org
UGIdotNET -
http://www.ugidotnet.org
Read my blog at:
http://blogs.ugidotnet.org/pape


title: VS2010 e MVVM

text:
"Andrea Saltarello"  ha scritto nel messaggio
news:iu9kfs$6a8$1...@tdi.cu.mi.it...
Il 27/06/2011 10:16, Mauro Gamberini ha scritto:
> E' normale o sbaglio qualcosa io?
non conosco il toolkit che citi, ma ti consiglio di utilizzare MVVM
Light Toolkit:
http://mvvmlight.codeplex.com/
Di fatto � quello pi� utilizzato, quindi quello con la maggior
disponibilit� di: tutorial, supporto...
**************************************
Ok, grazie.
Buon lavoro.



title: Ma come funziona il lock?

text:
Ciao a tutti,
discutendo con dei colleghi su come rendere thread-safe delle regioni
critiche mi sono imbattuto in una situazione del genere:
public class Foo
{
	protected object _synch;
	public A()
	{
		lock(_synch)
		{
			//sezione critica A
			...
		}
	}
	public B()
	{
		lock(_synch)
		{
			//sezione critica B
			...
		}
	}
}
Se non ho capito male, il lock mi assicura che la sezione critica A non
può essere eseguita in due thread contemporaneamente MA può essere
eseguita in contemporanea con la sezione critica B, giusto? Sbaglio
qualcosa? Qualche riferimento?
Grazie,
Giulio
--


title: Ma come funziona il lock?

text:
Ciao Giulio,

l'esempio è fallace :-)
- primo l'oggetto su cui "locchi" dovrebbe essere "static readonly"
- secondo se usi la stessa risorsa per monitorare A e B allora
serializzi le chiamate anche tra loro.
> Grazie,
> Giulio
.m
--
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @
http://milestone.topics.it
whynot [ at ] topics [ dot ] it


title: Ma come funziona il lock?

text:
Giulio Petrucci wrote:
> Se non ho capito male, il lock mi assicura che la sezione critica A non può
> essere eseguita in due thread contemporaneamente MA può essere eseguita in
> contemporanea con la sezione critica B, giusto? Sbaglio qualcosa? Qualche
> riferimento?
L'informazione di locking è interna a tutti i reference type (se guardi
i sorgenti SSCLI del framework vedi proprio una dword preposta al
locking delle eeclass). Questo è anche il motivo per cui non puoi fare
lock di un valuetype.
Perciò se *l'oggetto* specificato in lock(...) è usato/condiviso da più
parti, ovviamente tutti vanno in coda. In sostanza il "semaforo" è
l'istanza stessa di quell'oggetto.
Condivido quando Mauro dice che readonly sarebbe più indicato, ma posso
anche immaginare scenari nei quali tu hai diverse istanze di lock e
queste vengano switchate al volo. Ad ogni modo sicuramente casi molto
rari.
--
Raffaele Rialdi
http://www.iamraf.net
Weblog:
http://blogs.ugidotnet.org/raffaele
Microsoft MVP profile
https://mvp.support.microsoft.com/profile/raffaele
UGIdotNET -
http://www.ugidotnet.org/


title: Ma come funziona il lock?

text:
Ciao Mauro,
innanzitutto grazie della risposta.
On 2/4/2011 11:10 AM, Mauro Servienti [MVP] wrote:
> - secondo se usi la stessa risorsa per monitorare A e B allora
> serializzi le chiamate anche tra loro.
Perfetto. Considera che lo scenario di riferimento potrebbe essere
simile a questo: un singleton che riceve richieste da più thread e deve
necessariamente "sincronizzarsi".
Grazie,
Giulio
--


title: Ma come funziona il lock?

text:
Ciao Raf,
innanzitutto grazie della risposta.
On 2/4/2011 12:03 PM, Raffaele Rialdi [MVP] wrote:
> L'informazione di locking è interna a tutti i reference type (se guardi
> i sorgenti SSCLI del framework vedi proprio una dword preposta al
> locking delle eeclass). Questo è anche il motivo per cui non puoi fare
> lock di un valuetype.
Detta così mi pare una cosa un po' astratta. Comunque sto scaricando i
sorgenti proprio ora. Dove devo guardare di preciso? Sai, i sorgenti del
fw sono abbastanza "ampi"... ;-)
> Perciò se *l'oggetto* specificato in lock(...) è usato/condiviso da più
> parti, ovviamente tutti vanno in coda. In sostanza il "semaforo" è
> l'istanza stessa di quell'oggetto.
Perfetto.
> Condivido quando Mauro dice che readonly sarebbe più indicato, ma posso
> anche immaginare scenari nei quali tu hai diverse istanze di lock e
> queste vengano switchate al volo. Ad ogni modo sicuramente casi molto rari.
Si, be'... diciamo così: N istanze di una classe devono essere thread
safe su uno stesso oggetto da lockare (e magari altre M devono esserlo
su un altro oggetto).
Comunque grazie delle dritte,
Giulio
--


title: Ma come funziona il lock?

text:
Giulio Petrucci wrote:
> Ciao Raf,
>
> innanzitutto grazie della risposta.
prego,
> Detta così mi pare una cosa un po' astratta. Comunque sto scaricando i
> sorgenti proprio ora. Dove devo guardare di preciso? Sai, i sorgenti del fw
> sono abbastanza "ampi"... ;-)
questa parte è nei sorgenti del clr, quindi devi scaricarti sscli.
Il sorgente è syncblk.h dove trovi la classe c++ ObjHeader, il cui nome
è decisamente autoesplicativo :)
Lì trovi la DWORD m_SyncBlockValue che fa la "magia":
DWORD  m_SyncBlockValue;
A controprova, se prendi il sorgente object.h che è ovviamente il
sorgente di object, vedrai che il metodo per prendere 'l header è
negativo:
return PTR_ObjHeader(PTR_HOST_TO_TADDR(this) - sizeof(ObjHeader));
E ancora che da object per ottenere il syncblock usa l'header:
SyncBlock *GetSyncBlock() {...}
> Si, be'... diciamo così: N istanze di una classe devono essere thread safe su
> uno stesso oggetto da lockare (e magari altre M devono esserlo su un altro
> oggetto).
>
> Comunque grazie delle dritte,
> Giulio
Esatto... prego, ciao



title: Ma come funziona il lock?

text:
Ciao Raf,
On 2/4/2011 3:28 PM, Raffaele Rialdi [MVP] wrote:
> questa parte è nei sorgenti del clr, quindi devi scaricarti sscli.
Fatto.
> Il sorgente è syncblk.h dove trovi la classe c++ ObjHeader, il cui nome
> è decisamente autoesplicativo :)
Trovato.
> Lì trovi la DWORD m_SyncBlockValue che fa la "magia":
> DWORD m_SyncBlockValue;
Uhm... sto prendendo visione.
> A controprova, se prendi il sorgente object.h che è ovviamente il
> sorgente di object, vedrai che il metodo per prendere 'l header è negativo:
> return PTR_ObjHeader(PTR_HOST_TO_TADDR(this) - sizeof(ObjHeader));
> E ancora che da object per ottenere il syncblock usa l'header:
> SyncBlock *GetSyncBlock() {...}
Idem come sopra.
In generale: sarà che il mio C/C++ ha parecchia ruggine, sarà che sono a
fine giornata, ma non ho capito bene come funziona. Avresti mica qualche
link in cui e spiegato una specie di Walkthrough attraverso il fw? ;-)
Grazie,
Giulio
--