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 - Output Processo
Forum - C# / VB.NET - Output Processo

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Gemini (Normal User)
Newbie


Messaggi: 7
Iscritto: 04/10/2021

Segnala al moderatore
Postato alle 22:32
Lunedì, 04/10/2021
Salve a tutti sono nuovo del forum e sto appena incominciando a programmare in c#.... ho creato un programma che avvia un processo esterno e mi reindirizza l'output... diciamo che qualcosa sono riuscito a farlo però non capisco perchè dopo avermi mandato l'output si chiude il processo...io invece vorrei che lo tiene aperto e semai mi se cambia qualcosa mi reindirizza altri output su una richbox......
Vi mostro il codice che ho fatto così da aiutarmi a farmi capire dove sto sbagliando.

Codice sorgente - presumibilmente C++

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. using System.Windows.Forms;
  12.  
  13. namespace rAthenaConsole
  14. {
  15.     public partial class mainForm : Form
  16.     {
  17.  
  18.  
  19.         //=====================================================================
  20.         //== Main Form
  21.         //=====================================================================
  22.         public mainForm()
  23.         {
  24.  
  25.             InitializeComponent();
  26.         }
  27.  
  28.  
  29.  
  30.         //=====================================================================
  31.         //== Bottone Start
  32.         //=====================================================================
  33.         private void btn_startServer_Click(object sender, EventArgs e)
  34.         {
  35.             Run("V:\\miacartella\\programma.exe");
  36.         }
  37.  
  38.  
  39.  
  40.         //=====================================================================
  41.         //== Bottone Stop  
  42.         //=====================================================================
  43.         private void btn_stopServer_Click(object sender, EventArgs e)
  44.         {
  45.  
  46.         }
  47.  
  48.  
  49.         //=====================================================================
  50.         //== Funzione Run
  51.         //=====================================================================
  52.         void Run(string pathProcess)
  53.         {
  54.             try
  55.             {
  56.  
  57.                 //Char Server
  58.                 var process = new Process
  59.                 {
  60.                     StartInfo = new ProcessStartInfo
  61.                     {
  62.                         FileName = pathProcess,
  63.                         //Arguments = "behavior query SymlinkEvaluation",
  64.                         UseShellExecute = false,
  65.                         RedirectStandardOutput = true,
  66.                         CreateNoWindow = true
  67.                     }
  68.                 };
  69.  
  70.                 process.Start();
  71.  
  72.                 while (!process.StandardOutput.EndOfStream)
  73.                 {
  74.                     var line = process.StandardOutput.ReadLine();
  75.                     rtb_outProcess.AppendText(line);
  76.                 }
  77.  
  78.                 process.WaitForExit();
  79.  
  80.             }
  81.             catch (Exception o)
  82.             {
  83.                 Console.WriteLine(o.Message);
  84.             }
  85.      
  86.         }
  87.  
  88.        
  89.  
  90.     }
  91. }




Un'altra cosa ho provato a creare un metodo così da potergli passare come parametro l'indirizzo del processo esterno da avviare però quando ne avvio piu di uno mi si blocca il programma.... ovviamente li ho eseguiti in thread diversi....

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2105
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 8:47
Martedì, 05/10/2021
oh, Ragnarok sta tornando di moda allora :rotfl:
Bello vedere spuntare di tanto in tanto qualcuno ancora interessato a questo gioco.

Ho fatto qualcosa del genere ma in c++ mentre imparavo un pò l'ide del qt.

https://github.com/Thejuster/rAthena-Studio

Cerchiamo di capire prima cosa hai fatto.


Testo quotato


Un'altra cosa ho provato a creare un metodo così da potergli passare come parametro l'indirizzo del processo esterno da avviare però quando ne avvio piu di uno mi si blocca il programma.... ovviamente li ho eseguiti in thread diversi....



Li hai eseguiti in Thread differenti, quindi tentare di accedere ad una risorsa o meglio dire Controllo utente
questo causa il Cross Thread Exception.

In Teoria saprei già scriverti la soluzione,Ma non serivrebbe a nulla se non capisci dove hai sbagliato.
Mostra anche la parte in cui esegui i Thread diversi ed il comportamento di questi Thread.


