Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Pipe
Forum - C# / VB.NET - Pipe

Avatar
Thejuster (Member)
Guru^2


Messaggi: 1703
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 15:40
Giovedì, 09/02/2017
Salve ragazzi,
Forse a qualcuno è capitato un problema del genere.

Ho provato a chiedere anche ad amici ma non sono riusciti a trovarmi una soluzione.
Forse vi è capitato già qualcosa del genere e sapete come fare.

Vi spiego il mio problema.

Ho realizzato un Debugger interattivo per il mio progetto

https://cdn.discordapp.com/attachments/215894893866909696/2 ...

Il tutto gira sui NamedPipeServer che consente una sorta di comunicazione tra applicazione e processo.
Un pò come visual studio mostra le variabili e altri oggetti.

Il problema è questo.

Il debugger funziona bene, e fà bene il suo lavoro e per lo scopo che e stato programmato.
Ma nonostante io tenta di chiudere tutte le comunicazioni con il l'applicazione al cui il pipe è connesso
essa non sembra chiudersi.

in primis ho un eccezione al pipe drain

Codice sorgente - presumibilmente C# / VB.NET

  1. //pipeServer.WaitForPipeDrain();
  2.                     if (pipeServer.IsConnected) { pipeServer.Disconnect(); }



Come vedete ho commentato questa l'attesa che il pipe venga droppato.
perché la limitazione di questo processo è proprio quella di inviare una sola stringa per azione.
e siccome un debugger deve tener traccia di ogni viariabile, avere un sola stringa per volta non va bene.
quindi ho inserito un ciclo nel ciclo del pipe server.


Codice sorgente - presumibilmente VB.NET

  1. do
  2.             {
  3.       try {
  4.          
  5.   pipeServer.WaitForPipeDrain();
  6.  
  7.   // start inner loop
  8.                     while (pipeServer.IsConnected)
  9.                     {
  10.                         //Esempio
  11. test = sr.ReadLine();
  12.  
  13.   if(test.Contains("lightvalue"))
  14.                         {
  15. lightR = Math.Floor(l.Color1 == 1.0 ? 255 : l.Color1 * 256.0);
  16. }
  17.  
  18.  // Comando di chiusura
  19.                         if (test == "close")
  20.                             pipeServer.Disconnect();
  21.  
  22.                     }
  23.                 catch (Exception ex) { throw ex; }
  24.                 finally
  25.                 {
  26.                     //pipeServer.WaitForPipeDrain();
  27.                     if (pipeServer.IsConnected) { pipeServer.Disconnect(); }
  28.                 }



Questo parte del mio codice,
Ho postato solo una parte giusto per mostrare il funzionamento del metodo.

Avviando la prima volta il debbuger, assieme al debugger parte anche il processo a cui
il pipe server si collega. e tiene traccia come nella screen di tutte le variabili e altre informazioni.

Ma riavviando una seconda volta il debug, si frezza tutto e non capisco il motivo perché accade questo.
il debugger di VS non mostra errori...

Per risolvere ciò
anche se chiudo tutti i form, il programma rimane avviato.
nonostante io abbia fermato il thread a cui il debugger viene azionato.

per chiudere il programma sono costretto ad usare

Codice sorgente - presumibilmente Plain Text

  1. Application.ExitThread();
  2. Environment.Exit();



Consigli?


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:52
Giovedì, 09/02/2017
Ma il "do" dove si conclude?

L'indentazione è pessima ... non si capiscono i blocchi ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1703
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 8:36
Martedì, 14/02/2017
Ho risolto nessun grazie ugualmente per l'interessamento.

In pratica, quando si crea un doppio ciclo in un thread separato e molto difficile tentarlo di chiuderlo.
nonostante io forza a chiudere l'applicazione.

Non il fatto che il thread non termina, ma il problema che rimane aperto il pipe server nonostante il thread
sia stato distrutto.

Sarà un bug di visual studio non saprei.

Ho risolto forzando il Grabage Collector a sopprimere e finalizzare l'oggeto form contenente tutte le sue operazioni correnti.
Un semplice Dispose non bastava e non funzionava.
Nemmeno forzare a chiudere un processo.



PM Quote