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?
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
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
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.Originariamente inviato da ClaudioMalorgio
se non ho capito male dovrei gestire il multithreading ... ma qualcuno lo ha mai fatto?![]()
Ciao![]()
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
Classe lavorocodice: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
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
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
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
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 Crossthreadingcodice: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
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
Ciao.
Io ho provato il seguente codice e non mi dà eccezioni.
Così nel tuo sorgente al posto dei MsgBox metti Writer.Write("Quello che vuoi")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
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
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 pochissimoOriginariamente inviato da ShaleN
Ciao.
Io ho provato il seguente codice e non mi dà eccezioni.
Così nel tuo sorgente al posto dei MsgBox metti Writer.Write("Quello che vuoi")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
Programmatore - Consulenza informatica -
Web Design - Professionista I.T.
---------------------------------------
http://www.malorgio.it
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
Dici poco , mi hai gia dato una grande manoOriginariamente 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.
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