Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - backgroundworker e form bloccato
Forum - C# / VB.NET - backgroundworker e form bloccato

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
hakzc (Normal User)
Rookie


Messaggi: 37
Iscritto: 07/07/2012

Segnala al moderatore
Postato alle 18:12
Giovedì, 18/10/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?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:16
Giovedì, 18/10/2012
Testo quotato

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à.
PM Quote
Avatar
hakzc (Normal User)
Rookie


Messaggi: 37
Iscritto: 07/07/2012

Segnala al moderatore
Postato alle 18:20
Giovedì, 18/10/2012
Praticamente:

FORM1

TIMER1
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
  2.         BackgroundWorker3.RunWorkerAsync()
  3.     End Sub



BACKGROUNDWORKER3
Codice sorgente - presumibilmente VB.NET

  1. Private Sub BackgroundWorker3_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker3.DoWork
  2.         If dskservitore.Pending Then
  3.             Timer1.Stop()
  4.             Array.Resize(dskcliente, dskcliente.Length + 1)
  5.             dskcliente(dskcliente.Length - 1) = dskservitore.AcceptTcpClient()
  6.             Array.Resize(dskflusso, dskflusso.Length + 1)
  7.             dskflusso(dskflusso.Length - 1) = dskcliente(dskcliente.Length - 1).GetStream()
  8.             For r = 0 To UBound(dskcliente)
  9.                 ListView1.SelectedItems(0).SubItems(6).Text = r.ToString
  10.             Next
  11.             controllo_schermo.Show()
  12.             BackgroundWorker3.CancelAsync()
  13.             BackgroundWorker3.Dispose()
  14.             Timer2.Start()
  15.         End If
  16.  
  17.     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
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:22
Giovedì, 18/10/2012
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à.
PM Quote
Avatar
hakzc (Normal User)
Rookie


Messaggi: 37
Iscritto: 07/07/2012

Segnala al moderatore
Postato alle 15:18
Venerdì, 19/10/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

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:37
Venerdì, 19/10/2012
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à.
PM Quote
Avatar
hakzc (Normal User)
Rookie


Messaggi: 37
Iscritto: 07/07/2012

Segnala al moderatore
Postato alle 16:07
Venerdì, 19/10/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

  1. Public Class Form1
  2.  
  3.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  4.         BackgroundWorker1.RunWorkerAsync()
  5.     End Sub
  6.  
  7.     Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
  8.         Form2.Show()
  9.     End Sub
  10. End Class



il form2 rimane bloccato, se non hai capito posto un screenshot



hakzc ha allegato un file: img.png (178861 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 16:11
Venerdì, 19/10/2012
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? :k:

PM Quote
Avatar
hakzc (Normal User)
Rookie


Messaggi: 37
Iscritto: 07/07/2012

Segnala al moderatore
Postato alle 16:15
Venerdì, 19/10/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
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo