Applicazione si chiude da sola

di il
23 risposte

Applicazione si chiude da sola

Ciao a tutti,
Ho creato un' applicazione c# che continuamente esegue una serie di operazioni tramite un ciclo while (true).
Capita che questa applicazione si chiuda senza un apparente motivo.
C'e' un modo per monitorarla e capire se c'e' un'eccezione non gestita utilizzando il file compilato?
Il codice e' troppo lungo per postarlo

Grazie

23 Risposte

  • Re: Applicazione si chiude da sola

    "C'e' un modo per monitorarla e capire se c'e' un'eccezione non gestita utilizzando il file compilato?"
    che io sappia no ma questo non vuol dire che non esista il modo

    "Il codice e' troppo lungo per postarlo"
    sei sicuro? sarebbe l'unico modo per capire forse qualcosa in più...

    se hai il codice sorgente fai prima a mettere dei try catch e scrivere eventuali errori su un file di testo
  • Re: Applicazione si chiude da sola

    Se gli strumenti Try catch, non rilevano eccezioni, ma il programma si chiude, puoi monitorare il flusso del tuo programma salvando in un file testo (MioLog.txt) i passaggi che sta eseguendo.
    Per esempio prima del ciclo while, appendi al file MioLog.txt una riga con data ora e "inizio while...", anche il contenuto delle variabili cruciali che ritieni opportune monitorare.
    Alla fine del ciclo while, appendi al file MioLog.txt una riga con data ora e "fine while...", ed eventuali risultati utili al monitoraggio.
    Il file MioLog.txt è utile scriverlo:
    Quando si apre il programma
    quando si prendono decisioni che cambiano il flusso del programma
    si controllano gli input dell'utente
    si inizia una routine (avrai delle sorprese su quante volte vengono eseguite routine inutili o più volte di quelle previste)
    si creano percorsi o stringhe concatenate
    si leggono dei valori
    si chiude il programma
    ecc.

    nei miei programmi uso:
    
            private void MioDebug(string Messaggio)
            {
                if (MioDebugON == false) // con MioDebugON = False la subroutine non viene eseguita
                {
                    return;
                }
                string PercorsoLog = Application.StartupPath + "\\MioLog.txt";
                string MioLog = DateTime.Now.ToString() + " - " + Messaggio + Environment.NewLine; // compongo il messaggio con data e ora
                File.AppendAllText(PercorsoLog, MioLog);
             }
    
    devi dichiarare bool MioDebugON = true; (comodo per attivare disattivare il log)

    esempio di chiamate:

    MioDebug("! Programma avviato");
    MioDebug("! Riordinamento di " + iIndici + " iniziato);
    MioDebug("! Riordinamento di " + iIndici + " terminato);
    MioDebug("= l'utente ha immesso il codice ID= " + iCodiceID + " codice accettato");
    MioDebug("? l'utente ha immesso il codice ID= " + iCodiceID + " codice fuori range");

    Così hai il tuo debug in linea, e controlli come viene usato il tuo programma, anche fuori dall'ambiente VisualStudio, senza chiedere nulla a nessuno.
  • Re: Applicazione si chiude da sola

    82_marco ha scritto:


    Ciao a tutti,
    Ho creato un' applicazione c# che continuamente esegue una serie di operazioni tramite un ciclo while (true).
    Capita che questa applicazione si chiuda senza un apparente motivo.
    Probabilmente da qualche parte c'è un salto fuori dal ciclo.
    Vai in debug e metti un breakpoint dopo il ciclo.
  • Re: Applicazione si chiude da sola

    Rubik ha scritto:


    Se gli strumenti Try catch, non rilevano eccezioni, ma il programma si chiude, puoi monitorare il flusso del tuo programma salvando in un file testo (MioLog.txt) i passaggi che sta eseguendo.
    Per esempio prima del ciclo while, appendi al file MioLog.txt una riga con data ora e "inizio while...", anche il contenuto delle variabili cruciali che ritieni opportune monitorare.
    Alla fine del ciclo while, appendi al file MioLog.txt una riga con data ora e "fine while...", ed eventuali risultati utili al monitoraggio.
    Il file MioLog.txt è utile scriverlo:
    Quando si apre il programma
    quando si prendono decisioni che cambiano il flusso del programma
    si controllano gli input dell'utente
    si inizia una routine (avrai delle sorprese su quante volte vengono eseguite routine inutili o più volte di quelle previste)
    si creano percorsi o stringhe concatenate
    si leggono dei valori
    si chiude il programma
    ecc.

    nei miei programmi uso:
    
            private void MioDebug(string Messaggio)
            {
                if (MioDebugON == false) // con MioDebugON = False la subroutine non viene eseguita
                {
                    return;
                }
                string PercorsoLog = Application.StartupPath + "\\MioLog.txt";
                string MioLog = DateTime.Now.ToString() + " - " + Messaggio + Environment.NewLine; // compongo il messaggio con data e ora
                File.AppendAllText(PercorsoLog, MioLog);
             }
    
    devi dichiarare bool MioDebugON = true; (comodo per attivare disattivare il log)

    esempio di chiamate:

    MioDebug("! Programma avviato");
    MioDebug("! Riordinamento di " + iIndici + " iniziato);
    MioDebug("! Riordinamento di " + iIndici + " terminato);
    MioDebug("= l'utente ha immesso il codice ID= " + iCodiceID + " codice accettato");
    MioDebug("? l'utente ha immesso il codice ID= " + iCodiceID + " codice fuori range");

    Così hai il tuo debug in linea, e controlli come viene usato il tuo programma, anche fuori dall'ambiente VisualStudio, senza chiedere nulla a nessuno.
    Ciao,
    Aggiungo il log come mi hai suggerito e ti aggiorno.
    Sono 2 settimane che l'applicazione non si chiude, e' un mistero (e' installata su 2 pc e tutti e 2 funzionano correttamente ora)
  • Re: Applicazione si chiude da sola

    Alka ha scritto:


    82_marco ha scritto:


    Ciao a tutti,
    Ho creato un' applicazione c# che continuamente esegue una serie di operazioni tramite un ciclo while (true).
    Capita che questa applicazione si chiuda senza un apparente motivo.
    Probabilmente da qualche parte c'è un salto fuori dal ciclo.
    Vai in debug e metti un breakpoint dopo il ciclo.
    Ciao, non ho comandi di chiusura applicazione, il ciclo e' su un background worker, anche se esce dal ciclo mi dovrebbe rimanere l'interfaccia grafica aperta?
  • Re: Applicazione si chiude da sola

    82_marco ha scritto:


    il ciclo e' su un background worker, anche se esce dal ciclo mi dovrebbe rimanere l'interfaccia grafica aperta?
    Teoricamente sì. Non potevo darlo per scontato perché non avevi specificato si trattasse di una Windows Forms.
    Attenzione che, per chiudere l'applicazione è sufficiente una Close() sul Form principale del programma.

    Credo comunque che sia più probabile un accesso contemporaneo a risorse da più thread o qualcosa legato alla sincronizzazione degli accessi a qualcosa condiviso tra l'applicazione stessa e il BW... quando si entra nell'ambito del multithreading, in presenza di un difetto i risultati sono imprevedibili e possono verificarsi in modo sempre diversi.
  • Re: Applicazione si chiude da sola

    Alka ha scritto:


    82_marco ha scritto:


    il ciclo e' su un background worker, anche se esce dal ciclo mi dovrebbe rimanere l'interfaccia grafica aperta?
    Teoricamente sì. Non potevo darlo per scontato perché non avevi specificato si trattasse di una Windows Forms.
    Attenzione che, per chiudere l'applicazione è sufficiente una Close() sul Form principale del programma.

    Credo comunque che sia più probabile un accesso contemporaneo a risorse da più thread o qualcosa legato alla sincronizzazione degli accessi a qualcosa condiviso tra l'applicazione stessa e il BW... quando si entra nell'ambito del multithreading, in presenza di un difetto i risultati sono imprevedibili e possono verificarsi in modo sempre diversi.
    Ci sono degli accessi a dei file condivisi con un altro programma, ma gli accessi sono dentro try catch
  • Re: Applicazione si chiude da sola

    Magari prova questo:
    https://www.csharp-examples.net/catching-unhandled-exceptions/
    https://docs.microsoft.com/it-it/dotnet/api/system.appdomain.unhandledexception?view=netcore-3.1
  • Re: Applicazione si chiude da sola

    82_marco ha scritto:


    Ci sono degli accessi a dei file condivisi con un altro programma, ma gli accessi sono dentro try catch
    A mio avviso è una cosa discutibile accedere contemporanemente alla stessa risorsa da due thread diversi ed affidarsi ai try catch, magari il tuo problema non dipende da questo, ma comunque fa pensare.

    Il BackgroundWorker quando viene lanciato gli si può passare un argomento e/o oggetti attraverso "DoWorkEventArgs e", lo ritrovi in e.Argument
    Se BackgroundWorker modifica variabili nel programma chiamante, mentre lavora è bene non accedervi, per fare questo si usa BackgroundWorker1.IsBusy, se true non accedi alla risorsa condivisa.
    Quando BackgroundWorker ha finito, si attiva l'evento BackgroundWorker1.RunWorkerCompleted, in questo evento oltre ad avere la conferma del termine per agire di conseguenza, attraverso "RunWorkerCompletedEventArgs e" si possono ricevere info e/o oggetti con e.Result.
    L'evento deve essere sottoscritto in designer o subito dopo InitializeComponent

    Per usare MioDebug in un BackgroundWorker è bene scrivere il log in file diversi, uno per ogni BackgroundWorker, proprio per evitare conflitti e includere il codice di MioDebug all'interno di ogni BackgroundWorker, o creare una classe apposita.
    Se nei BackgroundWorker hai dei cicli che vuoi monitorare con MioDebug lo puoi fare a campione.
    Il codice seguente non fa nulla di particolare, ma scambia le informazioni tra il programma principale e il BackgroundWorker correttamente e scrive due file: MioLog.txt e Worker1.txt
    
    using System;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.IO;
    
    
    namespace MioDebug
    
    {
        public partial class Form1 : Form
        {
            bool MioDebugON = true;
            BackgroundWorker  backgroundWorker1 = new BackgroundWorker();
    
            public Form1()
            {
                InitializeComponent();
               
                this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.BackgroundWorker1_DoWork);
                this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.BackgroundWorker1_RunWorkerCompleted);
                this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_Closing);
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                MioDebug("! Programma iniziato");
                MioDebug("! backgroundWorker1, lanciato");
    
                backgroundWorker1.RunWorkerAsync(Application.StartupPath + "\\Worker1.txt"); // passo una stringa come argomento, si possono passare anche oggetti
            }
    
            private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                string PercorsoLog = e.Argument.ToString(); // ricevo la stringa come argomento (il nome del file)
                string MioLog = DateTime.Now.ToString() + " - " + "BackgroundWorker1 iniziato" + Environment.NewLine;
                File.AppendAllText(PercorsoLog, MioLog);
    
                for (int cicli = 0; cicli < 50000; cicli++)
                {
                    if (cicli % 1000 == 0) // ogni 1000 cicli scrivo sul file log
                    {
                        MioLog = DateTime.Now.ToString() + " - " + "eseguo il ciclo: " + cicli + Environment.NewLine;
                        File.AppendAllText(PercorsoLog, MioLog);
                    }
                }
                e.Result = "Finito"; // invio una stringa come risultato
                MioLog = DateTime.Now.ToString() + " - " + "BackgroundWorker1 terminato" + Environment.NewLine;
                File.AppendAllText(PercorsoLog, MioLog);
            }
    
            private void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                this.Text = e.Result.ToString(); // ricevo il risultato
                MioDebug("! backgroundWorker1, terminato");
                MioDebug("! controlla l'attivita di backgroundWorker1, in " + Application.StartupPath + "\\Worker1.txt");
            }
    
            private void Form1_Closing(Object sender, FormClosingEventArgs e)
            {
                MioDebug("! Programma chiuso");
            }
    
            private void MioDebug(string Messaggio)
            {
                if (MioDebugON == false) // con MioDebugON = False la subroutine non viene eseguita
                {
                    return;
                }
                string PercorsoLog = Application.StartupPath + "\\MioLog.txt";
                string MioLog = DateTime.Now.ToString() + " - " + Messaggio + Environment.NewLine; // leggo la data e l'ora del computer
                File.AppendAllText(PercorsoLog, MioLog);
            }
        }
    }   
    
  • Re: Applicazione si chiude da sola

    surfernet ha scritto:


    Magari prova questo:
    https://www.csharp-examples.net/catching-unhandled-exceptions/
    https://docs.microsoft.com/it-it/dotnet/api/system.appdomain.unhandledexception?view=netcore-3.1
    Mmm non capisco
  • Re: Applicazione si chiude da sola

    82_marco ha scritto:


    Ciao a tutti,
    Ho creato un' applicazione c# che continuamente esegue una serie di operazioni tramite un ciclo while (true).
    Capita che questa applicazione si chiuda senza un apparente motivo.
    C'e' un modo per monitorarla e capire se c'e' un'eccezione non gestita utilizzando il file compilato?
    Il codice e' troppo lungo per postarlo

    Grazie
    Guarda se l'EventViewver di Windows fornisce qualche informazione.

    Se è un problema di multithreading, come sembrerebbe dal malfunzionamento casuale, diagnosticarla
    è difficile come ti ha spiegato alka proprio perchè non riproducibile ed apparentemente casuale.

    Per provare a farsi un'idea bisognerebbe guardare il codice entrando con la testa in multithreading;
    se è troppo lungo potresti provare a postare solo "l'ossatura" del programma con le parti presumibilmente significative
    ed in particolare quelle che accedono a risorse e/o variabili condivise dai thread
    ( ed un thread principale c'è sempre oltre a quello del BW);
    l'accesso a file condivisi con altri programmi sembrerebbe significativo

    HTH
  • Re: Applicazione si chiude da sola

    Per provare a farsi un'idea bisognerebbe guardare il codice entrando con la testa in multithreading;
    se è troppo lungo potresti provare a postare solo "l'ossatura" del programma con le parti presumibilmente significative
    ed in particolare quelle che accedono a risorse e/o variabili condivise dai thread
    ( ed un thread principale c'è sempre oltre a quello del BW);
    l'accesso a file condivisi con altri programmi sembrerebbe significativo

    HTH
    [/quote]
    using System;
    using System.Collections.Generic;
    using System.Windows.Interop;
    using System.Windows;
    using System.ComponentModel;
    using System.IO;
    using System.IO.Ports;
    using System.Runtime.InteropServices;
    using DizionarioPeriferiche;
    using System.Threading;
    using System.Diagnostics;
    using System.Windows.Threading;
    using System.Globalization;
    
    #region USING SOSPESI
    //using System.Windows.Threading;
    //using System.Data;
    //using System.Net;
    //using System.Text.RegularExpressions;
    //using System.Net.NetworkInformation;
    ////using gestionecomandi;
    //using System.Collections;
    //using System.Text;
    //using System.Xml.Linq;
    //using System.Windows.Media;
    //using System.Threading.Tasks;
    //using System.Linq;
    ////using System.Text;
    ////using System.Windows.Controls;
    ////using System.Windows.Data;
    ////using System.Windows.Documents;
    ////using System.Windows.Input;
    ////using System.Windows.Media;
    ////using System.Windows.Media.Imaging;
    ////using System.Windows.Navigation;
    ////using System.Windows.Shapes;
    ////using Microsoft.Win32;
    
    #endregion
    
    namespace Supervisore
    {
        ///////////////////////////////////////////////////////////////////////1905151830 TOGLIERE ORE E MINUTI
        /// <summary>
        /// Logica di interazione per MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            private SerialPort sp;
            string Versione = "2001081500";
            string ResultTitolo;
            string ResultVers;
            string ResultCOM;
            int ResultVel;
            int ResultTimeOut;
            int MaxErrori;
            List<int> NumeroPeriferiche;
            List<string> comandi;
            List<string> NomeCanOrario;
            string Festintraset;
            int Index;
            int riga;
            string testo;
            string indperiferica;
            GestioneComandi gestionecomandi = new GestioneComandi();
            ObservableDictionary datiperiferica = new ObservableDictionary(); //  Dichiarazione dizionario per immagazzinamento dati periferiche
            PerifericaTipo1 PT1_1 = new PerifericaTipo1();
            PerifericaTipo2 PT2_1 = new PerifericaTipo2();
            PerifericaTipo3 PT3_1 = new PerifericaTipo3();         
            LeggiFileConfigurazione leggifileconf = new LeggiFileConfigurazione();
            Festivita festivita = new Festivita();
            private readonly BackgroundWorker backgroundWorker1 = new BackgroundWorker();
            string[] Colonne;
            int TipoPeriferica;
            string idTipoGiorno = null;
            string idTipoGiornoAbbr = null;
            //           Queue PerifericheDaComandare = new Queue();
            //bool lampeggioAllarme;
            //string NumeroAllarme = null;
            //int ritardoAllarme;
            //string GestioneAllarme = null;
            //  XDocument xmlDoc = null;
            //string pathallarmi;
            //string pathOrari;
            string daticli = @"C:\ARCRETE\DATICLI.TXT";
            string path = @"C:\ARCRETE\";
            string pathset;
            string[] protocolloIn;
            string CodCli;
            string CodLav;
            string RamDisk;
            string pathRisposta; //Protocollo a programma dos
            string pathComando; //Protocollo di comando da programma dos
            string pathSemaforoRIS;
            string pathSemaforoCOM;
            
            DispatcherTimer timerErroreStart = new DispatcherTimer(); //Timer per arresto START.EXE
            int timer = 0;
    
            #region Nasconde i pulsanti ridimensionamento e chiusura finestra
            private const int GWL_STYLE = -16;
            private const int WS_SYSMENU = 0x80000;
            [DllImport("user32.dll", SetLastError = true)]
            private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
            [DllImport("user32.dll")]
            private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
            #endregion
    
            public MainWindow()
            {
                InitializeComponent();
                InizializzaDizionariPeriferiche();
                this.Reset();
                InizializzaSeriale();
                //pathOrari = path + "ORARI.XML";
                //pathallarmi = path + "MESSAGGI.XML";
                //CaricaOrariSuControllo();
                //this.DataContext = this;
            }
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                #region timer
                DispatcherTimer Timer1 = new DispatcherTimer();
                Timer1.Tick += new EventHandler(Timer1_Tick);
                Timer1.Interval = new TimeSpan(0, 0, 0, 0, 1000);
                Timer1.Start();
    
                #endregion
                var hwnd = new WindowInteropHelper(this).Handle; // Nasconde i pulsanti ridimensionamento e chiusura finestra
                SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU); // Nasconde i pulsanti ridimensionamento e chiusura finestra
    
                backgroundWorker1.WorkerSupportsCancellation = true;
                backgroundWorker1.RunWorkerAsync();
                backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
            }
    
            #region Inizializzazione seriale 
            private void InizializzaSeriale()
            {
                try
                {
                    sp = new SerialPort(ResultCOM, ResultVel, Parity.None, 8, StopBits.One);
                    sp.Handshake = Handshake.XOnXOff;
                    sp.NewLine = "\r";
                    sp.ReadTimeout = ResultTimeOut;
                }
                catch (ArgumentException e)
                {
                    MessageBox.Show(e.Message);
                    this.Close();
                }
    
                try
                {
                    sp.Open();
                }
                catch (IOException e)
                {
                    MessageBox.Show(e.Message);
                }
            }
            #endregion
    
            #region Inizializzazione listWiew per visualizzazione stato periferiche
            private void InizializzaRichTextbox()
            {
                System.Text.StringBuilder builder = new System.Text.StringBuilder();
                for (int i = 0; i < NumeroPeriferiche.Count; i++)
                {
                    FinestraProtocolli.Items.Add("P" + (i + 1));
                    PROMPT.Items.Add("");
                }
            }
    
            private delegate void Scrivilabel(string text);
            private void WriteToLabel(string text)
            {
                try
                {
                    label.Content = string.Concat("TS=", text.Substring(6, 6), "s");
                }
                catch { }
            }
    
            // Scrittura protocolli di comunicazione su listView
    
            private delegate void WriteToLineDelegate(int lineNumber, string text);
            private void WriteToLine(int lineNumber, string text)
            {
                try
                {
                    FinestraProtocolli.Items.RemoveAt(lineNumber);
                    for (int i = 0; i < NumeroPeriferiche.Count; i++)
                    {
                        PROMPT.Items.RemoveAt(i);
                        PROMPT.Items.Insert(i, "");
                    }
                    FinestraProtocolli.Items.Insert(lineNumber, "P" + (lineNumber + 1) + "  " + text);
                    PROMPT.Items.RemoveAt(lineNumber);
                    PROMPT.Items.Insert(lineNumber, "¦");
                }
                catch { }
            }
    
            // Svuota la listView
            private delegate void CancellaRichtextbox();
            private void cancellaRichtextbox()
            {
                foreach (int i in NumeroPeriferiche)
                {
                    FinestraProtocolli.Items.RemoveAt(0);
                    PROMPT.Items.RemoveAt(0);
                }
    
            }
            #endregion
    
            #region Inizializzazione dizionari stato periferiche
            private void InizializzaDizionariPeriferiche()
            {
                for (int indper = 0; indper < 128; indper++)
                {
                    datiperiferica[indper] = new DatiPeriferiche();
                    datiperiferica[indper].IngressiDigitali = string.Empty.PadLeft(51, ' ');
                    datiperiferica[indper].UsciteDigitali = string.Empty.PadLeft(8, '0');
                    datiperiferica[indper].IngressoAnalogico1 = string.Empty.PadLeft(4, '0');
                    datiperiferica[indper].IngressoAnalogico2 = string.Empty.PadLeft(4, '0');
                    datiperiferica[indper].IngressoTemperatura1 = string.Empty.PadLeft(4, '0');
                    datiperiferica[indper].IngressoTemperatura2 = string.Empty.PadLeft(4, '0');
                    datiperiferica[indper].Errori = 0;
                }
            }
            #endregion
    
            #region gestione pulsanti SOSPESI
            //private void fasceOrarie_Click(object sender, RoutedEventArgs e)
            //{
            //    //finestraAllarmi1.Visibility = System.Windows.Visibility.Collapsed;
            //    //FinestraProtocolli.Visibility = System.Windows.Visibility.Collapsed;
            //    //FinestraOrari.Visibility = Visibility.Visible;
            //    //fasceOrarie.IsEnabled = false;
            //    //protocolli.IsEnabled = true;
            //    //TacitazioneReset.Visibility = System.Windows.Visibility.Collapsed;
            //    //Visualizzaallarmi.Visibility = System.Windows.Visibility.Visible;
            //    //Aggiorna.Visibility = System.Windows.Visibility.Hidden;
            //}
    
            //private void protocolli_Click(object sender, RoutedEventArgs e)
            //{
            //    //FinestraOrari .Visibility = Visibility.Collapsed;
            //    //fasceOrarie.IsEnabled = true;
            //    //protocolli.IsEnabled = false;
            //    //TacitazioneReset.Visibility = System.Windows.Visibility.Collapsed;
            //    //Visualizzaallarmi.Visibility = System.Windows.Visibility.Visible;
            //    //finestraAllarmi1.Visibility = System.Windows.Visibility.Collapsed;
            //    //FinestraProtocolli.Visibility = System.Windows.Visibility.Visible;
            //    //Aggiorna.Visibility = System.Windows.Visibility.Visible;
            //}
    
    
            private void Visualizzaallarmi_Click(object sender, RoutedEventArgs e)
            {
                //    //FinestraOrari.Visibility = Visibility.Collapsed;
                //    //FinestraProtocolli.Visibility = System.Windows.Visibility.Collapsed;
                //    //fasceOrarie.IsEnabled = true;
                //    //protocolli.IsEnabled = true;
                //    //Visualizzaallarmi.Visibility = System.Windows.Visibility.Collapsed;
                //    //VisualizzaFinestraAllarmi();
                //    //Aggiorna.Visibility = System.Windows.Visibility.Hidden;
            }
    
            private void Aggiorna_Click(object sender, RoutedEventArgs e)
            {
                //    //Password Password = new Password();
                //    //Password.ShowDialog();
                //    //if (Password.dummyString == "123")
                //    //{
                //    //    numperif = new List<int>();
                //    //    TipoPeriferica = 0;
                //    //    Index = 0;
                //    //    Colonne = null;
                //    //    this.Reset();
                //    //}
                //    //else if (Password.dummyString == null)
                //    //{ }
                //    //else
                //    //{
                //    //    MessageBoxResult key = MessageBox.Show("PASSWORD ERRATA", "confirm", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                //    //}
            }
            #endregion
    
            #region GESTIONE PULSANTI
            private void exit_Click(object sender, RoutedEventArgs e)
            {
                MessageBoxResult key = MessageBox.Show("Sei sicuro di volere uscire?", "confirm", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No);
                if (key == MessageBoxResult.Yes)
                {
                    this.Close();
                }
                else
                { }
            }
            private void mostraIP_Click(object sender, RoutedEventArgs e)
            {
                Window1 aaa = new Window1();
                aaa.ShowDialog();
            }
            private void about_Click(object sender, RoutedEventArgs e)
            {
                About aboutWindow = new About(ResultVers, Versione, ResultTitolo);
                aboutWindow.ShowDialog();
            }
            private void TacitazioneReset_Click(object sender, RoutedEventArgs e)
            {
                //    finestraAllarmi1.Tacitazione();
                //    int numeroallarmi = finestraAllarmi1.numeroallarmi;
                //    lampeggioAllarme = false;
    
                //    if (numeroallarmi == 0)
                //    {
                //        ///////////////////////////// textBox1.Background = Brushes.LightGray;
                //    }
                //    else
                //    {
                //        //////////////////////////////  textBox1.Background = Brushes.Red;
                //    }
                cancellaRichtextbox();
                this.Reset();
            }
            #endregion
    
            #region EFDF
            //public void VisualizzaFinestraAllarmi()
            //{
            //TacitazioneReset.Visibility = System.Windows.Visibility.Visible;              
            //finestraAllarmi1.Visibility = System.Windows.Visibility.Visible;
            //}
            //public string Titolo
            //{
            //    get
            //    {
            //        return ResultTitolo;
            //    }
            //}
            #endregion
            private delegate void RESET();
            public void Reset()
            {
                #region bbb
                //if (!File.Exists(pathOrari))
                //{
                //    MessageBoxResult dlgResult = MessageBox.Show("MANCA IL FILE " + pathOrari + ", RIAVVIARE IL PROGRAMMA", "", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.No);
                //    if (dlgResult == MessageBoxResult.OK)
                //    {
                //        Application.Current.Shutdown();
                //        this.Close();
                //    }
                //    else
                //    { }
                //}
                //else
                //{ }
    
                //if (!File.Exists(pathallarmi))
                //{
                //    MessageBoxResult dlgResult = MessageBox.Show("MANCA IL FILE " + pathallarmi + ", RIAVVIARE IL PROGRAMMA", "", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.No);
                //    if (dlgResult == MessageBoxResult.OK)
                //    {                  
                //        this.Close();
                //    }
                //    else
                //    { }
                //}
                //else
                //{ }
                #endregion
    
    
                //Lettura file daticli
                if (!File.Exists(daticli))
                {
                    MessageBoxResult dlgResult = MessageBox.Show("MANCA IL FILE " + daticli + ", RIAVVIARE IL PROGRAMMA", "", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.No);
                    if (dlgResult == MessageBoxResult.OK)
                    {
                        Environment.Exit(0);
                        //         this.Close();
                    }
                    else
                    { }
                }
                else
                {
                    string[] daticli1 = File.ReadAllLines(daticli);
                    CodCli = daticli1[0].Substring(1, 6).Trim();
                    CodLav = daticli1[0].Substring(7, 6).Trim();
                    pathset = string.Concat(path, CodCli, "\\", CodLav, "\\ARCHIVI\\SET.TXT");
                    RamDisk = daticli1[0].Substring(13, 1);
                    pathRisposta = string.Concat(RamDisk, ":\\RISPOSTA.TXT"); //Protocollo a programma dos
                    pathComando = string.Concat(RamDisk, ":\\COMANDO.TXT"); //Protocollo di comando da programma dos
                    pathSemaforoRIS = string.Concat(RamDisk, ":\\SEMRIS.TXT"); //FILE SEMAFORO RISPOSTA
                    pathSemaforoCOM = string.Concat(RamDisk, ":\\SEMCOM.TXT"); //FILE SEMAFORO COMANDO
                }
    
                if (File.Exists(pathSemaforoCOM))
                {
                    File.Delete(pathSemaforoCOM);
                }
                if (File.Exists(pathComando))
                {
                    try
                    {
                        File.Delete(pathComando);
                    }
                    catch { }
                }
                if (File.Exists(pathRisposta))
                {
                    try
                    {
                        File.Delete(pathRisposta);
                    }
                    catch { }
                }
                if (File.Exists(pathSemaforoRIS))
                {
                    try
                    {
                        File.Delete(pathSemaforoRIS);
                    }
                    catch { }
                }
    
                NumeroPeriferiche = new List<int>();
                if (!File.Exists(pathset))
                {
                    MessageBoxResult dlgResult = MessageBox.Show("MANCA IL FILE " + pathset + ", RIAVVIARE IL PROGRAMMA", "", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.No);
                    if (dlgResult == MessageBoxResult.OK)
                    {
                        Environment.Exit(0);
                        //this.Close();
                    }
                    else
                    { }
                }
                else
                {
                    leggifileconf.caricafile(Index, NumeroPeriferiche, out comandi, out Colonne, out NomeCanOrario, pathset, out ResultCOM, out ResultVel, out ResultTimeOut, out ResultVers, out ResultTitolo, out MaxErrori, out Festintraset);
                }
    
                InizializzaRichTextbox();
                protocolloIn = new string[NumeroPeriferiche.Count + 1];
    
                // Reset errori di comunicazione periferiche
                for (int i = 0; i < 128; i++)
                {
                    datiperiferica[i].Errori = 0;
                }
    
                #region aaa
                //finestraAllarmi1.pathAllarmi = pathallarmi;
                //VisualizzaFinestraAllarmi();
                //Visualizzaallarmi.Visibility = System.Windows.Visibility.Collapsed;
                //Aggiorna.Visibility = System.Windows.Visibility.Collapsed;
                //FinestraProtocolli.Visibility = System.Windows.Visibility.Collapsed;
                //FinestraOrari.Visibility = System.Windows.Visibility.Collapsed;
                //protocolli.IsEnabled = true;
                //InizializzaCAnaleOrario();
                #endregion
    
                // Leggi il valore del timer dal file INI
                string iniFileName = Path.Combine(Environment.CurrentDirectory, "Supervisore.ini");
                var fileIni = new IniParser(iniFileName);
                timer = fileIni.IRestorePref("Settings", "Timer", 30); //Sezione, variabile, valore di default
    
                //Inibizione chiusura finestre
                InibizioneChiusuraFinestre BLFinestre = new InibizioneChiusuraFinestre();
                string temp = "";
                for (int i = 0; i < 10; i++)
                {
                    temp = fileIni.SRestorePref("Programmi", "Programma" + i.ToString(), ""); //Sezione, variabile, valore di default
                    if (temp.Length != 0)
                    {
                        BLFinestre.BloccoFinestre(temp);                    
                    }
                }
            }
            private void TimerErroreStart_Tick(object sender, EventArgs e) //Evento causato dall'arresto dello START.EXE
            {
                ////LOG log = new LOG();
                ////log.Log();
                //ShowMessageBox();//Richiama messagebox senza arrestare l'esecuzione del programma
                //Close();
            }
            public void ShowMessageBox()
            {
                var thread = new Thread(
                  () =>
                  {
                      MessageBox.Show("CHIUSURA PROGRAMMA PER TIMEOUT RISPOSTA DA START.EXE");
                  });
                thread.Start();
            }
    
            string oggi = "oggi";
            string GiornoPrec = "GiornoPrec";
            private void Timer1_Tick(object sender, EventArgs e) //Aggiornamento data/ora
            {
                oggi = DateTime.Now.ToString("dddd", new CultureInfo("it-IT"));
                if (oggi != GiornoPrec)
                {
                    festivita.CalcoloTipoGiorno(Festintraset, oggi, out idTipoGiorno, out idTipoGiornoAbbr);
                    //        AssTipoGiorno(idTipoGiorno);
                    GiornoPrec = oggi;
                }                 
                DataOra.Content = DateTime.Now.ToLongTimeString() + "\n" + DateTime.Now.ToShortDateString() + " " + idTipoGiornoAbbr; //Data e Ora visualizzata a video
    
                //    ControlloCanOrario(DateTime.Now); //////////////VERIFICARE LA FUNZIONE DI QUESTO COMANDO EVENTUALMENTE SPOSTARLO DENTRO IF OGGI != GIORNOPREC
            }
    
            // Gestione comunicazione seriale ed attuazione comandi
            int NMaxProve = 1;
            //  int a = 0;
            int b = 0;
    
            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                timerErroreStart.Tick += new EventHandler(TimerErroreStart_Tick);
                timerErroreStart.Interval = new TimeSpan(0, 0, 0, timer, 0);
    
                Stopwatch stopWatch = new Stopwatch();
                int err1 = 0;
                int err2 = 0;
    
                while (true)
                {
                    err1 = 0;
                    err2 = 0;
                    Thread.Sleep(1);
    
                    #region Lettura e trattamento periferiche               
                    if (File.Exists(pathSemaforoCOM) && File.Exists(pathComando)) //controllo se ci sono comandi da attuare
                    {
                        string[] sComando = null;////////////////
                        int p = 0;///////////////////
                        try
                        {
                            sComando = File.ReadAllLines(pathComando);
                        }
                        catch { }
                        foreach (string comando in sComando)
                        {
                            if (comando.Length > 0)
                            {
                                if (comando == "RESET")
                                {
                                    this.Dispatcher.BeginInvoke(new CancellaRichtextbox(cancellaRichtextbox));                                                                                                            //this.Dispatcher.BeginInvoke(new WriteToLineDelegate(WriteToLine), Index - 1, protocolloIn[Index - 1]); // Aggiornamento RichTextbox                      
                                    this.Dispatcher.BeginInvoke(new RESET(Reset));
                                }
                                else
                                {
                                    try
                                    {
                                        //int p = (int)comando[1] - 100;
                                        p = (int)comando[1] - 100;
                                    }
                                    catch { }
                                    try
                                    {
                                        //////////////////MessageBox.Show("PROVA");
                                        ComandoPeriferiche(p, comando);
                                    }
                                    catch { }
                                    try
                                    {
                                        ScriviFileRisposta();
                                    }
                                    catch { }
                                    //}
                                }
                            }
                        }
                        cancellapathComando:
                        try
                        {
                            File.Delete(pathComando);
                            File.Delete(pathSemaforoCOM);
                            err1 = 0;
                        }
                        catch
                        {
                            err1 = err1 + 1;
                            if (err1 < 10)
                            {
                                goto cancellapathComando;
                            }
                        }
                    }
                    else //interrogazione stato periferiche
                    {
                            stopWatch.Start();
                        if (Index < NumeroPeriferiche.Count)
                        {
                            indperiferica = char.ConvertFromUtf32(NumeroPeriferiche[Index] + 100);
                            Index++;
                            TipoPeriferica = int.Parse(Colonne[Index]); // Mi ricavo il tipo di periferica da gestire
                            switch (TipoPeriferica)
                            {
                                case 1:
                                    PT1_1.letturaperiferiche(sp, indperiferica, datiperiferica, out riga, out testo, MaxErrori); // Interrogazione periferiche tipo 1
                                    if (protocolloIn[riga] != null && protocolloIn[riga] != "^" && protocolloIn[riga] != "FUORI LINEA" && testo != "^" && testo != "FUORI LINEA")
                                    {
                                        try
                                        {
                                            if (protocolloIn[riga].Substring(3, 8) != testo.Substring(3, 8)) //SE E' CAMBIATO LO STATO DEGLI INGRESSI DIGITALI
                                            {
                                                AggiornaRisposta();
                                            }
                                        }
                                        catch { }
                                    }
                                    break;
                                case 2:
                                    PT2_1.letturaperiferiche(sp, indperiferica, datiperiferica, out riga, out testo, MaxErrori); // Interrogazione periferiche tipo 2
                                    if (protocolloIn[riga] != null && protocolloIn[riga] != "^" && protocolloIn[riga] != "FUORI LINEA" && testo != "^" && testo != "FUORI LINEA")
                                    {
                                        try
                                        {
                                            if (protocolloIn[riga].Substring(3, 2) != testo.Substring(3, 2)) //SE E' CAMBIATO LO STATO DEGLI INGRESSI DIGITALI
                                            {
                                                AggiornaRisposta();
                                            }
                                        }
                                        catch { }
                                    }
                                    break;
                                case 3:
                                    PT3_1.letturaperiferiche(sp, indperiferica, datiperiferica, out riga, out testo, MaxErrori); // Interrogazione periferiche tipo 3
                                    if (protocolloIn[riga] != null && protocolloIn[riga] != "^ " && testo != "^ ")
                                    {
                                        try
                                        {
                                            if (protocolloIn[riga].Substring(3, 8) != testo.Substring(3, 8)) //SE E' CAMBIATO LO STATO DEGLI INGRESSI DIGITALI
                                            {
                                                AggiornaRisposta();
                                            }
                                        }
                                        catch { }
                                    }
                                    break;
                                case 4:
                                    break;
                                case 5:
                                    break;
                                default:
                                    break;
                            }
    
                            protocolloIn[riga] = testo;//MATRICE PER FILE DI SCAMBIO CON PROGRAMMA DOS
                            this.Dispatcher.BeginInvoke(new WriteToLineDelegate(WriteToLine), riga, testo); // Aggiornamento RichTextbox                                                                                                           //this.Dispatcher.BeginInvoke(new WriteToLineDelegate(WriteToLine), Index - 1, protocolloIn[Index - 1]); // Aggiornamento RichTextbox                      
                        }
                        else
                        {
                            stopWatch.Stop();
                            TimeSpan ts = stopWatch.Elapsed;
                            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", // 1905151830
                                ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
                            protocolloIn[NumeroPeriferiche.Count] = elapsedTime;
                            stopWatch.Reset();
                            creaSemaforoRisposta:
                            if (!File.Exists(pathSemaforoRIS))
                            {
                                timerErroreStart.Stop();
                                try
                                {
                                    ScriviFileRisposta();
                                    FileStream fs2 = new FileStream(pathSemaforoRIS, FileMode.Create, FileAccess.Write, FileShare.None);
                                    StreamWriter sw2 = new StreamWriter(fs2);
                                    sw2.WriteLine();
                                    sw2.Flush();
                                    fs2.Close();
                                    err2 = 0;
                                }
                                catch
                                {
                                    err2 = err2 + 1;
                                    if (err2 < 10)
                                    {
                                        goto creaSemaforoRisposta;
                                    }
                                }
                            }
                            else
                            {
                                if (!timerErroreStart.IsEnabled)
                                {
                                    timerErroreStart.Start();
                                }
                            }                
                            this.Dispatcher.BeginInvoke(new Scrivilabel(WriteToLabel), elapsedTime);
                            Index = 0;
                        }
    
                    }
                    //gestionecomandi.gestionecomandi(comandi, datiperiferica, PerifericheDaComandare);//, out NumeroAllarme, out ritardoAllarme, out GestioneAllarme); // Verifica comandi da attuare
                    // //     gestionecomandi.gestionecomandi(comandi, datiperiferica, PerifericheDaComandare, out NumeroAllarme, out ritardoAllarme, out GestioneAllarme); // Verifica comandi da attuare
                    // ComandoPeriferiche();
                }
            }
    
            #endregion
    
            //SuppCanOrario();
    
            public void ComandoPeriferiche(int indiceScheda, string comando)
            {
                //while (PerifericheDaComandare.Count != 0)
                //{
                //    int indiceScheda = int.Parse(PerifericheDaComandare.Dequeue().ToString());
    
                TipoPeriferica = int.Parse(Colonne[indiceScheda]); // Mi ricavo il tipo di periferica da gestire
    
                switch (TipoPeriferica)
                {
                    case 1:
                        PT1_1.comandoperiferiche(indiceScheda, datiperiferica[indiceScheda].UsciteDigitali, sp, comando, datiperiferica, out riga, out testo, MaxErrori);
                        break;
                    case 2:
    
                        ////////// VEDERE QUANTO FATTO PER PERIFERICA TIPO 1 E 3
    
                        //       PT2_1.comandoperiferiche(indiceScheda, datiperiferica[indiceScheda].UsciteDigitali, sp);
                        break;
                    case 3:
                        if (comando[2] != 't')
                        {
                            PT3_1.comandoperiferiche(indiceScheda, datiperiferica[indiceScheda].UsciteDigitali, sp, comando, datiperiferica, out riga, out testo, MaxErrori);
                        }
                        else if (comando[2] == 't')
                        {
                            PT3_1.CancellaCodice(sp, comando);
                            goto salto;
                        }
                        break;
                    default:
                        break;
                }
                protocolloIn[riga] = testo;//MATRICE PER FILE DI SCAMBIO CON PROGRAMMA DOS
                salto:
                { }
                //}
            }
            public void ScriviFileRisposta()
            {
                scritturaFileRisposta:
                try
                {
                    FileStream fs = new FileStream(pathRisposta, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
                    StreamWriter sw = new StreamWriter(fs);
                    for (int i = 0; i < protocolloIn.Length; i++)
                    {
                        sw.WriteLine(protocolloIn[i]);
                    }
                    sw.Flush();
                    fs.Close();
                    b = 0;
                }
                catch
                {
                    Thread.Sleep(10);
                    b++;
                    if (b < NMaxProve)
                    {
                        goto scritturaFileRisposta;
                    }
    
                }
            }
            public void AggiornaRisposta()
            {
                protocolloIn[riga] = testo;//MATRICE PER FILE DI SCAMBIO CON PROGRAMMA DOS
                if (!File.Exists(pathSemaforoRIS))
                {
                    ScriviFileRisposta();
                    FileStream fs2 = new FileStream(pathSemaforoRIS, FileMode.Create, FileAccess.Write, FileShare.None);
                    StreamWriter sw2 = new StreamWriter(fs2);
                    sw2.Flush();
                    fs2.Close();
                }
                this.Dispatcher.BeginInvoke(new WriteToLineDelegate(WriteToLine), riga, testo); // Aggiornamento RichTextbox 
            }
        }
    }
    
    
    #region gestione finestra allarmi
    
    //private void Timer3_Tick(object sender, EventArgs e) //Aggiornamento finestra allarmi
    //{
    //    if (GestioneAllarme == "ALLARMEON")
    //    {
    //        Task t = RitardoSegnalazioneAllarme(ritardoAllarme);
    //    }
    //    else if (GestioneAllarme == "ALLARMEOFF")
    //    {
    //        allarmeOFF();
    //    }
    
    //    finestraAllarmi1.LampeggioAllarmi();
    
    //    bool alternanzacolore = finestraAllarmi1.alternacolore;
    
    //    if (lampeggioAllarme == true)
    //    {
    //        if (alternanzacolore == true)
    //        {
    //            ////////////////////// // textBox1.Background = Brushes.LightGray;
    //        }
    //        else if (alternanzacolore == false)
    //        {
    //            /////////////////////// textBox1.Background = Brushes.Red;
    //        }
    //    }
    //}
    
    //async Task  RitardoSegnalazioneAllarme(int millisecondi)
    //{
    //    await Task.Delay(millisecondi);
    //    allarmeON();
    //}
    
    //private void allarmeON() //////usare un dizionario per i numeri allarme attivi????
    //{//////////////////////mettere data ed ora comparsa/scomparsa allarme
    //    finestraAllarmi1.AggiuntaAllarme(NumeroAllarme);
    //    lampeggioAllarme = true;
    //}
    
    //private void allarmeOFF()
    //{
    //    finestraAllarmi1.RientroAllarme(NumeroAllarme);
    //}
    
    //#region Supporto canali orario
    //void ControlloCanOrario(DateTime time)
    //{
    //canaleOrario1.ControlloOrari(time);
    //canaleOrario2.ControlloOrari(time);
    //canaleOrario3.ControlloOrari(time);
    //canaleOrario4.ControlloOrari(time);
    //canaleOrario5.ControlloOrari(time);
    //canaleOrario6.ControlloOrari(time);
    //canaleOrario7.ControlloOrari(time);
    //canaleOrario8.ControlloOrari(time);
    //canaleOrario9.ControlloOrari(time);
    //canaleOrario10.ControlloOrari(time);
    //canaleOrario11.ControlloOrari(time);
    //canaleOrario12.ControlloOrari(time);
    //canaleOrario13.ControlloOrari(time);
    //canaleOrario14.ControlloOrari(time);
    //canaleOrario15.ControlloOrari(time);
    //canaleOrario16.ControlloOrari(time);
    //canaleOrario17.ControlloOrari(time);
    //canaleOrario18.ControlloOrari(time);
    //canaleOrario19.ControlloOrari(time);
    //canaleOrario20.ControlloOrari(time);
    //canaleOrario21.ControlloOrari(time);
    //canaleOrario22.ControlloOrari(time);
    //canaleOrario23.ControlloOrari(time);
    //canaleOrario24.ControlloOrari(time);
    //canaleOrario25.ControlloOrari(time);
    //canaleOrario26.ControlloOrari(time);
    //canaleOrario27.ControlloOrari(time);
    //canaleOrario28.ControlloOrari(time);
    //canaleOrario29.ControlloOrari(time);
    //canaleOrario30.ControlloOrari(time);
    //canaleOrario31.ControlloOrari(time);
    //canaleOrario32.ControlloOrari(time);
    //canaleOrario33.ControlloOrari(time);
    //canaleOrario34.ControlloOrari(time);
    //canaleOrario35.ControlloOrari(time);
    //canaleOrario36.ControlloOrari(time);
    //canaleOrario37.ControlloOrari(time);
    //canaleOrario38.ControlloOrari(time);
    //canaleOrario39.ControlloOrari(time);
    //canaleOrario40.ControlloOrari(time);
    //}
    
    //void CaricaOrariSuControllo()
    //{
    //    try
    //    {
    //        XDocument xmlDoc = XDocument.Load(pathOrari);
    //        canaleOrario1.Orari = xmlDoc;
    //        canaleOrario2.Orari = xmlDoc;
    //        canaleOrario3.Orari = xmlDoc;
    //        canaleOrario4.Orari = xmlDoc;
    //        canaleOrario5.Orari = xmlDoc;
    //        canaleOrario6.Orari = xmlDoc;
    //        canaleOrario7.Orari = xmlDoc;
    //        canaleOrario8.Orari = xmlDoc;
    //        canaleOrario9.Orari = xmlDoc;
    //        canaleOrario10.Orari = xmlDoc;
    //        canaleOrario11.Orari = xmlDoc;
    //        canaleOrario12.Orari = xmlDoc;
    //        canaleOrario13.Orari = xmlDoc;
    //        canaleOrario14.Orari = xmlDoc;
    //        canaleOrario15.Orari = xmlDoc;
    //        canaleOrario16.Orari = xmlDoc;
    //        canaleOrario17.Orari = xmlDoc;
    //        canaleOrario18.Orari = xmlDoc;
    //        canaleOrario19.Orari = xmlDoc;
    //        canaleOrario20.Orari = xmlDoc;
    //        canaleOrario21.Orari = xmlDoc;
    //        canaleOrario22.Orari = xmlDoc;
    //        canaleOrario23.Orari = xmlDoc;
    //        canaleOrario24.Orari = xmlDoc;
    //        canaleOrario25.Orari = xmlDoc;
    //        canaleOrario26.Orari = xmlDoc;
    //        canaleOrario27.Orari = xmlDoc;
    //        canaleOrario28.Orari = xmlDoc;
    //        canaleOrario29.Orari = xmlDoc;
    //        canaleOrario30.Orari = xmlDoc;
    //        canaleOrario31.Orari = xmlDoc;
    //        canaleOrario32.Orari = xmlDoc;
    //        canaleOrario33.Orari = xmlDoc;
    //        canaleOrario34.Orari = xmlDoc;
    //        canaleOrario35.Orari = xmlDoc;
    //        canaleOrario36.Orari = xmlDoc;
    //        canaleOrario37.Orari = xmlDoc;
    //        canaleOrario38.Orari = xmlDoc;
    //        canaleOrario39.Orari = xmlDoc;
    //        canaleOrario40.Orari = xmlDoc;
    //    }
    //    catch
    //    {
    //        // messaggio di errore
    //    }
    //}
    
    //void AssTipoGiorno(string idTipoGiorno)
    //{
    //    canaleOrario1.idTipoGiorno = idTipoGiorno;
    //    canaleOrario2.idTipoGiorno = idTipoGiorno;
    //    canaleOrario3.idTipoGiorno = idTipoGiorno;
    //    canaleOrario4.idTipoGiorno = idTipoGiorno;
    //    canaleOrario5.idTipoGiorno = idTipoGiorno;
    //    canaleOrario6.idTipoGiorno = idTipoGiorno;
    //    canaleOrario7.idTipoGiorno = idTipoGiorno;
    //    canaleOrario8.idTipoGiorno = idTipoGiorno;
    //    canaleOrario9.idTipoGiorno = idTipoGiorno;
    //    canaleOrario10.idTipoGiorno = idTipoGiorno;
    //    canaleOrario11.idTipoGiorno = idTipoGiorno;
    //    canaleOrario12.idTipoGiorno = idTipoGiorno;
    //    canaleOrario13.idTipoGiorno = idTipoGiorno;
    //    canaleOrario14.idTipoGiorno = idTipoGiorno;
    //    canaleOrario15.idTipoGiorno = idTipoGiorno;
    //    canaleOrario16.idTipoGiorno = idTipoGiorno;
    //    canaleOrario17.idTipoGiorno = idTipoGiorno;
    //    canaleOrario18.idTipoGiorno = idTipoGiorno;
    //    canaleOrario19.idTipoGiorno = idTipoGiorno;
    //    canaleOrario20.idTipoGiorno = idTipoGiorno;
    //    canaleOrario21.idTipoGiorno = idTipoGiorno;
    //    canaleOrario22.idTipoGiorno = idTipoGiorno;
    //    canaleOrario23.idTipoGiorno = idTipoGiorno;
    //    canaleOrario24.idTipoGiorno = idTipoGiorno;
    //    canaleOrario25.idTipoGiorno = idTipoGiorno;
    //    canaleOrario26.idTipoGiorno = idTipoGiorno;
    //    canaleOrario27.idTipoGiorno = idTipoGiorno;
    //    canaleOrario28.idTipoGiorno = idTipoGiorno;
    //    canaleOrario29.idTipoGiorno = idTipoGiorno;
    //    canaleOrario30.idTipoGiorno = idTipoGiorno;
    //    canaleOrario31.idTipoGiorno = idTipoGiorno;
    //    canaleOrario32.idTipoGiorno = idTipoGiorno;
    //    canaleOrario33.idTipoGiorno = idTipoGiorno;
    //    canaleOrario34.idTipoGiorno = idTipoGiorno;
    //    canaleOrario35.idTipoGiorno = idTipoGiorno;
    //    canaleOrario36.idTipoGiorno = idTipoGiorno;
    //    canaleOrario37.idTipoGiorno = idTipoGiorno;
    //    canaleOrario38.idTipoGiorno = idTipoGiorno;
    //    canaleOrario39.idTipoGiorno = idTipoGiorno;
    //    canaleOrario40.idTipoGiorno = idTipoGiorno;
    //}
    
    // Inizializzazione nomi canali orario
    
    //void InizializzaCAnaleOrario()
    //{
    //    canaleOrario1.Testo = NomeCanOrario[0].Substring(9, 23);
    //    canaleOrario2.Testo = NomeCanOrario[1].Substring(9, 23);
    //    canaleOrario3.Testo = NomeCanOrario[2].Substring(9, 23);
    //    canaleOrario4.Testo = NomeCanOrario[3].Substring(9, 23);
    //    canaleOrario5.Testo = NomeCanOrario[4].Substring(9, 23);
    //    canaleOrario6.Testo = NomeCanOrario[5].Substring(9, 23);
    //    canaleOrario7.Testo = NomeCanOrario[6].Substring(9, 23);
    //    canaleOrario8.Testo = NomeCanOrario[7].Substring(9, 23);
    //    canaleOrario9.Testo = NomeCanOrario[8].Substring(9, 23);
    //    canaleOrario10.Testo = NomeCanOrario[9].Substring(9, 23);
    //    canaleOrario11.Testo = NomeCanOrario[10].Substring(9, 23);
    //    canaleOrario12.Testo = NomeCanOrario[11].Substring(9, 23);
    //    canaleOrario13.Testo = NomeCanOrario[12].Substring(9, 23);
    //    canaleOrario14.Testo = NomeCanOrario[13].Substring(9, 23);
    //    canaleOrario15.Testo = NomeCanOrario[14].Substring(9, 23);
    //    canaleOrario16.Testo = NomeCanOrario[15].Substring(9, 23);
    //    canaleOrario17.Testo = NomeCanOrario[16].Substring(9, 23);
    //    canaleOrario18.Testo = NomeCanOrario[17].Substring(9, 23);
    //    canaleOrario19.Testo = NomeCanOrario[18].Substring(9, 23);
    //    canaleOrario20.Testo = NomeCanOrario[19].Substring(9, 23);
    //    canaleOrario21.Testo = NomeCanOrario[20].Substring(9, 23);
    //    canaleOrario22.Testo = NomeCanOrario[21].Substring(9, 23);
    //    canaleOrario23.Testo = NomeCanOrario[22].Substring(9, 23);
    //    canaleOrario24.Testo = NomeCanOrario[23].Substring(9, 23);
    //    canaleOrario25.Testo = NomeCanOrario[24].Substring(9, 23);
    //    canaleOrario26.Testo = NomeCanOrario[25].Substring(9, 23);
    //    canaleOrario27.Testo = NomeCanOrario[26].Substring(9, 23);
    //    canaleOrario28.Testo = NomeCanOrario[27].Substring(9, 23);
    //    canaleOrario29.Testo = NomeCanOrario[28].Substring(9, 23);
    //    canaleOrario30.Testo = NomeCanOrario[29].Substring(9, 23);
    //    canaleOrario31.Testo = NomeCanOrario[30].Substring(9, 23);
    //    canaleOrario32.Testo = NomeCanOrario[31].Substring(9, 23);
    //    canaleOrario33.Testo = NomeCanOrario[32].Substring(9, 23);
    //    canaleOrario34.Testo = NomeCanOrario[33].Substring(9, 23);
    //    canaleOrario35.Testo = NomeCanOrario[34].Substring(9, 23);
    //    canaleOrario36.Testo = NomeCanOrario[35].Substring(9, 23);
    //    canaleOrario37.Testo = NomeCanOrario[36].Substring(9, 23);
    //    canaleOrario38.Testo = NomeCanOrario[37].Substring(9, 23);
    //    canaleOrario39.Testo = NomeCanOrario[38].Substring(9, 23);
    //    canaleOrario40.Testo = NomeCanOrario[39].Substring(9, 23);
    //}
    
    //void SuppCanOrario()
    //{
    //    bool[] d = new bool[41];
    //    if (canaleOrario1.attivo == true)
    //    {
    //        d[1] = true;
    //    }
    //    else
    //    {
    //        d[1] = false;
    //    }
    //    if (canaleOrario2.attivo == true)
    //    {
    //        d[2] = true;
    //    }
    //    else
    //    {
    //        d[2] = false;
    //    }
    //    if (canaleOrario3.attivo == true)
    //    {
    //        d[3] = true;
    //    }
    //    else
    //    {
    //        d[3] = false;
    //    }
    //    if (canaleOrario4.attivo == true)
    //    {
    //        d[4] = true;
    //    }
    //    else
    //    {
    //        d[4] = false;
    //    }
    //    if (canaleOrario5.attivo == true)
    //    {
    //        d[5] = true;
    //    }
    //    else
    //    {
    //        d[5] = false;
    //    }
    //    if (canaleOrario6.attivo == true)
    //    {
    //        d[6] = true;
    //    }
    //    else
    //    {
    //        d[6] = false;
    //    }
    //    if (canaleOrario7.attivo == true)
    //    {
    //        d[7] = true;
    //    }
    //    else
    //    {
    //        d[7] = false;
    //    }
    //    if (canaleOrario8.attivo == true)
    //    {
    //        d[8] = true;
    //    }
    //    else
    //    {
    //        d[8] = false;
    //    }
    //    if (canaleOrario9.attivo == true)
    //    {
    //        d[9] = true;
    //    }
    //    else
    //    {
    //        d[9] = false;
    //    }
    //    if (canaleOrario10.attivo == true)
    //    {
    //        d[10] = true;
    //    }
    //    else
    //    {
    //        d[10] = false;
    //    }
    //    if (canaleOrario11.attivo == true)
    //    {
    //        d[11] = true;
    //    }
    //    else
    //    {
    //        d[11] = false;
    //    }
    //    if (canaleOrario12.attivo == true)
    //    {
    //        d[12] = true;
    //    }
    //    else
    //    {
    //        d[12] = false;
    //    }
    //    if (canaleOrario13.attivo == true)
    //    {
    //        d[13] = true;
    //    }
    //    else
    //    {
    //        d[13] = false;
    //    }
    //    if (canaleOrario14.attivo == true)
    //    {
    //        d[14] = true;
    //    }
    //    else
    //    {
    //        d[14] = false;
    //    }
    //    if (canaleOrario15.attivo == true)
    //    {
    //        d[15] = true;
    //    }
    //    else
    //    {
    //        d[15] = false;
    //    }
    //    if (canaleOrario16.attivo == true)
    //    {
    //        d[16] = true;
    //    }
    //    else
    //    {
    //        d[16] = false;
    //    }
    //    if (canaleOrario17.attivo == true)
    //    {
    //        d[17] = true;
    //    }
    //    else
    //    {
    //        d[17] = false;
    //    }
    //    if (canaleOrario18.attivo == true)
    //    {
    //        d[18] = true;
    //    }
    //    else
    //    {
    //        d[18] = false;
    //    }
    //    if (canaleOrario19.attivo == true)
    //    {
    //        d[19] = true;
    //    }
    //    else
    //    {
    //        d[19] = false;
    //    }
    //    if (canaleOrario20.attivo == true)
    //    {
    //        d[20] = true;
    //    }
    //    else
    //    {
    //        d[20] = false;
    //    }
    //    if (canaleOrario21.attivo == true)
    //    {
    //        d[21] = true;
    //    }
    //    else
    //    {
    //        d[21] = false;
    //    }
    //    if (canaleOrario22.attivo == true)
    //    {
    //        d[22] = true;
    //    }
    //    else
    //    {
    //        d[22] = false;
    //    }
    //    if (canaleOrario23.attivo == true)
    //    {
    //        d[23] = true;
    //    }
    //    else
    //    {
    //        d[23] = false;
    //    }
    //    if (canaleOrario24.attivo == true)
    //    {
    //        d[24] = true;
    //    }
    //    else
    //    {
    //        d[24] = false;
    //    }
    //    if (canaleOrario25.attivo == true)
    //    {
    //        d[25] = true;
    //    }
    //    else
    //    {
    //        d[25] = false;
    //    }
    //    if (canaleOrario26.attivo == true)
    //    {
    //        d[26] = true;
    //    }
    //    else
    //    {
    //        d[26] = false;
    //    }
    //    if (canaleOrario27.attivo == true)
    //    {
    //        d[27] = true;
    //    }
    //    else
    //    {
    //        d[27] = false;
    //    }
    //    if (canaleOrario28.attivo == true)
    //    {
    //        d[28] = true;
    //    }
    //    else
    //    {
    //        d[28] = false;
    //    }
    //    if (canaleOrario29.attivo == true)
    //    {
    //        d[29] = true;
    //    }
    //    else
    //    {
    //        d[29] = false;
    //    }
    //    if (canaleOrario30.attivo == true)
    //    {
    //        d[30] = true;
    //    }
    //    else
    //    {
    //        d[30] = false;
    //    }
    //    if (canaleOrario31.attivo == true)
    //    {
    //        d[31] = true;
    //    }
    //    else
    //    {
    //        d[31] = false;
    //    }
    //    if (canaleOrario32.attivo == true)
    //    {
    //        d[32] = true;
    //    }
    //    else
    //    {
    //        d[32] = false;
    //    }
    //    if (canaleOrario33.attivo == true)
    //    {
    //        d[33] = true;
    //    }
    //    else
    //    {
    //        d[33] = false;
    //    }
    //    if (canaleOrario34.attivo == true)
    //    {
    //        d[34] = true;
    //    }
    //    else
    //    {
    //        d[34] = false;
    //    }
    //    if (canaleOrario35.attivo == true)
    //    {
    //        d[35] = true;
    //    }
    //    else
    //    {
    //        d[35] = false;
    //    }
    //    if (canaleOrario36.attivo == true)
    //    {
    //        d[36] = true;
    //    }
    //    else
    //    {
    //        d[36] = false;
    //    }
    //    if (canaleOrario37.attivo == true)
    //    {
    //        d[37] = true;
    //    }
    //    else
    //    {
    //        d[37] = false;
    //    }
    //    if (canaleOrario38.attivo == true)
    //    {
    //        d[38] = true;
    //    }
    //    else
    //    {
    //        d[38] = false;
    //    }
    //    if (canaleOrario39.attivo == true)
    //    {
    //        d[39] = true;
    //    }
    //    else
    //    {
    //        d[39] = false;
    //    }
    //    if (canaleOrario40.attivo == true)
    //    {
    //        d[40] = true;
    //    }
    //    else
    //    {
    //        d[40] = false;
    //    }
    //    gestionecomandi.canorario(d); 
    //}
    
    //#endregion
    
    //#region Eventi canali orario
    //private void canaleOrario1_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario1.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario2_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario2.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario3_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario3.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario4_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario4.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario5_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario5.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario6_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario6.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario7_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario7.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario8_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario8.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario9_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario9.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario10_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario10.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario11_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario11.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario12_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario12.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario13_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario13.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario14_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario14.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario15_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario15.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario16_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario16.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario17_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario17.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario18_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario18.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario19_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario19.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario20_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario20.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario21_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario21.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario22_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario22.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario23_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario23.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario24_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario24.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario25_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario25.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario26_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario26.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario27_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario27.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario28_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario28.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario29_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario29.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario30_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario30.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario31_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario31.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario32_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario32.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario33_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario33.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario34_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario34.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario35_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario35.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario36_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario36.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario37_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario37.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario38_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario38.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario39_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario39.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    
    //private void canaleOrario40_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    //{
    //    ModificaOrari ModificaOrari = new ModificaOrari(canaleOrario40.IDCanale, pathOrari);
    //    ModificaOrari.ShowDialog();
    //    CaricaOrariSuControllo();
    //}
    //}
    #endregion
    
    
  • Re: Applicazione si chiude da sola

    Rubik ha scritto:


    82_marco ha scritto:


    Ci sono degli accessi a dei file condivisi con un altro programma, ma gli accessi sono dentro try catch
    A mio avviso è una cosa discutibile accedere contemporanemente alla stessa risorsa da due thread diversi ed affidarsi ai try catch, magari il tuo problema non dipende da questo, ma comunque fa pensare.

    Il BackgroundWorker quando viene lanciato gli si può passare un argomento e/o oggetti attraverso "DoWorkEventArgs e", lo ritrovi in e.Argument
    Se BackgroundWorker modifica variabili nel programma chiamante, mentre lavora è bene non accedervi, per fare questo si usa BackgroundWorker1.IsBusy, se true non accedi alla risorsa condivisa.
    Quando BackgroundWorker ha finito, si attiva l'evento BackgroundWorker1.RunWorkerCompleted, in questo evento oltre ad avere la conferma del termine per agire di conseguenza, attraverso "RunWorkerCompletedEventArgs e" si possono ricevere info e/o oggetti con e.Result.
    L'evento deve essere sottoscritto in designer o subito dopo InitializeComponent

    Per usare MioDebug in un BackgroundWorker è bene scrivere il log in file diversi, uno per ogni BackgroundWorker, proprio per evitare conflitti e includere il codice di MioDebug all'interno di ogni BackgroundWorker, o creare una classe apposita.
    Se nei BackgroundWorker hai dei cicli che vuoi monitorare con MioDebug lo puoi fare a campione.
    Il codice seguente non fa nulla di particolare, ma scambia le informazioni tra il programma principale e il BackgroundWorker correttamente e scrive due file: MioLog.txt e Worker1.txt
    
    using System;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.IO;
    
    
    namespace MioDebug
    
    {
        public partial class Form1 : Form
        {
            bool MioDebugON = true;
            BackgroundWorker  backgroundWorker1 = new BackgroundWorker();
    
            public Form1()
            {
                InitializeComponent();
               
                this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.BackgroundWorker1_DoWork);
                this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.BackgroundWorker1_RunWorkerCompleted);
                this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_Closing);
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                MioDebug("! Programma iniziato");
                MioDebug("! backgroundWorker1, lanciato");
    
                backgroundWorker1.RunWorkerAsync(Application.StartupPath + "\\Worker1.txt"); // passo una stringa come argomento, si possono passare anche oggetti
            }
    
            private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                string PercorsoLog = e.Argument.ToString(); // ricevo la stringa come argomento (il nome del file)
                string MioLog = DateTime.Now.ToString() + " - " + "BackgroundWorker1 iniziato" + Environment.NewLine;
                File.AppendAllText(PercorsoLog, MioLog);
    
                for (int cicli = 0; cicli < 50000; cicli++)
                {
                    if (cicli % 1000 == 0) // ogni 1000 cicli scrivo sul file log
                    {
                        MioLog = DateTime.Now.ToString() + " - " + "eseguo il ciclo: " + cicli + Environment.NewLine;
                        File.AppendAllText(PercorsoLog, MioLog);
                    }
                }
                e.Result = "Finito"; // invio una stringa come risultato
                MioLog = DateTime.Now.ToString() + " - " + "BackgroundWorker1 terminato" + Environment.NewLine;
                File.AppendAllText(PercorsoLog, MioLog);
            }
    
            private void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                this.Text = e.Result.ToString(); // ricevo il risultato
                MioDebug("! backgroundWorker1, terminato");
                MioDebug("! controlla l'attivita di backgroundWorker1, in " + Application.StartupPath + "\\Worker1.txt");
            }
    
            private void Form1_Closing(Object sender, FormClosingEventArgs e)
            {
                MioDebug("! Programma chiuso");
            }
    
            private void MioDebug(string Messaggio)
            {
                if (MioDebugON == false) // con MioDebugON = False la subroutine non viene eseguita
                {
                    return;
                }
                string PercorsoLog = Application.StartupPath + "\\MioLog.txt";
                string MioLog = DateTime.Now.ToString() + " - " + Messaggio + Environment.NewLine; // leggo la data e l'ora del computer
                File.AppendAllText(PercorsoLog, MioLog);
            }
        }
    }   
    
    Devo condividere l'accesso al file txt con l'altro programma perche' devo girare allo stesso la risposta di alcune schede collegate alla rs232
  • Re: Applicazione si chiude da sola

    82_marco ha scritto:


    surfernet ha scritto:


    Magari prova questo:
    https://www.csharp-examples.net/catching-unhandled-exceptions/
    https://docs.microsoft.com/it-it/dotnet/api/system.appdomain.unhandledexception?view=netcore-3.1
    Mmm non capisco
    il codice dovrebbe permettere ,se ho ben inteso,di catturare anche le eccezioni non esplicitamente catturate
Devi accedere o registrarti per scrivere nel forum
23 risposte