Avatar billede fastpoint Nybegynder
10. juni 2006 - 15:57 Der er 9 kommentarer og
2 løsninger

kode forklaring søges:)

denne metode bliver kaldt fra en tråd
OutputMessage("");

og her det mere relevante

        private delegate void OutputMessageDelegate(string msg);
        private void OutputMessage(string msg)
        {
            if (this.InvokeRequired)
            {
                // if operating on a thread, invoke a delegate
                // on the UI thread.
                OutputMessageDelegate omd =
                    new OutputMessageDelegate(OutputMessage);
                IAsyncResult arx = this.BeginInvoke(
                    omd, new object[] { msg });
                this.EndInvoke(arx);
                return;
            }
            label6.Text = "Your turn";
        }

men jeg forstår ikke koden. Hvordan fungere det?
hvis der kun stod  label6.Text = "Your turn"; ville den brokke sig over cross thread call not allowed.

Det er også fint nok, men jeg kan ikke se hvordan man havner i UI tråden når label6.Text bliver kaldt efter en lukke parantese.

Nogen som kan forklare? please please please
Avatar billede fastpoint Nybegynder
10. juni 2006 - 15:58 #1
ignorer det det at der bliver sendt en string parameter med over for benytter den ikke, men det er copy & paste så testede bare
Avatar billede Syska Mester
10. juni 2006 - 16:05 #2
Betyder at det er den der eger tråden som kommer til at udføre den Method, som skriver det i din label, da det ikke er lovligt at udføre GUI ting, hvis den thread som kører ikke selv ejer GUI-delen, derfor bruger man Invoke til at få den ejende tråd til at udføre der..... Derfor er koden også lavet sådan at der bliver spurgt om det er nødvendigt at der bliver kaldt Invoke...
if (this.InvokeRequired)
Hvis ikke, så skriver den bare, ellers udføre den det andet som gør at det er den der ejer GUI tråden som udføre processsen.......

Det smarte ved at gøre det på den her måde, er at det kun kræver 1 method, da man genbruger metoden, med this.InvokeRequired....

Håber det giver mening, og at det er korrekt... :-) Jeg er næsten sikker, men ikke 100%....

Super sommervejr btw :-)


Svar, hvis det kan bruges.... da jeg drager ud i varmen, græsset slår jo ikke sig selv :-P
// ouT
Avatar billede fastpoint Nybegynder
10. juni 2006 - 16:10 #3
Det er en okay forklaring, men har brug for lidt mere forklaring:) håber du kan svare når du kommer tilbage (sidder forresten ud i solen selv:P)

Hvad er det der sker her helt præcist? det er ikke mange linjer, men der sker vist meget:)

      OutputMessageDelegate omd =
                    new OutputMessageDelegate(OutputMessage);
                IAsyncResult arx = this.BeginInvoke(
                    omd, new object[] { msg });
                this.EndInvoke(arx);
                return;
Avatar billede sovsekoder Nybegynder
11. juni 2006 - 10:29 #4
1. => OutputMessageDelegate omd = new OutputMessageDelegate(OutputMessage);

her oprettes en instans af en "outputMessageDelegate". Dette er i princippet en funktions-pointer. Man kan altså identificere funktionen "OutputMessage" vha. variablen "omd".

2. IAsyncResult arx = this.BeginInvoke(omd, new object[] { msg });
this referer til din form. Når man kalder BeginInvoke(...) ell. Invoke(...) finder implementeringen den tråd der bruges af formen (vha. af det handle der identificerer formen unikt). Denne tråd bliver derefter bedt om at kalde din delegate ("omd"). Omd var jo vores funktionspointer som peger på OutputMessage. Så man beder altså formens tråd om at eksikvere metoden OutputMessage.

3. this.EndInvoke(arx);
Denne metode venter på at metode kaldet til OutputMessage er afsluttet.
Avatar billede fastpoint Nybegynder
11. juni 2006 - 14:47 #5
1.

funktions-pointer betyder det bare, at den peger på en (eller flere) metode(r)?

2.

okay så nu står der "this.beginInvoke" fordi det er noget som kører i tråden main?
har nemlig set hvor man f.eks skriver navnet på en delegate og ikke this.

altså dette eksempel

static void Main(string[] args)
{
...
BinaryOp b = new BinaryOp(Add);
IAsyncResult iftAR = b.BeginInvoke(iftAR);

Console.WriteLine("Doing more work in Main()!");

int answer  = b.EndInvoke(iftAR);
...
}

Der er så denne delegate

public delegate int BinaryOp(int x, int y);

og denne metode

static int Add(int x, int y)
{
//Pause to simulate a lengthy operation
Thread.Sleep(5000);
return x + y;
}

jeg har måtte skære lidt fra, men mit spørgsmål er hvorfor man skriver beginInvoke på den der delegate? 

Burde have forstået det når jeg lige får en forklaring på det:)

3.

this.EndInvoke(arx);
behøver man at kalde denne hvis ens metode ikke returnere noget?

4.

return;
hmm.. hvad gør den? når jeg fjerner den virker alting stadig synes jeg.

du må også gerne ligge et svar i dit næste indlæg tak
Avatar billede fastpoint Nybegynder
12. juni 2006 - 16:59 #6
glem det sidste indlæg! har blot 2 spørgsmål så er alt på plads:)!

jeg undrer mig stadig over return;
hvad gør den lige? alt ser ud til at virke selv hvis den fjernes.

men det sidste spørgsmål er til denne this.BeginInvoke(
                    omd, new object[] { msg });

hvorfor ser den ikke sådan ud

this.BeginInvoke("noget tekst",
                    omd, new object[] { msg });

når metoden som min delegate peger på skal have en parameter?
Avatar billede fastpoint Nybegynder
12. juni 2006 - 18:40 #7
main tråden er det en delegate type siden man kan kalde BeginInvoke på den?
Avatar billede sovsekoder Nybegynder
12. juni 2006 - 20:30 #8
>jeg undrer mig stadig over return;
return afslutter hopper ud af metoden. - så når .NET runtime engine møder return så eksekveres der ikke mere kode i den metode! Dette betyder så at label6.Text = "Your turn"; ikke køres. Jeg ville forvente at du får en exception når du fjerner return. Hvis return fjernes vil label6.Text = "blah"; blive udført, hvilket ikke er tilladt hvis ikke det gøres fra GUItråden.


>hvorfor ser den ikke sådan ud
Metoden BeginInvoke tager 2 parametre: en delegate og et array af objects. Det er dette array der indeholder paramtrene til din delegate. I dit tilfælde tager din delegate 1 parameter som string. Med andre ord skal man give BeginInvoke et object-array med eet element, nemlig den string der skal gives som parameter:
derfor:

this.BeginInvoke(dinDelegate, new object[] { dinDelegateParameter1 });

- hvor dinDelegatePArameter1 er en string
Avatar billede sovsekoder Nybegynder
12. juni 2006 - 20:32 #9
grunden til at det er et array af objects er:
På denne måde kan man konstruere alle tænke lige metodekald. Hvis beginInvoke blot tog en "string" som parameter, ville man begrænse mulighederne for forskellige parametre, da man kun kan angive en string :o (det kunne jo være det skulle være en integer i nogle tilfælde :)).
Avatar billede fastpoint Nybegynder
12. juni 2006 - 20:51 #10
læg et svar og tak:)
Avatar billede sovsekoder Nybegynder
12. juni 2006 - 22:24 #11
svar. :)
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