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

    [VB.NET] Creare subroutine "Ciclica"

    Ciao ragazzi
    ho un problema (un altro ? si ) con Vb.net 2010

    piu che un problema pratico è un po teorico perchè vorrei creare una specie di processo infinito che venga eseguito in backgroud dalla mia applicazione , come si potrebbe fare?
    Programmatore - Consulenza informatica -
    Web Design - Professionista I.T.
    ---------------------------------------
    http://www.malorgio.it

  2. #2
    se non ho capito male dovrei gestire il multithreading ... ma qualcuno lo ha mai fatto?
    Programmatore - Consulenza informatica -
    Web Design - Professionista I.T.
    ---------------------------------------
    http://www.malorgio.it

  3. #3
    Originariamente inviato da ClaudioMalorgio
    se non ho capito male dovrei gestire il multithreading ... ma qualcuno lo ha mai fatto?
    Confermo, devi creare un thread che gestisce la tua operazione in maniera indipendente dal programma stesso. Cerca la sintassi su Internet e se hai problemi, posta pure.


    Ciao

  4. #4
    Ho creato una classe dove ho inserito le mie funzioni per il thread ,
    ora ho creato una barra dei menu con la voce File e sottovoce "Connetti" , alla pressione della voce connetti dovrebbe avviarmi il thread . per fare ciò utilizzo il componente Visual studio backgroundworker , solo che non sembra funzionare come si deve

    codice:
    imports smspanel.lavoro 
    
    
    altro codice ...
    
    ...
    ....
    
    
    Private Sub ConnettiToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConnettiToolStripMenuItem.Click
            Dim lavoro As New Lavoro
            BackgroundWorker1.RunWorkerAsync(lavoro)
    End Sub
    Classe lavoro

    codice:
    Imports System.Data
    Imports System.Data.OleDb
    Imports System.Diagnostics
    Imports System.Threading
    Imports System.Net.Dns
    
    Public Class Lavoro
    
        'Creo un Dataadapter per il server con Tabella INBOX
        Dim Comando As OleDbCommand = New OleDbCommand()
        Dim Comando_Server As OleDbCommand = New OleDbCommand()
        Dim ServerAdapter As New OleDbDataAdapter
        Dim Adapter As New OleDbDataAdapter
        Dim ANUMBER As String
        Dim ServerReader As System.Data.OleDb.OleDbDataReader
        Dim ContaRighe As Integer
    
        Sub lavora()
            Comando_Server.Connection = SmsPanel.Connessione_server
            Comando_Server.CommandText = "SELECT * FROM INBOX"
            ServerAdapter.SelectCommand = Comando_Server
            SmsPanel.Connessione_server.Open()
            ServerReader = Comando_Server.ExecuteReader()
            While ServerReader.Read
                ANUMBER = ServerReader("ANUMBER")
                Comando.Connection = SmsPanel.Connessione
                Comando.CommandText = "SELECT * FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @ANUMBER"
                Comando.Parameters.AddWithValue("@ANUMBER", ANUMBER)
                'Apriamo la connessione
                SmsPanel.Connessione.Open()
                'Eseguiamo e vediamo se esiste una corrispondenza !
                Try
                    ContaRighe = Comando.ExecuteScalar()
                Catch Eccezione As OleDb.OleDbException
                    MessageBox.Show(Eccezione.Message)
                End Try
                'Se esiste blocchiamo l'aggiunta 
                If ContaRighe = 1 Then
                    SmsPanel.Logbox.Items.Add(Now() & "   Trovata corrispondenza , invio Email")
                Else
                    SmsPanel.Logbox.Items.Add(Now() & "   Lettura database in corso")
                End If
                SmsPanel.Connessione.Close()
            End While
            SmsPanel.Connessione_server.Close()
        End Sub
    End Class
    Programmatore - Consulenza informatica -
    Web Design - Professionista I.T.
    ---------------------------------------
    http://www.malorgio.it

  5. #5
    Forse lla logica che sto usando è sbagliata , ho visto in giro che devo effettuare il lavoro del thread separato utilizzando la funzione DOWORK e non passandogli un parametro in runasync , ora provo !


    perchè vi tengo aggiornati? cosi se qualcuno guarda questo 3D può capire come l'ho (o abbiamo) risolto passo passo
    Programmatore - Consulenza informatica -
    Web Design - Professionista I.T.
    ---------------------------------------
    http://www.malorgio.it

  6. #6
    Ok risolto una parte , ora il multithreading funziona , ora però vorrei cercare di risolvere un problema legato al cross threading (mado tutto in un giorno ho imparato )

    Nuovo codice
    codice:
    Private Sub SmsPanel_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
           Codice non rilevante ....
        End Sub
    
        Private Sub ConnettiToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConnettiToolStripMenuItem.Click
            BackgroundWorker1.RunWorkerAsync()
        End Sub
    
    
        Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
            Dim Comando As OleDbCommand = New OleDbCommand()
            Dim Comando_Server As OleDbCommand = New OleDbCommand()
            Dim ServerAdapter As New OleDbDataAdapter
            Dim Adapter As New OleDbDataAdapter
            Dim ANUMBER As String
            Dim ServerReader As System.Data.OleDb.OleDbDataReader
            Dim ContaRighe As Integer
    
    
            Comando_Server.Connection = Connessione_server
            Comando_Server.CommandText = "SELECT * FROM INBOX"
            ServerAdapter.SelectCommand = Comando_Server
            Connessione_server.Open()
            ServerReader = Comando_Server.ExecuteReader()
            While ServerReader.Read
                ANUMBER = ServerReader("ANUMBER")
                Comando.Connection = Connessione
                Comando.CommandText = "SELECT * FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @ANUMBER"
                Comando.Parameters.AddWithValue("@ANUMBER", ANUMBER)
                'Apriamo la connessione
                Connessione.Open()
                'Eseguiamo e vediamo se esiste una corrispondenza !
                Try
                    ContaRighe = Comando.ExecuteScalar()
                Catch Eccezione As OleDb.OleDbException
                    MessageBox.Show(Eccezione.Message)
                End Try
                'Se esiste blocchiamo l'aggiunta 
                If ContaRighe = 1 Then
                    MessageBox.Show(Now() & "Trovato")
                Else
                    MessageBox.Show(Now() &  "Non trovato")
                End If
                Connessione.Close()
            End While
            Connessione_server.Close()
        End Sub
    
    End Class
    Infatti al posto dei messagebox.show in DOWORK(nel ciclo if else) dovrebbero esserci dei flussi di scrittura in un eventuale file di Log ... ma se lo faccio mi solleva un eccezione di Crossthreading

    mi sono documentato e bisogna usare l'evento ProgressChanged di Backgroundworker ... ma solo che non accetta valori in stringa o sbaglio?? ci sono altre soluzioni?
    Programmatore - Consulenza informatica -
    Web Design - Professionista I.T.
    ---------------------------------------
    http://www.malorgio.it

  7. #7
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    Ciao.
    Io ho provato il seguente codice e non mi dà eccezioni.

    codice:
     Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
            Dim Writer As New IO.StreamWriter("C:\MioFile.log")
            Writer.Write("CIAO")
            Writer.Close()
            Writer = Nothing
        End Sub
    Così nel tuo sorgente al posto dei MsgBox metti Writer.Write("Quello che vuoi")
    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

  8. #8
    Originariamente inviato da ShaleN
    Ciao.
    Io ho provato il seguente codice e non mi dà eccezioni.

    codice:
     Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
            Dim Writer As New IO.StreamWriter("C:\MioFile.log")
            Writer.Write("CIAO")
            Writer.Close()
            Writer = Nothing
        End Sub
    Così nel tuo sorgente al posto dei MsgBox metti Writer.Write("Quello che vuoi")
    Ottimo ora provo , scusa gia che ti rompo , è possibile visualizzare il file di log , magari in tempo reale con le modifiche , in un pannello oppure in una listbox o che ne so .. so che è una domanda azzardata ma è per capire cosa puo fare vb.net , sn 3 settimane che ci smanetto e ancora non so tutto anzi so pochissimo
    Programmatore - Consulenza informatica -
    Web Design - Professionista I.T.
    ---------------------------------------
    http://www.malorgio.it

  9. #9
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    Be, se vuoi saperne di più sul VB.NET guarda questa: Guida al VB.NET di Totem vers.3. È un ottima guida che spiega questo linguaggio.

    In quanto a leggere contemporaneamente il file di log... potrebbe esserci più di qualche problema dovuto al fatto che sia il tuo programma che un suo thread tentano di accedere allo stesso file. Questo, naturalmente, ne caso in cui tu voglia andare a leggere il file.

    Potresti andare a riempire una variabile della classe base con la stessa cosa che scrivi sul file, ma in questo caso probabilmente si verificherebbe un eccezione di Crossthreading.

    Sul momento non mi vengono soluzioni: temo che dovrai aspettare qualcuno che ne sa di più di me.
    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

  10. #10
    Originariamente inviato da ShaleN
    Be, se vuoi saperne di più sul VB.NET guarda questa: Guida al VB.NET di Totem vers.3. È un ottima guida che spiega questo linguaggio.

    In quanto a leggere contemporaneamente il file di log... potrebbe esserci più di qualche problema dovuto al fatto che sia il tuo programma che un suo thread tentano di accedere allo stesso file. Questo, naturalmente, ne caso in cui tu voglia andare a leggere il file.

    Potresti andare a riempire una variabile della classe base con la stessa cosa che scrivi sul file, ma in questo caso probabilmente si verificherebbe un eccezione di Crossthreading.

    Sul momento non mi vengono soluzioni: temo che dovrai aspettare qualcuno che ne sa di più di me.
    Dici poco , mi hai gia dato una grande mano

    ma il path del file di testo dev essere assoluto o posso farlo relativo se si trova nella stessa cartella dell applicativo?
    Programmatore - Consulenza informatica -
    Web Design - Professionista I.T.
    ---------------------------------------
    http://www.malorgio.it

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.