2009-08-12 6 views
0

Je veux sélectionner les images (Elles sont sélectionnées pendant l'exécution du programme) et les afficher sur le formulaire. pour que je prends un panneau sur la forme et remplir le panneau avec pictureboxes.i écrire le code suivant pour cela, mais il est très chronophage:Comment est-ce que je peux faire imageboxe sur le formulaire plus rapidement sur l'exécution dans des Winforms .net?

if(openDialoge1.ShowDialog() == DialogResult.OK) 
       { 
        string[] fileName = open.FileNames; 
        foreach (string s in fileName) 
        { 
         pBox = new PictureBox(); 
         pBox.Size = new System.Drawing.Size(w, h); 
         pBox.Location = new System.Drawing.Point(x, y); 
         pBox.Image = Image.FromFile(s); 
         pBox.SizeMode = PictureBoxSizeMode.StretchImage; 
         . 
         .//here i add some eventHandler of picture boxes. 

         this.panel1.Controls.Add(pBox); 
         x += pBox.Width + 4; 
        } 
       } //here w,h,x,y are integers. 

bien Ce travail de code, mais il prend beaucoup de temps et prendre beaucoup de temps pour peupler le panneau avec des boîtes d'images. par exemple quand je fais les 20,30 photos, cela prend beaucoup de temps. Est-il possible de réduire le temps de remplissage du panneau avec des cadres d'image.

Merci d'avance.

+0

Pouvez-vous clarifier. Que voulez-vous dire qu'il prend beaucoup de temps. Voyez-vous un scintillement sur l'écran, ou votre application bloque-t-elle (gelant) pendant que les images dessinent? –

+0

Je veux dire que mon application est en train de geler. – qulzam

Répondre

1

Vous pouvez envisager de profiler votre méthode. Si vous ne disposez pas d'un profileur comme ANTS disponible, vous pouvez rouler votre propre:

Stopwatch watch = new Stopwatch(); 
watch.Start(); 

//code to profile goes here 

watch.Stop(); 
Console.Writeln("Elapsed time: " + watch.Elapsed.TotalMilliseconds + "ms"); 

Cela vous aidera à identifier quelle partie de votre code est lent.

Je peux vous dire tout de suite que Image.FromFile() est probablement la partie la plus lente. Ce que vous pourriez envisager est de charger les images dans une liste en commençant par un thread distinct ou un worker en arrière-plan. Cela vous permettra d'afficher une barre de progression ou un sablier, pour indiquer à l'utilisateur que les images sont lues à partir du disque.

Une fois que les images sont en mémoire, la création des boîtes d'image va un lot plus rapidement.

Edit:

Vous avez demandé un exemple montrant comment charger des images dans la mémoire d'abord. Il est vraiment simple:

// this code should run in its own thread - BackgroundWorker is perfect for this 

List<Image> images = new List<Image>(); 
foreach (string imagePath in paths) 
{ 
    images.Add(Image.FromFile(imagePath)); 

    // update progress bar here? 
} 

Maintenant, vous avez une liste de vos images que vous pouvez utiliser pour remplir vos boîtes d'image.

+0

monsieur j'ai mentionné dans ma question le code qui est lent. – qulzam

+2

Je suis d'accord avec Charlie. Il a donné quelques bons exemples de la façon de résoudre votre problème. Chargez d'abord les fichiers dans la mémoire, puis ajoutez-les au panneau. De plus, effectuez cette opération sur un fil d'arrière-plan ou un fil séparé afin que l'application ne gèle pas lorsque vous chargez 20 à 30 images. –

+0

Oui, mais quelle ligne est lente? Comme je l'ai mentionné dans ma réponse, je pense que Image.FromFile() sera le plus lent. Profil votre code pour vérifier qu'il est le plus lent. –

Questions connexes