Ultima modifica effettuata da Thejuster il 05/10/2021 alle 11:16


PM Quote
Avatar
Gemini (Normal User)
Newbie


Messaggi: 7
Iscritto: 04/10/2021

Segnala al moderatore
Postato alle 20:30
Martedì, 05/10/2021
Testo quotato

oh, Ragnarok sta tornando di moda allora :rotfl:
Bello vedere spuntare di tanto in tanto qualcuno ancora interessato a questo gioco.


Beh si xD anche se come grafica è un pò vecchiotta però e un gioco fatto molto bene a mio parere xP.....e si ci sono italiani che giocano ancora...io ne conosco un bel pò

Testo quotato

Li hai eseguiti in Thread differenti, quindi tentare di accedere ad una risorsa o meglio dire Controllo utente
questo causa il Cross Thread Exception.



Allora si in pratica visto che è un pò scocciante e brutto il fatto di avere le tre finestre aperte sul desktop quando avvii il server di rAthena, allora provai a usare rAthenaConsole se nn sbaglio così si chiamava sul forum di rAthena ma caricava in modo lento i  tre file bat cioè ti dico che ci metteva un 10min 15 pure LOL ed è un po tanto ma è un tools datato e quindi ho pensato di fare un programma in c# che mi avviava il srerver mostrandomi l'output su diverse richbox e magari aggiungiere anche qualche bottone dove poter resettare e stoppare senza chiudere le finestre e riaprirle...

però ora mi limito ad avviarlo xD
cmq posto il codice.... in pratica ho usato i Task che so che sono come Thread e ho passato i parametri però è un copia e incolla di una funzione niente di che(nella crezione di un metodo senza fare copia e incolla ho trovato il problema che non posso mandare alla richbox un valore xke mi da errore) e quindi ho pensato di non postare e magari aprire un'altro topic
spero di essermi spiegato bene

comunque questo è il codice che ho fatto
Codice sorgente - presumibilmente C++

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. using System.Windows.Forms;
  12.  
  13. namespace rAthenaConsole
  14. {
  15.     public partial class mainForm : Form
  16.     {
  17.  
  18.  
  19.         //=====================================================================
  20.         //== Main Form
  21.         //=====================================================================
  22.         public mainForm()
  23.         {
  24.            
  25.            
  26.  
  27.             InitializeComponent();
  28.         }
  29.  
  30.  
  31.  
  32.         //=====================================================================
  33.         //== Bottone Start
  34.         //=====================================================================
  35.         private void btn_startServer_Click(object sender, EventArgs e)
  36.         {
  37.             Task.Run(() => RunChar("V:\\rAthena\\char-server.exe"));
  38.             Task.Run(() => RunMap("V:\\rAthena\\map-server.exe"));
  39.             Task.Run(() => RunLogin("V:\\rAthena\\login-server.exe"));
  40.  
  41.             //Run("V:\\miacartella\\programma.exe");
  42.         }
  43.  
  44.  
  45.  
  46.         //=====================================================================
  47.         //== Bottone Stop  
  48.         //=====================================================================
  49.         private void btn_stopServer_Click(object sender, EventArgs e)
  50.         {
  51.  
  52.         }
  53.  
  54.  
  55.         //=====================================================================
  56.         //== Funzione Run Char
  57.         //=====================================================================
  58.         void RunChar(string pathProcess)
  59.         {
  60.             try
  61.             {
  62.  
  63.                 //Char Server
  64.                 var process = new Process
  65.                 {
  66.                     StartInfo = new ProcessStartInfo
  67.                     {
  68.                         FileName = pathProcess,
  69.                         //Arguments = "behavior query SymlinkEvaluation",
  70.                         UseShellExecute = false,
  71.                         RedirectStandardOutput = true,
  72.                         CreateNoWindow = true
  73.                     }
  74.                 };
  75.  
  76.                 process.Start();
  77.  
  78.                 while (!process.StandardOutput.EndOfStream)
  79.                 {
  80.                     var line = process.StandardOutput.ReadLine();
  81.                     rtb_charServer.AppendText(line);
  82.                     //return line;
  83.                 }
  84.  
  85.                 process.WaitForExit();
  86.  
  87.             }
  88.             catch (Exception o)
  89.             {
  90.                 Console.WriteLine(o.Message);
  91.             }
  92.  
  93.      
  94.         }
  95.  
  96.         //=====================================================================
  97.         //== Funzione Run Map
  98.         //=====================================================================
  99.         void RunMap(string pathProcess)
  100.         {
  101.             try
  102.             {
  103.  
  104.                 //Char Server
  105.                 var process = new Process
  106.                 {
  107.                     StartInfo = new ProcessStartInfo
  108.                     {
  109.                         FileName = pathProcess,
  110.                         //Arguments = "behavior query SymlinkEvaluation",
  111.                         UseShellExecute = false,
  112.                         RedirectStandardOutput = true,
  113.                         CreateNoWindow = true
  114.                     }
  115.                 };
  116.  
  117.                 process.Start();
  118.  
  119.                 while (!process.StandardOutput.EndOfStream)
  120.                 {
  121.                     var line = process.StandardOutput.ReadLine();
  122.                     rtb_mapServer.AppendText(line);
  123.                     //return line;
  124.                 }
  125.  
  126.                 process.WaitForExit();
  127.  
  128.             }
  129.             catch (Exception o)
  130.             {
  131.                 Console.WriteLine(o.Message);
  132.             }
  133.  
  134.  
  135.         }
  136.  
  137.         //=====================================================================
  138.         //== Funzione Run Login
  139.         //=====================================================================
  140.         void RunLogin(string pathProcess)
  141.         {
  142.             try
  143.             {
  144.  
  145.                 //Char Server
  146.                 var process = new Process
  147.                 {
  148.                     StartInfo = new ProcessStartInfo
  149.                     {
  150.                         FileName = pathProcess,
  151.                         //Arguments = "behavior query SymlinkEvaluation",
  152.                         UseShellExecute = false,
  153.                         RedirectStandardOutput = true,
  154.                         CreateNoWindow = true
  155.                     }
  156.                 };
  157.  
  158.                 process.Start();
  159.  
  160.                 while (!process.StandardOutput.EndOfStream)
  161.                 {
  162.                     var line = process.StandardOutput.ReadLine();
  163.                     rtb_loginServer.AppendText(line);
  164.                     //return line;
  165.                 }
  166.  
  167.                 process.WaitForExit();
  168.  
  169.             }
  170.             catch (Exception o)
  171.             {
  172.                 Console.WriteLine(o.Message);
  173.             }
  174.  
  175.  
  176.         }
  177.  
  178.  
  179.     }
  180. }




purtroppo ho letto alcune guide e questo sono riuscito a fare xD voglio capire xò dove sto sbagliando e come fare un programma simile fatto in modo corretto.... grazie per il supporto ^^

Ultima modifica effettuata da Gemini il 05/10/2021 alle 20:39
PM Quote
Avatar
Gemini (Normal User)
Newbie


Messaggi: 7
Iscritto: 04/10/2021

Segnala al moderatore
Postato alle 20:32
Martedì, 05/10/2021
POST SBAGLIATO SCUSATEMI!!!

Ultima modifica effettuata da Gemini il 05/10/2021 alle 20:34
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2105
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 12:21
Mercoledì, 06/10/2021
dunque gemini, il codice in se' è corretto.
Ma manca un particolare importante.
Il WorkingDirectory.

Il WorkingDirectory e in pratica un opzione che indica come se il programma venisse lanciato da quella determinata cartella.

Lanciandolo invece dal tuo exe senza una working directory, l'eseguibile di eAthena non trova i file necessari per avviarsi.

Generalmente, si utilizzano percorsi relativi quando si sviluppa un'applicazione.
Quindi se cerchi di avviare un exe che deve leggere determinati file, e vari settaggi e utile settare una workingdirectory.

Con i Task, non mi trovo a mio agio.
Preferisco usare il classici Thread...

Sono la stessa cosa?
Diciamo che fanno la medisima cosa ma in modo differente.

