15. januar 2008 - 09:46Der er
9 kommentarer og 1 løsning
thead og form controls
Jeg vil gerne tilføje en picturebox til en form, og sætte processen igang med en tråd jeg selv erklærer Nedenstående kan ikke umiddelbart lade sige gøre.
Hvordan gør man så ?
using System; using System.Threading; using System.Windows.Forms;
namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
Det her tidlgiere spm burde kunne svare på det ... man kan ikke opdatere GUI fra andre tråde end den som startede GUI ... du skal bruge Invoke på formen.
Tak for svaret. bitmatic svar virker. Og det buzzzz er vist omtrent samme svar - her skal jeg bare tænke lidt mere Fejlen var et vist som jeg forstod den at jeg ikke kunne tilføje en control med en underordnet tråde til en overordnet tråd....
Om trådene er underordnede eller overordnede er sådan set ligegyldigt. Du kan helt generelt ikke få lov til at ændre på data i én tråd fra en anden tråd.... Det giver alt for mange problemer at tillade det, så det er forbudt fra .NET 2.0 og fremefter :)
Når du kalder Invoke(new AddItDelegate(AddIt), new object[] { pictureBox }) i tråden t1, så beder du i virkeligheden bare den tråd der ejer funktionen "AddIt" (Form1 tråden) om at kalde den når den får tid til det... Det er væsentligt at forstå, at man altså ikke kalder AddIt direkte.
Subert tak begge! Du får alle pointene bitmatic denne gang (30 point er næsten for lidt at dele mellem to) for din løsning og efterfølgende gode forklaring !
Men her er det jeg egentlig skulle bruge det til :
using System; using System.Threading; using System.IO; using System.Windows.Forms; using System.Text; using System.Drawing; using System.Drawing.Imaging;
namespace PictureBrowser { public class PictureBox_suber:PictureClass { private FileInfo fi; private PictureBox p; private Form f; private int id;
public PictureBox_suber(int id,FileInfo fi , Form_thumbnail f, int x, int y, int width, int height):base(fi) { this.id = id; this.fi = fi; this.f = f; this.p = new PictureBox(); p.Name = id.ToString(); p.Location = new System.Drawing.Point(x, y); p.Size= new System.Drawing.Size(width, height); p.Image = this.Image; p.SizeMode = PictureBoxSizeMode.Zoom;
} public PictureBox Picturebox { get{return p;} }
public void showPictureBox() { Invoke(new AddItDelegate(AddIt), new object[] { p }); //f.Controls.Add(p); }
public void ObjectDelete() { base.Image.Dispose(); fi.Delete(); p.Dispose(); p = null; GC.Collect(); }
} }
Jeg tilføjer en række pictureboxe til min form vha af ovenstående klasse.
Fra formen starter jeg en tråd, som igen starter et for-loop, som så går ind og bruger ovenstående klasse til at tilføje pictureboxene med.
Men jeg får når jeg bruge den metode som I har forklaret om får jeg fejlen: 'Invoke' does not exist in the current context'
Jeg forstår godt, at I ikke forstår. Jeg uddyber lige i eftermiddag efter arbejde.
:-) Michael
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.