Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Pipe
Forum - C# / VB.NET - Pipe

Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
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?


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
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.



https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote