Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    [c#] Comunicare tra 2 progetti

    Salve,
    ho 2 progetti, uno Win Form "A" e uno Console "B"

    il progetto "A" contiene una classe Pubblica "MyClass"
    il progetto "B" deve fare una ricerca in una data Directory,

    1) A avvia B tramite "Process.Start(B.exe)"
    2) B cerca sulla directory "Backup" e comunica subito alla classe "MyClass" in B
    3) A esegue delle operazioni a seconda del risultato di B

    la domanda:
    una volta che "A" avvia "B", poi "B" in che modo comunica alla classe "MyClass" su "A" ???

    - io ho provato a importare "A.exe" come Riferimento in "B",
    - la vedo ma posso solo fare una nuova istanza e poi usarla,
    - ma non comunicare all'istanza creara in "A".

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Non so se sia possibile comunicare tra due applicazioni , ma credo non sia necessario !

    il codice del progetto B , " che fa una ricerca in una Directory" lo inserisci in una nuova
    classe del progetto A.
    Nel progetto A crei un istanda della classeB , e richiami il metodo che ti serve , il
    valore che restituice lo userari nell'istanza della classe A nel suo costruttore o come parametro , richiamando un suo metodo !
    Tecnologia

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Tra due processi (non progetti) si comunica con tutti gli strumenti tipici della "comunicazione interprocesso". Ad esempio, memoria condivisa o socket.

    Detto questo, come ti è stato suggerito, non puoi riunire i due codici in uno solo?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Perchè farlo fare ad una appConsole questo lavoro? non puoi farla da dentro A magari utilizzando le classi di B? Cioè un metodo dentro la classe di A che, avendo B tra i riferimenti, fa pari pari quello che fa il main di B.

    In ogni caso, se proprio devi farlo cosi, il massimo che puoi fare e rendere il main un metodo che ritorna un int (il codice di uscita, sei tu a darlo alla fine dle main). Da A usa il process ottenuto da process.start piu o meno cosi

    codice:
    process.WaitforExit();
    if (process.Exitcode == 0)
       //ok
    else
       if (proces.exitCode == 1)
    //ecc. ecc..
    Forse con Powershell invece che una appconsole si potrebbe fare qualcosa di piu articolato ma non saprei come aiutarti.

    EDIT: sono arrivato un po' tardi:P

  5. #5
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Peraltro dopo aver letto la risposta di Oregon ed aver visto al volo un po su google dovrei rimangiarmi anche "il massimo che puoi fare" del mio post precedente.

  6. #6
    Originariamente inviato da oregon
    Tra due processi (non progetti) si comunica con tutti gli strumenti tipici della "comunicazione interprocesso". Ad esempio, memoria condivisa o socket.

    Detto questo, come ti è stato suggerito, non puoi riunire i due codici in uno solo?
    avevo già pensato ad un socket in ascolto su "A" dove "B" ci spara il suo risultato, solo che "A" mi sta in ascolto per tutto il giorno buttando giù il processore, sbaglio ?


    per rispondere a: torn24
    Non so se sia possibile comunicare tra due applicazioni , ma credo non sia necessario !
    "A" deve avviare molti processi Asincroni e aspettare le loro risposte, ci sono più PC da monitorare e ogniuno ha la sua lentezza.

    Ho provato con i Thread, ma mi sono incasinato fino a prendere un esaurimento, questo non significa ceh se avete una soluzione con i Thread non la utilizzi...

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da w_t
    avevo già pensato ad un socket in ascolto su "A" dove "B" ci spara il suo risultato, solo che "A" mi sta in ascolto per tutto il giorno buttando giù il processore, sbaglio ?
    Sbagli ... ci sono decine di socket che ascoltano in un PC per svariati motivi ...


    "A" deve avviare molti processi Asincroni e aspettare le loro risposte, ci sono più PC da monitorare e ogniuno ha la sua lentezza.
    Si risolve con i thread ...

    Ho provato con i Thread, ma mi sono incasinato fino a prendere un esaurimento, questo non significa ceh se avete una soluzione con i Thread non la utilizzi...
    T'ho già detto ... si risolve con i thread ... se hai problemi, non devi inventarti altre "strane soluzioni" (che comunque non sarebbero più semplici) ma indicare e risolvere i problemi.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Avevo fatto questo in precedenza, ma mi è sfuggita di mano la gestione dei Thread.

    codice:
            private void Start()
            {
                Computer oComputer;
                int iLoop = 0;
                int iMaxLoop = 10;
    
                //Elenco PC - ( ..potrebbero variare di numero... )
                ArrayList aComputerList = new ArrayList();
    
                aComputerList.Add(new Computer("192.168.1.5", "D:\\Backup\\Backup_2012_04_12\\", "myFile.txt"));
                aComputerList.Add(new Computer("192.168.1.10", "D:\\Backup\\Backup_2012_04_12\\", "myFile.txt"));
                aComputerList.Add(new Computer("192.168.1.15", "D:\\Backup\\Backup_2012_04_12\\", "myFile.txt"));
                aComputerList.Add(new Computer("192.168.1.20", "D:\\Backup\\Backup_2012_04_12\\", "myFile.txt"));
                aComputerList.Add(new Computer("192.168.1.25", "D:\\Backup\\Backup_2012_04_12\\", "myFile.txt"));
    
                //Creoo un Loop che non termina mai fino al raggiungimento di "iMaxLoop".
                for (int i = 0; i < aComputerList.Count; i++)
                {
                    //Esco dal Loop
                    if (iLoop >= iMaxLoop)
                    {
                        MessageBox.Show("Fine Loop!");
                        return;
                    }
    
                    //Assegno l'istanza da utilizzare nel Loop corrente
                    oComputer = (Computer)aComputerList[i];
    
                    //Di Default lo Stato è "Libero", cioè questa istanza non è impegnata con la Ricerca
                    if (oComputer.Status == false)
                    {
                        oComputer.Status = true; //Imposto lo stato di ricerca a "Occupato", cioè stà cercando
    
                        t = new Thread(new ParameterizedThreadStart(Cerca));
                        t.Start(oComputer);
                    }
    
                    //Se i Computer sono finiti, riparto dal primo
                    if (i == (aComputerList.Count - 1))
                    {
                        i = -1;
                    }
                }
            }
    
    
    
            public void Cerca(object _oComputer)
            {
                if (_oComputer != null)
                {
                    //Ricerca------
                    // --- code ---
    
                    //Appena ho il risultato cercato lo passo al metodo "Result"
                    ((Computer)_oComputer).Result = "il-mio-risultato";
    
                    Thread.Sleep(60000);
    
                    //Imposto lo stato di ricerca a "Libero", cosi 
                    ((Computer)_oComputer).Status = false;
                }
            }
    La dinamica dovrebbe essere la seguente:

    1) parte il Loop dei Computer e quindi si avviano contemporaneamente 5 ricerche.
    "ogni Computer ha più o meno file da scansionare, quindi i tempi sono diversi"

    2) appena un processo tra i 5 avviati finisce, deve passare il risultato a "Start()" e non deve ripartire prima 1ora.

    Questi due passaggi si ripetono per 8 volte.

  9. #9
    scusate ma nel riscrivere il codice avevo fatto degli errori, questo è quello funzionante ciciamo....

    Come faccio per passare da "Cerca()" a "Start()" il risultato trovato dalla ricerca "il-mio-risultato" ???

    codice:
            private void Start()
            {
                Computer oComputer;
                int iLoop = 0;
                int iMaxLoop = 10;
    
                //Elenco PC - ( ..potrebbero variare di numero... )
                ArrayList aComputerList = new ArrayList();
    
                aComputerList.Add(new Computer("192.168.1.5", "D:\\Backup\\Backup_2012_04_12\\", "myFile.txt"));
                aComputerList.Add(new Computer("192.168.1.10", "D:\\Backup\\Backup_2012_04_12\\", "myFile.txt"));
                aComputerList.Add(new Computer("192.168.1.15", "D:\\Backup\\Backup_2012_04_12\\", "myFile.txt"));
                aComputerList.Add(new Computer("192.168.1.20", "D:\\Backup\\Backup_2012_04_12\\", "myFile.txt"));
                aComputerList.Add(new Computer("192.168.1.25", "D:\\Backup\\Backup_2012_04_12\\", "myFile.txt"));
    
                //Creoo un Loop che non termina mai fino al raggiungimento di "iMaxLoop".
                for (int i = 0; i < aComputerList.Count; i++)
                {
                    //Esco dal Loop
                    if (iLoop >= iMaxLoop)
                    {
                        MessageBox.Show("Fine Loop!");
                        return;
                    }
    
                    //Assegno l'istanza da utilizzare nel Loop corrente
                    oComputer = (Computer)aComputerList[i];
    
                    //Di Default lo Stato è "Libero", cioè questa istanza non è impegnata con la Ricerca
                    if (oComputer.Status == false)
                    {
                        oComputer.Status = true; //Imposto lo stato di ricerca a "Occupato", cioè stà cercando
    
                        t = new Thread(new ParameterizedThreadStart(Cerca));
                        t.Start(oComputer);
    
                        //Incremento la lettura delle ore
                        iLoop++;
                    }
    
                    //Se i Computer sono finiti, riparto dal primo
                    if (i == (aComputerList.Count - 1))
                    {
                        i = -1;
                    }
                }
            }
    
    
            public void Cerca(object _oComputer)
            {
                if (_oComputer != null)
                {
                    //Ricerca------
                    // --- code ---
    
                    //Appena ho il risultato cercato lo passo al metodo "Result"
                    ((Computer)_oComputer).Result = "il-mio-risultato";
    
                    Thread.Sleep(3000);
    
                    //Imposto lo stato di ricerca a "Libero"
                    ((Computer)_oComputer).Status = false;
                }
            }

  10. #10
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Originariamente inviato da w_t

    La dinamica dovrebbe essere la seguente:

    1) parte il Loop dei Computer e quindi si avviano contemporaneamente 5 ricerche.
    "ogni Computer ha più o meno file da scansionare, quindi i tempi sono diversi"

    2) appena un processo tra i 5 avviati finisce, deve passare il risultato a "Start()" e non deve ripartire prima 1ora.

    Questi due passaggi si ripetono per 8 volte.
    quindi per 8 volte queste 5 (o piu) istanze della classe computer devono svolgere un operazione lunga a testa (la scansione). giusto o mi sbaglio? lo chiedo perche anche leggendo il codice non è molto chiaro.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.