Avatar billede droa Novice
13. juni 2009 - 13:59 Der er 13 kommentarer

Opdatere min UI fra en Thread med Invoke?

Jeg har en klasse der laver en selvstændig dll-fil, der bliver kladt delvist ind som egen Thread.

MoodLib.dll

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace MoodLib
{
    public class Humør
    {
        private double i = 0;

        #region IHumør Members

        public void RunMood()
        {
            while (true)
            {
                this.mood = this.i - 0.1;
                progressBar3.invoke(new UpdateprogressBar3Callback(this.UpdateprogressBar3), GetMood());

                Thread.Sleep(1);
            }
        }
        public int GetMood()
        {
            return int.Parse(this.i.ToString());
        }
}
}


Form1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using MoodLib;

namespace LittlePetForm
{
    public partial class Form1 : Form
    {
        private void UpdateprogressBar3(int i)
        {
            progressBar3.Value = i;
        }

        public delegate void UpdateprogressBar3Callback(int i);

        IHumør h = new Humør();
        public Form1()
        {
            InitializeComponent();
            Thread tMood = new Thread(new ThreadStart(h.RunMood));
        }
    }
    }



skulle det ikke virke?
Avatar billede Spotgun Seniormester
15. juni 2009 - 18:56 #1
Din dll har jo ingen reference til din progressbar, så det bliver nok lidt svært at klare.
Avatar billede droa Novice
15. juni 2009 - 19:46 #2
så man skal forspørge fra GUIen? kan man sætte det op på andre måder?
Avatar billede thesurfer Nybegynder
15. juni 2009 - 21:38 #3
Man kunne evt sende progressbarens reference med, når man starter tråden.

Din DLL skal så importere det namespace, der indeholder progressbar.

Så burde den have forbindelse til din forms progressbar.
Avatar billede Spotgun Seniormester
15. juni 2009 - 21:49 #4
Det burde virke ja, men det er ikke nogen særlig pæn løsning, hvis det var tiltænkt at dll'en skulle kunne bruges i andre løsninger også.
Avatar billede thesurfer Nybegynder
15. juni 2009 - 22:02 #5
Hvis tråden kun har 1 funktion (opdater mood, opdater progressbar), synes jeg at det er "ok" løsning.

Sig mig engang..

- Er det bare mig der ikke kan finde "mood"-variablen, eller eksisterer den ikke?
Den er refereret her: "this.mood = this.i - 0.1;".. men skulle nok have været:
"this.i = this.i - 0.1;"

- Starter "i" ikke bare ved "0", og går "0.1" ned ..? Rimeligt negativt "mood".. :-)

- Vil int.Parse ikke give en fejl når værdien er en double? Her burde man vel bruge Convert.ToInt32.. men det kan da også være at int.Parse virker..



Og til sidst:

Hvordan dælen laver man så'n en fin boks uden om koden, her på eksperten.dk?... jeg kan kun se:

"Tilladte BB-code-tags: [ b ]fed[ /b ] [ i ]kursiv[ /i ] [ u ]understreget[ /u ] [ img ]link til billede[ /img ]"
Avatar billede thesurfer Nybegynder
15. juni 2009 - 22:04 #6
Det burde virke ja, men det er ikke nogen særlig pæn løsning, hvis det var tiltænkt at dll'en skulle kunne bruges i andre løsninger også.

Det ville vel netop være en god løsning, da man så selv bestemmer hvilken progressbar der skal opdateres.. så er det lige meget hvad den hedder hos dig (på din form), og DLL'en er ligeglad med navnet, bare den får en reference..

what say you?
Avatar billede Spotgun Seniormester
15. juni 2009 - 22:14 #7
Klart nok, idéen fejler ikke noget :)

Nu har vi ikke fået megen information omkring bevæggrunden for at lave en dll med den ene funktion i. Hvis ikke den skal bruges til andre projekter eller platforme, så havde det alt andet lige været nemmere blot at lave den som en klasse i hovedprojektet. Du vil jo stadig have samme muligheder for at lave den trådbaseret dér, og det vil være nemmere (og pænere) at referere til progressbaren på den facon.
Avatar billede droa Novice
15. juni 2009 - 22:19 #8
hm, så man kan ikke lave en forspørgelse fra .exe filen, til .dll filen, om hvad værdien er? tænkte på at det nok ville være mest korrekt, da .dll'en meget gerne skulle se objektivt på sagerne :)
Avatar billede Spotgun Seniormester
15. juni 2009 - 22:29 #9
Der skulle ikke være nogen problemer i at trække værdien ud fra dll'en via din GetMood metode.
Avatar billede droa Novice
17. juni 2009 - 07:50 #10
mine spørgsmål er så mere direkte:

Hvad er den mest korrekte måde og lave det på?
at lave det som push (og flytte klassen til main programmet, og kalle funktioner fra dll filen istedet?

eller og køre metoden for sig selv i dll'en. og lade interfacet forspørge engang imellem?

og hvad måde kan man så forspørge for GUI'en, igennem "GetMood", hvor man stadig får en flydende overgang?


jeg er ude efter den mest flydende overgang (fra 1 til 100%) samt den mest korrekte måde.
Avatar billede thesurfer Nybegynder
17. juni 2009 - 08:07 #11
Hvis du lader DLL'en opdatere GUI'en, bliver du nødt til at "låse" forholdet ("DLL'en stiller krav"), forstået på den måde, at hvis du bruger DLL'en et andet skal, så SKAL formen have en progressbar.

Hvad nu hvis der ikke skal være en progressbar, men bare en label der viser status?

Man kan jo også bare tilføje en "skal/skal ikke opdatere formens progressbar"-switch, for man sender til DLL'en..



Hvis DLL'en bare skal arbejde for sig selv, kan formen (via en tråd.. ellers kan låse den formen!) spørge DLL'ens GetMood, med et eller andet interval.
Kravet for specifikke ting (forholdet mellem form og DLL) bliver mere åbent/løst.

Hvis intervallet afvikles via en timer, låser den ikke formen.
Avatar billede thesurfer Nybegynder
17. juni 2009 - 08:08 #12
Rettelse:

"ellers kan den låse formen"

(hvis man f.eks. bruge en løkke til at få fat på GetMood)
Avatar billede thesurfer Nybegynder
17. juni 2009 - 08:09 #13
Endnu en rettelse... :-)

"som man sender til DLL'en"
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