Avatar billede thomaxz Nybegynder
22. januar 2008 - 09:04 Der er 11 kommentarer

Invoke en tråd/event?

Jeg har lavet en usercontrol, og viker fint, heri har jeg en række properties og en række evetns, men af min interne event blir kaldt fra en tråd, når denne event så kalder den eksterne event som formen abonnere på, får jeg tråd problem.

jeg er klar voer hvordan det løse fra formens sider, men er det ikke muligt at kalde/invoke den eksterne event, så det er formen tråden der køre den, så der er direkte adgang til grafiken på formen?
Avatar billede davidfossil Nybegynder
22. januar 2008 - 23:51 #1
Du siger noget med en form - snakker vi ASP.NET? I så fald lyder det som noget der godt kan være lidt problematisk, idet HTTP-kommunikation er bygget om en meget enkel request/response-cycle hvor du ikke uden videre kan opdatere det resultat du har sendt til brugeren. Hvis du vitterligt har brug for at få resultater fra en anden tråd med i dit output, bliver du enten nødt til at vente på resultatet, eller køre en eller anden form for opdatering - fx vha AJAX.

Hvis jeg rammer helt ved siden af må du lige smide noget mere info på bordet så vi andre har en bedre chance for at forstå situationen :-)
Avatar billede thomaxz Nybegynder
23. januar 2008 - 08:20 #2
Vi snakker C#, C3 windows application.

Jeg har lavet en usercontrol,en component http://www.eksperten.dk/spm/815015
i denne usercontrol/component har jeg en række properties og en række eksterne og en række interne funktioner.

De eksterne funktioner er dem bruger component bruger/abbonere på.

Men en af min interne funktion, blir kald fra en anen tråd, når denne funktion som kalder den eksterne vil de naturligvis resultere i en tråd fejl, jeg er klar over hvordan jeg fra min applikation der bruger min usercontrol/component kan ændre det ved invoke en kontrol.

Men det jeg ønsker er invoke selev tråden, så eventen blir kald til den tråd der ejer kontrollen, så man ikke fra den applikation skal bruge invoke.
Avatar billede jeppekristensen Nybegynder
23. januar 2008 - 09:44 #3
Problemet er at hvis du har en forms der kører, er der 1 tråd der styrer den, og den har "eneret" på at ændre ting i formen. Lad os sige du har en textbox i formen og starter en ny tråd der f.eks genererer et tilfældigt tal og ændre textboxen. Hvis tråden skal kunne opdatere textboksen er her en løsning. Der er i eksemplet en textbox med navnet textbox1:

public partial class Form1 : Form
{
        public Form1()
        {
            InitializeComponent();
            Thread numberGeneratorThread =
        new Thread(new ThreadStart(TestThread));
            numberGeneratorThread.Start();
        }

        public void TestThread()
        {
            Random ran = new Random();
            while (true)
            {
                UpdateTextBox(ran.Next().ToString());
                Thread.Sleep(1000);
            }

        }

        private delegate void UpdateTextBoxDelegate(string message);

        public void UpdateTextBox(string message)
        {
            if (textBox1.InvokeRequired == true)
            {
                this.Invoke
            (new UpdateTextBoxDelegate(UpdateTextBox),
            new object[] { message });
            }
            else
            {
                textBox1.Text = message;
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Environment.Exit(Environment.ExitCode);
        }
    }

Det du skal gøre er at lade en metode håndtere opdateringen. I det her tilfælde er det UpdateTextbox metoden. Lige før den har jeg placeret en delegate der har samme struktur (void ouput, en string som inputparameter).

Det der groft sagt sker, sådan som jeg har forstået det er at. Hvis der er behov for at invoke for at opdatere tekstboksen (og det er der, fordi det er en anden tråd der vil opdatere tekstboksen).

Det der så sker er at vi sender metoden via en UpdateTextBoxDelegate og inputparametre(som et object array) til hovedtråden som så udfører metoden, når der er plads i dens forløb (og det er så lynhurtigt).

Håber det hjælper
Avatar billede thomaxz Nybegynder
24. januar 2008 - 08:13 #4
Jeg er udemærket klar over hvordan det løse på form siden.

Jeg har

en form
en component

component har jeg selv lavet.

i min form bruger jeg component.
i min form har jeg brug en event fra komponent, den event forsøger at tilgå en kontrol f.esk textbox på formen.

i min component blir en internt event fyre fra af, denne interne event kalder så den eksisteren som min form bruger.

men nu er den interne så kaldt fra en tråd, og jeg får et tråd problem.

det jeg gerene vil er fyre event af, så den køre i den tråd, der i starten abbonerede på den og har direkte adgang til form kontrollerne, da det skal være den tråd der styre kontrollerne.

det må da kune lade sig gøre?

f.esk en timer, jeg går du ud fra dennes optælling sker i en tråd for sig.
også kalder tick, når event skal fyres af.

og her er der jo direkte adgang til componenter fra tick event.
Avatar billede jeppekristensen Nybegynder
24. januar 2008 - 10:37 #5
1. Med component tænker du så på en user control?
2. Prøver componenten/user controlen at opdatere den form den ligger inden i, eller har componenten en event som bliver.

Umiddelbart vil jeg syntes at det var en dårlig ide hvis en komponent opdaterer den parent form den er inden i, fordi så kan man groft sagt argumentere for at den ikke kan bruges i andre forms (håber du ved hvad jeg mener).

Men jeg vil gerne indskyde at jeg er en lille smule i tvivl om hvad dit program gør.
Avatar billede thomaxz Nybegynder
24. januar 2008 - 12:25 #6
1. ja, med component, mener jeg usercontrol, men som ikke har en visual flade.

2.component kalder en funktion i form1 en event.,som skal opdatere formen kontrolen.
Avatar billede jeppekristensen Nybegynder
24. januar 2008 - 13:33 #7
Nu kender jeg ikke din component komplet, men hvis den ikke har en visual overflade kunne du jo overveje at lade en klasse håndtere den forventede adfærd, sådan lidt Model View Controller-agtigt. 

Jeg undskylder det lidt vage svar. Hvis du er i tvivl omkring MVC, kan du så eventuelt ikke sende mig dit kode.
Avatar billede jeppekristensen Nybegynder
29. januar 2008 - 12:26 #8
Fandt du ud af det?
Avatar billede thomaxz Nybegynder
29. januar 2008 - 12:48 #9
Nej, får når jeg laver det i en klasse, får jeg samme tråd problem.
Avatar billede jeppekristensen Nybegynder
29. januar 2008 - 12:51 #10
Det kan virkeligt være et helvede at få det til at virke, men tilbuddet om at kigge på koden står stadig åben, nogle gange hjælper det lidt med friske øjne. :)
Avatar billede thomaxz Nybegynder
09. december 2013 - 14:18 #11
Lukker
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester