private void button1_Click(object sender, EventArgs e) { //scelta utente: Eseguire il calcolo? var result = MessageBox.Show("Eseguire il calcolo?", "GUI", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk); if (result == System.Windows.Forms.DialogResult.No) { return; } //esecuzione engine Process myProcess = new Process(); //creazione istanza Albero Test alberoTest = new Test(); try { //Connessione a database per ripescaggio dati SqlConnection myconn = new SqlConnection("Persist Security Info=False;Integrated Security=true;Initial Catalog=EngineDB;server=(local)"); //connessione a database SqlCommand cmd = new SqlCommand("select * from Prova", myconn); //COMANDO SQL DI PROVA //MessageBox.Show("Tentativo di connessione al database"); myconn.Open(); //apertura connessione //MessageBox.Show("Connessione stabilita"); SqlDataReader myReader = cmd.ExecuteReader(); //MessageBox.Show("Lettura dati dal database in corso..."); //lettura dati while (myReader.Read()) { alberoTest.dato1 = myReader.GetString(0); alberoTest.dato2 = myReader.GetInt32(1); } //MessageBox.Show("Lettura completata: dato1 = " + alberoTest.dato1 + " dato2 = " + alberoTest.dato2); //chiusura connessione database // Chiude il DataReader myReader.Close(); // Chiude la Connessione myconn.Close(); //Attivazione Engine //MessageBox.Show("Attivazione Engine in corso..."); myProcess.StartInfo.UseShellExecute = false; //Ottiene o imposta un valore che indica se utilizzare la shell del sistema operativo per avviare il processo. myProcess.StartInfo.FileName = "Engine.exe"; //Percorso file da avviare myProcess.StartInfo.Arguments = "GUI"; //Argomento "GUI" da passare all'Engine per far capire ad esso che è stato chiamato dalla nostra GUI myProcess.StartInfo.CreateNoWindow = false; //false = finestra visibile, true il contrario myProcess.Start(); //Processo Engine attivato //Comunicazione con Engine.exe tramite Named Pipes NamedPipeClientStream Pipe1 = new NamedPipeClientStream("Pipe1"); Thread.Sleep(1000); //aspettiamo 1 secondo per far si che l'Engine sia pronto a ricevere la connessione Pipe1.Connect(); //MessageBox.Show("Connessione con Engine stabilita", "GUI"); //riempimento struttura messaggio messaggio message = new messaggio(); message.Albero = alberoTest; message.Risposta = ""; //mando il messaggio //MessageBox.Show("Invio messaggio a Engine", "GUI"); var f = new System.Xml.Serialization.XmlSerializer(typeof(messaggio)); f.Serialize(Pipe1, message); //mando il messaggio sulla pipe //chiusura pipe invio Pipe1.Close(); //ricezione messaggio creando pipe di ricezione NamedPipeServerStream Pipe2 = new NamedPipeServerStream("Pipe2"); Pipe2.WaitForConnection(); //MessageBox.Show("Ricezione messaggio da Engine", "GUI"); messaggio ricevuto = new messaggio(); ricevuto = (messaggio)f.Deserialize(Pipe2); //chiusura pipe ricezione Pipe2.Close(); //compito riuscito //Stampa risultato MessageBox.Show("RESULT = Stampa contenuto messaggio ricevuto da Engine: " + ricevuto.Risposta, "GUI", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); //chiusura Form esecuzione calcolo this.Dispose(); } catch (Exception ex) { //accade eccezione, fallimento compito if (ex is System.ComponentModel.Win32Exception) MessageBox.Show("ERRORE: " + "File 'Engine.exe' non trovato: assicurati che il file si trovi nella stessa cartella della GUI e si chiami 'Engine.exe' "); //sollevata eccezione per Engine mancante else MessageBox.Show("ERRORE: " + ex.Message); //Tutte le altre possibili eccezioni //Notifica calcolo non eseguito MessageBox.Show("Calcolo non eseguito", "GUI", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private void button1_Click(object sender, EventArgs e) { try { // //Import dal database // //passo alla funzione riceviDB() l'albero scelto dall'utente Tree albero = riceviDB(comboBox1.Text); //albero ricreato // //utente immette i dati // //controllo correttezza TextBox Vertex START e Vertex END int startVertex, endVertex; if(((this.textBox1.Text).Equals("")) || ((this.textBox2.Text).Equals(""))) { MessageBox.Show("Campi mancanti", "GUI", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (!(int.TryParse(this.textBox1.Text, out startVertex))) { MessageBox.Show("Sono stati inseriti parametri non corretti", "GUI", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (!(int.TryParse(this.textBox2.Text, out endVertex))) { MessageBox.Show("Sono stati inseriti parametri non corretti", "GUI", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } //Controllo RANGE if(!(startVertex >= 0 && startVertex < endVertex && startVertex < albero.numNodi)) { //Range startVertex sbagliato! MessageBox.Show("Sono stati inseriti parametri non corretti", "GUI", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if(!(endVertex > 0 && endVertex > startVertex && endVertex <= albero.numNodi)) { //Range endVertex sbagliato! MessageBox.Show("Sono stati inseriti parametri non corretti", "GUI", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } //Verifica andata a buon fine, dati OK //scelta utente: Eseguire il calcolo? var result = MessageBox.Show("Eseguire il calcolo?", "GUI", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk); //scelta negativa da parte dell'utente if (result == System.Windows.Forms.DialogResult.No) { return; } // //esecuzione GUI-Engine // Process myProcess = new Process(); myProcess.StartInfo.UseShellExecute = false; //Attivazione Engine myProcess.StartInfo.FileName = "Engine.exe"; //Percorso file da avviare myProcess.StartInfo.Arguments = "GUI"; //Argomento "GUI" da passare all'Engine per far capire ad esso che è stato chiamato dalla nostra GUI myProcess.StartInfo.CreateNoWindow = true; //false = finestra visibile, true il contrario myProcess.Start(); //Processo Engine attivato // //comunicazione con Engine.exe // //Comunicazione con Engine.exe tramite Named Pipes NamedPipeClientStream Pipe1 = new NamedPipeClientStream("Pipe1"); Thread.Sleep(1000); //aspetta 1 secondo per far si che l'Engine sia pronto a ricevere la connessione dalla GUI Pipe1.Connect(); //stabilisce connessione con Engine //riempimento struttura messaggio messaggio message = new messaggio(); message.Albero = albero; message.startVertex = int.Parse(this.textBox1.Text); message.endVertex = int.Parse(this.textBox2.Text); message.Risposta = ""; //Invio messaggio a Engine var f = new System.Xml.Serialization.XmlSerializer(typeof(messaggio)); f.Serialize(Pipe1, message); //mando il messaggio sulla pipe //chiusura pipe invio Pipe1.Close(); //Qui l'Engine esegue il calcolo e ci spedisce la risposta tramite Pipe2 //ricezione messaggio creando pipe di ricezione NamedPipeServerStream Pipe2 = new NamedPipeServerStream("Pipe2"); Pipe2.WaitForConnection(); //Ricezione messaggio da Engine messaggio ricevuto = new messaggio(); ricevuto = (messaggio)f.Deserialize(Pipe2); //chiusura pipe ricezione Pipe2.Close(); //compito riuscito //Stampa risultato MessageBox.Show("RESULT: " + ricevuto.Risposta, "GUI", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); //chiusura Form esecuzione calcolo this.Dispose(); } catch (Exception ex) { //accade eccezione, fallimento compito if (ex is System.ComponentModel.Win32Exception) MessageBox.Show("ERRORE: " + "File 'Engine.exe' non trovato: assicurati che il file si trovi nella stessa cartella della GUI e si chiami 'Engine.exe' "); //sollevata eccezione per Engine mancante else MessageBox.Show("ERRORE: " + ex.Message); //Tutte le altre possibili eccezioni //Notifica calcolo non eseguito MessageBox.Show("Calcolo non eseguito", "GUI", MessageBoxButtons.OK, MessageBoxIcon.Error); } }