
hakzc (Normal User)
Rookie
    
Messaggi: 37
Iscritto: 07/07/2012
|
praticamente ho due form: form1 e form2
dal form 1 avvio un timer che fa partire il backgroundworker, e lo usa a mo' di timer, ad un certo punto backgroundworker deve aprire form2, form2 si apre ma c'è praticamente il puntatore in caricamento e così rimane, il form nemmeno si muove, soluzioni?
|
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6336
Iscritto: 03/01/2010
|
Postato originariamente da hakzc:
soluzioni?
|
Non so perché tu abbia messo in piedi questo accrocchio ma sicuramente, senza vedere il codice, non vedo come si possa rispondere ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|

hakzc (Normal User)
Rookie
    
Messaggi: 37
Iscritto: 07/07/2012
|
Praticamente:
FORM1
TIMER1
Codice sorgente - presumibilmente VB.NET |
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick BackgroundWorker3.RunWorkerAsync() End Sub
|
BACKGROUNDWORKER3
Codice sorgente - presumibilmente VB.NET |
Private Sub BackgroundWorker3_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker3.DoWork If dskservitore.Pending Then Timer1.Stop() Array.Resize(dskcliente, dskcliente.Length + 1) dskcliente(dskcliente.Length - 1) = dskservitore.AcceptTcpClient() Array.Resize(dskflusso, dskflusso.Length + 1) dskflusso(dskflusso.Length - 1) = dskcliente(dskcliente.Length - 1).GetStream() For r = 0 To UBound(dskcliente) ListView1.SelectedItems(0).SubItems(6).Text = r.ToString Next controllo_schermo.Show() BackgroundWorker3.CancelAsync() BackgroundWorker3.Dispose() Timer2.Start() End If End Sub
|
DSKCLIENTE = TCPCLIENT
Riceve le connessioni, scrive l'array nella listview ed apre il form Ultima modifica effettuata da hakzc il 18/10/2012 alle 18:21 |
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6336
Iscritto: 03/01/2010
|
Ma perché il thread lo fai partire in un timer ???
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|

hakzc (Normal User)
Rookie
    
Messaggi: 37
Iscritto: 07/07/2012
|
perchè così è a modo di timer, ma non è quello il problema, il problema è che il form si apre, ma è in continuamente in caricamento e non riesci nemmeno a muoverlo,
credo che sia qualcosa legato al thread
|
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6336
Iscritto: 03/01/2010
|
Ma cosa c'entra ?
Un thread è una cosa e un timer un'altra. Non ha senso avviare il thread da un timer.
E' sbagliata proprio l'impostazione di tutto il programma.
E non devi avviare un form all'interno di un thread che poi termina ... che senso ha?
Non te la prendere, ma si devono studiare "teoricamente" queste cose per un po' di tempo prima di scrivere codice a caso ..
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|

hakzc (Normal User)
Rookie
    
Messaggi: 37
Iscritto: 07/07/2012
|
ok, se io faccio un nuovo progetto, con due form, form1 e form2 e voglio aprire form2 tramite backgrundworker
posto il codice:
Codice sorgente - presumibilmente VB.NET |
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load BackgroundWorker1.RunWorkerAsync() End Sub Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork Form2.Show() End Sub End Class
|
il form2 rimane bloccato, se non hai capito posto un screenshot
|
|

Renny (Normal User)
Expert
    
Messaggi: 231
Iscritto: 30/07/2011
|
Penso anche io che il problema sia legato sia legato al thread.. Perché se il caricamento del form è nel codice "do work", la sua creazione è nel blocco di codice che gestisce le connessioni, e quindi è cose se fosse in un solo thread con quelli istruzioni.
I backgroudworker servono per far eseguire del codice ripetitivo "dietro le quinte". Se in quel codice ci sono anche riferimenti ai controlli e form vari, è ovvio che il programma non gestisce separatamente "codice ripetitivo" e controlli, perché sono nello stesso flusso esecutivo.
Diverso il discorso se i form sono in un thread e il codice ripetitivo in un'altro: allora il sistema operativo sospenderà il thread del codice ripetitivo per eseguire azioni e rispondere agli eventi generati dal thread dei controlli.
Questo in soldino è quanto ho capito io..
Dico bene nessuno?
|
|

hakzc (Normal User)
Rookie
    
Messaggi: 37
Iscritto: 07/07/2012
|
no, ma l'ultima risposta è un'altra applicazione d'esempio, e me lo da lo stesso
se lo metto nella classe workercompleted nn me lo da
Ultima modifica effettuata da hakzc il 19/10/2012 alle 16:16 |
|