Avatar billede lajer Nybegynder
14. december 2005 - 23:53 Der er 11 kommentarer

Invoke, fra klasse der ikke nedarver fra Control

Hej

Er det ikke muligt at Invoke fra en metode i en klasse, der IKKE nedarver fra System.Windows.Forms.Control ?
Avatar billede sovsekoder Nybegynder
16. december 2005 - 18:33 #1
Invoke på Control er en implementering af ISynchronizeInvoke.Invoke. Så hvis du vil ha' "invoke, begin/endInvoke" sovosv.. funktionalitet på din egenklasse må du implementere ISynchronizeInvoke interfacet.

Men det er nok ikke det du vil... :) Har du noget kode der deadlock'er ? måske skal du indføre noget trådsikkerhed?
Avatar billede sovsekoder Nybegynder
16. december 2005 - 18:34 #2
det er jo sædfølgelig ikke nødvendigt at implementere ISync. hvis du vil ha' en metode der hedder invoke();....
Avatar billede sovsekoder Nybegynder
16. december 2005 - 18:34 #3
flere detaljer på hva' dit problem er ?
Avatar billede lajer Nybegynder
17. december 2005 - 14:07 #4
Jeg har metode1 og metode2

Metode1 er den der skal tegne ting på min winform.
Metode2 udfører en bunke beregninger der tager noget tid at udfører - det er her jeg har brug for at Invoke Metode1 - for at lade Metode1 fortælle lidt om hvor langt Metode2 er nået :-)

Metode2 ligger imidlertid i en klasse der ikke nedarver fra noget - og jeg savner her at kunne bruge Invoke()

Jeg har, som en midlertidig løsning, ladet Metode1 sørge for at invoke sig selv hvis det er nødvendigt - men jeg syntes ikke at det er en speciel køn løsning.

Håber det kastede lidt mere lys over problematikken.
Avatar billede driis Nybegynder
17. december 2005 - 14:20 #5
Klassen, Metode2 ligger  i, kunne have nogle events som blev raised når der sker noget, Metode1 skal have info om. Så kan første klasse lytte på disse events.

Er det noget i den retning, du leder efter ?
Avatar billede lajer Nybegynder
19. december 2005 - 19:37 #6
driis

det var også en mulighed ja - men jeg syntes ikke at den er helt optimal heller. Jeg vil meget hellere lade klassen metode2 ligger i, håndtere delen med at invoke.
Avatar billede cr2000 Nybegynder
27. december 2005 - 13:24 #7
uhh.

Jeg er med på en lytter(læser)

Jeg har lavet samme(ikke så pæne) løsning med at lade Metode1 sørge for at invoke sig selv.

Jeg har kigget lidt på events men kunne ikke få det til at funke.
Avatar billede sovsekoder Nybegynder
29. december 2005 - 21:33 #8
[metode2 i class2 kalder metode1 i Form1]
setup:
lav et nyt "windows application" projekt. tilføj en progressbar og en knap. Knappens OnClick handler:

private void button1_Click(object sender, System.EventArgs e)
        {
            OtherClass stuff = new OtherClass();
            stuff.ProgressEvent += new ProgressDelegate(Method1);
           
            Thread t = new Thread(new ThreadStart(stuff.Method2));
            t.Start();
        }

derudover en metode der bruges til at opdatere progressbaren (metode1)
    public void Method1(object sender, ProgressEventArgs e)
        {
            double val = progressBar1.Minimum;
            val += e.Progress*(progressBar1.Maximum-progressBar1.Minimum);
            progressBar1.Value = (int)val;   
        }

definition af delegate, event og class2 hvori metode2 findes:
public delegate void ProgressDelegate(object sender, ProgressEventArgs e); 
   
    // This class is used by ProgressDelegate
    public class ProgressEventArgs
    {
        double progress = 0;

        public ProgressEventArgs(double progress)
        {
            this.progress = progress;
        }

        public double Progress
        {
            get { return progress; }
            set { progress = value; }
        }
    }
   
    public class OtherClass
    {
        // Progress event
        public event ProgressDelegate ProgressEvent;

        public void Method2()
        {
            double d;
            for(int i=0; i<1000; i++)
            {
                d = 0;
                for(int j=0; j<1000000; j++)
                {
                    d = d + 0.1;
                }
                // Makes good sense to notify here
                if(ProgressEvent != null)
                {
                    ProgressEvent(this, new ProgressEventArgs(i/1000.0));
                }
            }
       
        }
    }
Avatar billede sovsekoder Nybegynder
29. december 2005 - 21:36 #9
>lajer
På denne måde er det class2&metode2 der bestemmer hvornår der invokes i class1&metode1

>cr2000
måske ka' ovenstående eksempel løse dine event-problemer?
Avatar billede lajer Nybegynder
02. januar 2006 - 19:40 #10
Sovsekoder:
Jeg kan ikke lige lure hvordan det klarer thread problemet. Men jeg prøver det ad i løbet af ugen - er ikke lige i nærheden af vs.net de næste par dage :-(

Godt nytår iøvrigt :)
Avatar billede sovsekoder Nybegynder
02. januar 2006 - 22:42 #11
har måske misforstået din problematik. Den kode jeg har posted gør følgende:

class1 opretter en tråd hvor class2.metode2 kører. Metode2 sender events til metode1 for at opdatere gui.
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