Sono tradizionalista,preferisco le vecchie maniere che sono sempre le migliori.
Ancora preferisco scrivermi Motori 3D usando le DXSDK che utilizzare motori già fatti :rotfl:

Quindi al StartInfo, Aggiungi l'opzione WorkingDirectory al percorso dove è situato l'eseguibile che vuoi lanciare.

Ti ho fatto un piccolo esempio utilizzando i Thread al posto dei Task.
In allegato il zip

https://i.ibb.co/r4MmW1X/cattura.jpg


Thejuster ha allegato un file: eaRunner.zip (48121 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da Thejuster il 06/10/2021 alle 12:34


PM Quote
Avatar
Gemini (Normal User)
Newbie


Messaggi: 7
Iscritto: 04/10/2021

Segnala al moderatore
Postato alle 19:08
Mercoledì, 06/10/2021
Grazie Thejuster mi piace come spieghi e fai capire le cose ^^..... comunque ho risolto grazie al tuo consiglio e grazie anche per l'esempio dell'invoke e delegate che andrò ad approfondire meglio.... comunque posto il mio codice l'ho modificato invece di usare 3 funzioni diverse per ogni processo ho creato una sola funzione che passo l'indirizzo del processo e un id che mi identifica il processo per postare sulla richbox giusta ogni output...è un po grezza voglio vedere se posso ritornare un id del thread o qualcosa di simile per evitare di passare al metodo Run il parametro idProcess. Poi vedrò un pò su google comunque ecco il codice e funziona perfettamente l'unica cosa se posso chidere non voglio andare fuori topic (ma è normale che ci mette molto ad avviare il server.? cioè se avvio il file bat runserver.bat ci mette 1 minuto? a caricare login char e map....mentre ho notato che anche con questo programma è lento nel caricare il map?? forse xke e un ritardo di output? ) xò non voglio andare fuori topic mi fermo qui e se puoi accenarmi qualcosa te ne sarei grato... ^^

Codice sorgente - presumibilmente C++

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. using System.Windows.Forms;
  12.  
  13. namespace rAthenaConsole
  14. {
  15.     public partial class mainForm : Form
  16.     {
  17.  
  18.         Thread t_char, t_map, t_login;
  19.  
  20.         //=====================================================================
  21.         //== Main Form
  22.         //=====================================================================
  23.         public mainForm()
  24.         {
  25.            
  26.            
  27.  
  28.             InitializeComponent();
  29.         }
  30.  
  31.  
  32.  
  33.         //=====================================================================
  34.         //== Bottone Start
  35.         //=====================================================================
  36.         private void btn_startServer_Click(object sender, EventArgs e)
  37.         {
  38.            
  39.             t_char = new Thread(() => Run(@"V:\rAthena\LOCAL\server\char-server.exe",1)); //Char
  40.             t_map = new Thread(() => Run(@"V:\rAthena\LOCAL\server\map-server.exe", 2)); //Map
  41.             t_login = new Thread(() => Run(@"V:\rAthena\LOCAL\server\login-server.exe", 3)); //Login
  42.  
  43.             t_char.Start();
  44.             t_map.Start();
  45.             t_login.Start();
  46.  
  47.         }
  48.  
  49.  
  50.  
  51.         //=====================================================================
  52.         //== Bottone Stop  
  53.         //=====================================================================
  54.         private void btn_stopServer_Click(object sender, EventArgs e)
  55.         {
  56.  
  57.         }
  58.  
  59.  
  60.         //=====================================================================
  61.         //== Metodo Run
  62.         //=====================================================================
  63.         private void Run(string processPath, int idProcess) //idProcess = || 1 Char || 2 Map || 3 Login || //Per identificare il processo e utilizzare diverse richbox
  64.         {
  65.             try
  66.             {
  67.  
  68.                 //Char Server
  69.                 var process = new Process
  70.                 {
  71.                     StartInfo = new ProcessStartInfo
  72.                     {
  73.                         FileName = processPath,
  74.                         UseShellExecute = false,
  75.                         RedirectStandardOutput = true,
  76.                         CreateNoWindow = true,
  77.                         WorkingDirectory = @"V:\rAthena\LOCAL\server"
  78.                     }
  79.                 };
  80.  
  81.                 process.Start();
  82.  
  83.                 while (!process.StandardOutput.EndOfStream)
  84.                 {
  85.                     if(idProcess == 1) //Char
  86.                     {
  87.                         Invoke(new Action(delegate { rtb_charServer.AppendText(process.StandardOutput.ReadLine() + "\n"); rtb_charServer.ScrollToCaret(); }));
  88.                     }
  89.                     else if (idProcess == 2) //Map
  90.                     {
  91.                         Invoke(new Action(delegate { rtb_mapServer.AppendText(process.StandardOutput.ReadLine() + "\n"); rtb_mapServer.ScrollToCaret(); }));
  92.                     }
  93.                     else if (idProcess == 3) //Login
  94.                     {
  95.                         Invoke(new Action(delegate { rtb_loginServer.AppendText(process.StandardOutput.ReadLine() + "\n"); rtb_loginServer.ScrollToCaret(); }));
  96.                     }
  97.                     else
  98.                     {
  99.                         Invoke(new Action(delegate { rtb_loginServer.AppendText("Errore nessun idProcess dichiarato\n"); rtb_loginServer.ScrollToCaret(); }));
  100.                         Invoke(new Action(delegate { rtb_mapServer.AppendText("Errore nessun idProcess dichiarato\n"); rtb_mapServer.ScrollToCaret(); }));
  101.                         Invoke(new Action(delegate { rtb_charServer.AppendText("Errore nessun idProcess dichiarato\n"); rtb_charServer.ScrollToCaret(); }));
  102.                     }
  103.                 }
  104.  
  105.                 process.WaitForExit();
  106.  
  107.             }
  108.             catch (Exception o)
  109.             {
  110.                 Console.WriteLine(o.Message);
  111.             }
  112.         }
  113.  
  114.     }
  115. }





Gemini ha allegato un file: piueroTofy.png (41199 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da Gemini il 06/10/2021 alle 19:09
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2105
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 20:57
Mercoledì, 06/10/2021
No tranquillo,
Fin quando l'argomento è relativo al topic non si va in OT.

Il problema non dipende ne da te, e ne da me.
Puoi stare tranquillo che anche a me succede la stessa cosa.

Principalmente, dipende dal fatto che stai usando rAthena e non eAthena.
rAthena gira su un'architettura differente da eAthena.

Perché eAthena per i computer dell'epoca, era necessaria più velocità e leggerezza rispetto ad un moderno processore.
Quindi e stato progettato diversamente, ma anche con funzioni molto limitate.
Difatti puoi ricordare che gli NPC erano interpretati tramite un semplici comandi. molto differenti da ora che sono
interpretati dal LUA.

rAthena essendo a 64bit, ovviamente ha più potenziale e personalizzazioni rispetto al vecchio x86.
Ma ne risente il processore.

Oltre al fatto di essere stato completamente riscritto, sfrutta nuovi link moderni e librerie di interprete come il LUA.
che richiedono un pò di più per essere interpretati e messi in esecuzione in ram.
Questo anche perché il nuovo Client, è stato modificato per supportare il lua.

Quindi molte componenti del nuovo client agiscono tramite lua ed inviano pacchetti serializzati in modo differente.
per ottenere nuove grafiche come la nuova UI, le Quest, gli Archivement, ed integrazioni.

Insomma per dirla breve, il caricamento e lento perché il sistema di ri-elaborazione di script e di funzionalità e completamente diverso rispetto a prima.

Pensa che sono riuscito a modificare il sorgente di rAthena e realizzare un BOT Discord intercomunicante.
Nel senso che scrivi da discord, appare in gioco.
Scrivi dal gioco, appare in discord.

ecco, questo è un esempio di cosa si può fare e cosa non si può fare con il nuovo rAthena.
Screen allegata

in pratica ho virtualizzato un canale al posto di un nickname privato usando #  come segnale di un canale discord.



Thejuster ha allegato un file: 3BntwI.png (803134 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da Thejuster il 06/10/2021 alle 20:59


PM Quote
Avatar
Gemini (Normal User)
Newbie


Messaggi: 7
Iscritto: 04/10/2021

Segnala al moderatore
Postato alle 21:27
Mercoledì, 06/10/2021
sisi ho visto gia server che hanno implementato discord in game tipo novaro.... comunque vabbe non si può volere tutto nella vita xD mi arrangerò a questo problema..... ma un'altra cosa sempre senza andare OT ma ho provato a usare process.kill e process.Close.. sia in thread che senza ma non mi chiude i processi


Codice sorgente - presumibilmente C++

  1. //=====================================================================
  2.         //== Bottone Stop  
  3.         //=====================================================================
  4.         private void btn_stopServer_Click(object sender, EventArgs e)
  5.         {
  6.             /*t_char = new Thread(() => */Stop(@"V:\rAthena\LOCAL\server\char-server.exe", 1)); //Char
  7.             /*t_map = new Thread(() => */Stop(@"V:\rAthena\LOCAL\server\map-server.exe", 2)); //Map
  8.             /*t_login = new Thread(() => */Stop(@"V:\rAthena\LOCAL\server\login-server.exe", 3)); //Login




Codice sorgente - presumibilmente C#

  1. //=====================================================================
  2.         //== Metodo Stop
  3.         //=====================================================================
  4.         private void Stop(string processPath, int idProcess) //idProcess = || 1 Char || 2 Map || 3 Login || //Per identificare il processo e utilizzare diverse richbox
  5.         {
  6.            
  7.             Process[] _proceses = null;
  8.                         _proceses = Process.GetProcessesByName(processPath);
  9.                         foreach (Process proces in _proceses)
  10.                         {
  11.                  if (idProcess == 1) //Char
  12.                     {
  13.                         proces.Kill();
  14.                     }
  15.                      else if (idProcess == 2) //Map
  16.                     {
  17.                         proces.Kill();
  18.                     }
  19.                     else if (idProcess == 3) //Login
  20.                     {
  21.                         proces.Kill();
  22.                     }
  23.                     else
  24.                     {
  25.                         Invoke(new Action(delegate { rtb_loginServer.AppendText("Errore nessun idProcess dichiarato\n"); rtb_loginServer.ScrollToCaret(); }));
  26.                         Invoke(new Action(delegate { rtb_mapServer.AppendText("Errore nessun idProcess dichiarato\n"); rtb_mapServer.ScrollToCaret(); }));
  27.                         Invoke(new Action(delegate { rtb_charServer.AppendText("Errore nessun idProcess dichiarato\n"); rtb_charServer.ScrollToCaret(); }));
  28.                     }
  29.                                
  30.                         }



anche se chiudo il programma normalmente devo chiudere i processi in gestione attività... sto vedendo un pò su internet ma tutti mi dicono di usare process.kill però non va.... forse sbaglio io qualcosa....sempre la WorkDirectory?

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2105
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 22:29
Mercoledì, 06/10/2021
In questo caso hai avviato dei Thread, il processo fa parte del Thread da cui è stato avviato.
Ed il processo dipende unicamente da quel / quei  Thread.

il Metodo Invoke non è tanto diverso da un void Volatile, ma a quello servono altri accorgimenti.


Se hai notato, nel mio esempio ti avevo dichiarato i 3 Thread esterni ai vari void.
Questo proprio per poterli interrompere in qualsiasi altro momento.

in questo caso, basta semplicemente fare:

Codice sorgente - presumibilmente C# / VB.NET

  1. Thread t_char, t_map, t_login;
  2.  
  3.  
  4.  //Prima della chiusura del form o alla pressione di un pulsante
  5.  t_char.Abort();
  6.  t_map.Abort();
  7.  t_login.Abort();



:ot:
Ultimo OT :rotfl:
Il mio sistema di discord invece è un tantino diverso da quelli presenti.
E' un pò unico nel suo genere. Ha perfino un MPV Tracker che annuncia in Chat l'uccisione di un MVP e altre cose carine.



Thejuster ha allegato un file: Cattura.JPG (53969 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da Thejuster il 06/10/2021 alle 22:35


PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo