none
thread bloquant RRS feed

  • Discussion générale

  • bonjour

    j'ai un thread qui lors de son execution freeze ma form y'a t 'il une sollution pour eviter sa donc jvoudrai que mon thread s'execute et que pendant son execution ma form ne freeze pas

    merci

    • Type modifié Alex Petrescu lundi 13 décembre 2010 09:27 thread double
    vendredi 3 décembre 2010 08:21

Toutes les réponses

  • Bonjour,

    J'ai fait un code pour mieux percevoir ton problème, tu as déjà posé cette question hier, si personne ne répond c'est que personne ne sait de ceux qui viennent ...

    J'ai testé, ça marche, toutefois je crois bien que c'est ton objet TreWiew qui bloque, car s'il est beau, il est très long à afficher visuellement, par exemple si je rentre 30.000 lignes (/ 5 colonnes), je vais devoir attendre 30 secondes environ (processeur 2.2 Ghz avec 4 Go RAM) entre le moment où la liste va être chargée et le moment où on pourra la voir, alors si tu peux changer d'objet ça n'en sera que mieux, sinon il faut tester (je ne sais comment), et tant que le TreWiewx n'affiche rien, maintenir la form d'attente (c'est marqué dans mon code).

    Pour le webbrowser, tu peux l'enlever, l'objet pictureBox sait faire tourner une image gif animée, donc mettre une pictureBox, hier on te l'a dit ... Pour mon test j'ai mis l'image en ressources.

    Voici le code :

    '''''''FORME 1''''''''
    Option Explicit On
    Public Class Form1
     Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      ListView1.Visible = False
      Me.Hide()
      Form2.ShowDialog(Me)
     End Sub
    End Class
    
    '''''''FORME 2''''''''
    Option Explicit On
    Public Class Form2
     Sub Form2_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
      Dim i As Integer
      PictureBox1.Image = My.Resources.cuisine1
      PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize
      System.Threading.Thread.Sleep(1000)
      Form1.ListView1.Items.Clear()
      For i = 1 To 30000
       Form1.ListView1.Items.Add("liste " & i)
       My.Application.DoEvents()
      Next i
      '
    bis: 'If à bloquer si listView est chargée mais reste blanche goto bis
      '
      Form1.ListView1.Visible = True
      Form1.Show()
      Me.Close()
     End Sub
    End Class
    
    

    Cordialement.


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    vendredi 3 décembre 2010 08:39
  • merci EhJoe

    j'y suis arriver a une solution similaire hier mai tjr reste le meme probleme, au moment du chargement de la listview pendant une seconde ou 2 presque l'animation s'arrete. y'a pa une solution pour sa?

    vendredi 3 décembre 2010 09:08
  • Bonjour,

    A priori le treview perturbe pas mal, parfois on n'y peut pas grand chose, on arrive aux limites matérielles de l'ordinateur (carte vidéo - processeur - RAM) ... alors en faisant un autre exe avec l'animation, que tu appelles avant et que tu fermes après ça irait plus vite que de chercher une solution qui n'existe peut être pas ? En plus, tu peux embarquer l'exe dans tes ressources, comme ça tu n'as qu'un programme, quand tu en as besoin tu le mets sur disque, tu le lances, puis tu le supprimes ensuite ... Si tu as des difficultés je peux te faire ça ?

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    vendredi 3 décembre 2010 10:47
  • Bonjour,

    Je n'ai pas  encore vu pour l'instant la discussion originale avec le code mais si ce n'est pas déjà fait il faut prendre soin de modifier "en bloc" le contrôle.

    Pour l'exemple donné par Ehjoe, AddRange donnera une bien meilleure performance (car le contrôle sera "désactivé", tous les élements sont chargés, puis le contrôle est "réactivé" ; avec Add il est "réactualisé" à chaque fois qu'un élément est ajouté). La même chose doit être possible je pense avec le TreeView et une source de données hiérarchiques (ou sinon essayer peut-être SuspendLayout/ResumeLayout).

    Si il y a beaucoup de données une autre approche pourrait être aussi de charger les données à la demande (on n'a besoin des données que lorsqu'on déploie une branche). Attention aussi à la facilité d'utilisation pour l'utilisateur d'un treeview avec 30000 items.

    Au fait, merci de ne pas reposter la même question. Cela entraine plus de confusion qu'autre chose (par exemple je vais peut-être répondre autre chose dans l'autre discussion).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    vendredi 3 décembre 2010 12:06
    Modérateur
  • > bonjour
     
    Bonjour,
     
    > j'ai un thread qui lors de son execution freeze ma form y'a t 'il une
    > sollution pour eviter sa donc jvoudrai que mon thread s'execute et que
    > pendant son execution ma form ne freeze pas
     
    Un bout de code permettant de reproduire le problème serait bienvenu.
    L'exposé n'est pas très clair. Notamment sur le fait de modifier un
    contrôle dans un thread (?).
    Avec un BackgroundWorker, comme cité, et des "invokes" sur le contrôle
    pour le mettre à jour, une deuxième fenêtre avec un gif animé (pas
    besoin de WebBrower pour si peu) ne fige pas.
     
    --
    Fred
    foleide@free.fr
     
    vendredi 3 décembre 2010 13:21