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

    [VB.NET] Processo in Background ?

    chiedo venia se magari ho sbagliato sezione..

    ho bisogno di sapere come mandare l'esecuzione di qualsiasi processo in backgroud...

    per esempio mentre il programma è in attesa che l'utente immetta un valore tramite l'interfaccia INPUTBOX, in questa attesa voglio che sia lanciata l'esecuzione di una SUB?

    PS: in Unix bastava il segno "&" a fine istruzione per mandarla in backgroud..In VB.NET è così semplice?
    Michele

  2. #2
    Lo stile di programmazione in VB.NET credo sia molto diverso da quello con il quale eri abituato in UNIX. La finestra InputBox è modale rispetto al resto dell'applicazione, ciò significa che fino a quando l'utente non chiude questa finestra l'esecuzione del resto del programma non potrà continuare. Esistono diverse alternative, la più semplice è quella di progettare un form in sostituzione di InputBox e dal suo codice chiamare una sub definita nel form principale o altrove.
    Chi non cerca trova.

  3. #3
    si appunto (non mi sono espresso bene)... l'esecuzione del programma principale si deve fermare da permettere all'utente di inserire un valore e dare OK alla finestra modale InputBox... Però, hai presente che a livello umano per scrivere una stringa dalla tastiera si impiegano alcuni secondi!?? Bene io vorrei che quel tempo morto fosse impiegato per processare una SubRoutine (lanciata in prima in background) che carica ed elabora un bel pò di file e processi per conto suo! Faccio un piccolo esempio di codice che intendo sviluppare:

    codice:
    avvio programma.....
    .............
    
        Call Carica()  ' <-- questa sub deve essere lanciata in background consentendo al programma principale di portarsi all'instruzione successiva senza attendere il termine di questa SUB...
        
        CodiceOperatore=ImputBox("Immettere il codice Operatore",vbok,"Utente") ' <-- attesa di input da parte dell'utente (a sto punto ho già la sub che sta processando ed elaborando in background le sue cose) 
    
     .......... A sto punto aspetta che la Sub Carica() sia terminata, ma questo non è un problema
    a me basterebbe che la sub fosse lanciata in background e parallelamente continuasse con l'istruzione successiva (in questo caso inputbox)...possibile che non si possa fare una cosa del genere?

    @tas...come hai detto di fare, ci sarebbe solo quella come alternativa ?
    Michele

  4. #4
    Per l'elaborazione parallela puoi sempre lanciare un thread. Su internet trovi parecchia roba, MSDN tratta ampiamente la questione:
    http://msdn.microsoft.com/en-us/libr...v=VS.100).aspx
    Chi non cerca trova.

  5. #5
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    Volendo puoi leggere anche qui e qui



    Le vie del Signore sono infinite. È la segnaletica che lascia a desiderare.
    La luce viaggia più veloce del suono. Per questo alcune persone sembrano brillanti finchè non parlano.
    Occhio per occhio uguale... occhio al quadrato

  6. #6
    Originariamente inviato da ShaleN
    Volendo puoi leggere anche qui e qui



    ehh è proprio quello stavo leggendo... ho finito adesso di implementare:

    codice:
            Dim T As New Threading.Thread(AddressOf Carica)
            T.Start("Tutto")
            codiceUtente=InputBox("Immettere il codice utente.", "Inizio..")
    
            T.Join()
    tutto perfetto, per come volevo io, senza presunti errori nel codice sono riuscito a passargli anche un parametro "Tutto" e fin qua tutto OK

    ma il risultato non è stato gradito! i controlli e gli oggetti del form non vengono aggiornati se modificati nel thread (textbox, datagrid, e tutto ciò che fa parte di un forms), come mai?

    esempio:

    ElencoForm.TextConta.text = Conta.ToString <<--- dove conta è un conteggio a fine ciclo ed è pure una variabile publica
    ElencoForm.Statusbar1.text = " File xxxx caricato ..."
    ........
    ........

    è così per altri riferimenti al form che alla fine non subiscono nessun cambiamento!!!
    stranissimo, eppure quei riferimenti vengono processati senza provocare nussun errore
    e come mai con le variabili e matrici dichiarate pubbliche funziona tutto (come "Conta" che viene processata e restituisce il giusto valore??)..allora ho provato a cambiare proprietà degli oggetti del form "mofifier" da Friend a Public, ma nulla è cambiato

    madòòò una domenica persa appresso a sta cosa
    Michele

  7. #7
    Dall'interno del thread non è possibile modificare direttamente le proprietà dei controlli, in quanto la parte grafica si trova in un thread diverso. Per modificare le proprietà devi avvalerti del metodo Invoke, vedi questo esempio:
    http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx
    Chi non cerca trova.

  8. #8
    ok proverò a studiare questo nuovo metodo, Invoke di delegazioni... alla fine sto programma dovrà essere invulnerabile da virus
    Michele

  9. #9
    Buongiorno a tutti.

    oggi un altro piccolo passo avanti, seguito da un altro passo indietro..:
    ora riesco a processare la mia SUB in background ed apportate le modifiche al form nel mentre il programma principale è in attesa per la finestra modale di InpuBox.
    sono arrivato anche passargli un parametro alla sub (non tramite il comando Thread.Start, ma tramite la chiamata successiva alla subThreading...ma questo non è un grosso problema...)

    il problema è che quando ho terminato di immettere da tastiera la stringa nella inputbox e dò l'OK, assolutamente la finestra rimane aperta fino a quando il thread in background abbia terminato il suo processo , (purtroppo non capisco il perchè e come sia possibile sto fenomeno) .. non dovrebbe andare avanti chiudendo la finestra e proseguendo nel codice??


    vi posto tutto il codice d'esempio (si tratta dell'esempio di MSDN che ho adattato alla Mia SUB CARICA(S as string) emulando processi in background (in questo caso riempie ListBox), con l'aggiunta della chiamata parallela a Inputbox (stilata nel codice di Button_Click)

    codice:
    Imports System
    Imports System.Drawing
    Imports System.Windows.Forms
    Imports System.Threading
    
    Public Class MyFormControl
        Inherits Form
    
        Delegate Sub ModifierForm(ByVal s As String)
        Public myDelegate As ModifierForm
    
        Private myButton As Button
        Private myThread As Thread
        Private myListBox As ListBox
    
        Public Sub New()
            myButton = New Button()
            myListBox = New ListBox()
            myButton.Location = New Point(72, 160)
            myButton.Size = New Size(152, 32)
            myButton.TabIndex = 1
            myButton.Text = "Add items in list box"
            AddHandler myButton.Click, AddressOf Button_Click
            myListBox.Location = New Point(48, 32)
            myListBox.Name = "myListBox"
            myListBox.Size = New Size(200, 95)
            myListBox.TabIndex = 2
            ClientSize = New Size(292, 273)
            Controls.AddRange(New Control() {myListBox, myButton})
            Text = " 'Control_Invoke' example"
            myDelegate = New ModifierForm(AddressOf Carica)
        End Sub 'New
    
        Shared Sub Main()
            Dim myForm As New MyFormControl()
            myForm.ShowDialog()
        End Sub 'Main
    
        Public Sub Carica(ByVal S As String)
            'Questa sub simula originariamente il Caricamento file e modifica del form
            ' il parametro S farà riferimento ad un select case S
            '
            '..............
            '..............             codice
            '..............
            '
    
            ' questo codice emula il processo in elabolazione
            For I As Long = 0 To 20000
                myListBox.Items.Add(I)
                myListBox.Update()
    
                Application.DoEvents()
            Next I
    
    
            'Fine Sub
        End Sub
    
        Private Sub Button_Click(ByVal sender As Object, ByVal e As EventArgs)
            Dim S As String = "Tutto"
            myThread = New Thread(New ThreadStart(AddressOf ThreadFunction))
            myThread.Start()
    
            InputBox("Prova", "Prova InputBox")  '<<<--- si bocca quà e non va avanti nonostante sia premuto OK??????
    
            Beep()  '<<---questo punto, viene eseguito solo se MyThred è termitato!! Come mai?????
    
        End Sub 'Button_Click
    
        Private Sub ThreadFunction()
            Dim S As String = "Tutto"
            Dim myThreadClassObject As New MyThreadClass(Me, S)
            myThreadClassObject.Run()
        End Sub
    End Class 'MyFormControl
    
    
    ' The following code assumes a 'ListBox' and a 'Button' control are added to a form, 
    ' containing a delegate which encapsulates a method that adds items to the listbox.
    Public Class MyThreadClass
        Private myFormControl1 As MyFormControl, Stringa As String
    
        Public Sub New(ByVal myForm As MyFormControl, ByVal S As String)
            myFormControl1 = myForm
            Stringa = S
        End Sub 'New
    
        Public Sub Run()
            ' Execute the specified delegate on the thread that owns
            ' 'myFormControl1' control's underlying window handle.
            myFormControl1.Invoke(myFormControl1.myDelegate, Stringa)
        End Sub 'Run
    
    End Class 'MyThreadClass

    per cortesia, sto passando troppo tempo su questa implementazione, qualcuno mi può dare una dritta per poter andare avanti!!

    Grazie ancora
    Michele

  10. #10
    c'è qualcosa che non và come dovrebbe e non riesco a capire proprio cosa sià...il parallelismo non và come dovrebbe..dall'esempio precedente ho provato a togliere la riga di InputBox sostituendo con una semplice riga di scrittura testo e il problema è sempre lo stesso..il processo principale non prosegue oltre la prima instruzione subito dopo aver lanciato il thread.start..

    esempio:

    codice:
    ........
    
            myThread = New Thread(New ThreadStart(AddressOf ThreadFunction))
            myThread.Start()    '<< lancia il thread
    
            Debug.WriteLine("Prima istruzione dopo l'avvio del thread") '<--- scrive una riga nella finestra di debug
    
    
    ''''''''''''quà si blocccaa e non va avanti finchè il thread non cessa la sua attività
    
            Debug.WriteLine("Seconda Instruzione ...)  '<--- viene eseguta solo dopo che il thread cessa di vivere
    
    .........
    Michele

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.