Proszę o wyjaśnienie fargmentu kodu

0

prosze o wyjasnienie fragmentu tego kodu, jest to fragment z zajec jedyny jaki udalo mi sie przepisac,ale nie mam pojecia co on ma robic?
o co chodzi z funckjami InvokeRequired / BeginInvoke? oraz z tym delegatem?

 delegate void del(Control ctrl, string co, string text);

        private void ustawdel(Control ctrl, string co, string text)
        {
            if (ctrl.InvokeRequired)
            {
                ctrl.BeginInvoke(new del(ustawdel), ctrl, co, text);
            }
            else
            {
                switch (co)
                {
                    case "tekst":
                        ctrl.Text = text;
                        break;
                    case "przycisk":
                        ctrl.Enabled = Convert.ToBoolean(text);
                        break;
                    default:
                        Console.WriteLine("Default case");
                        break;
                }

            }
        }
1

Jest to sposób na dostanie się do kontrolki del z innego wątka niż ten, w którym kontrolkę utworzono.

Zazwyczaj używa się Invoke().
BeginInvoke() różni się tym, że nie czeka na wykonanie działania, tylko wraca natychmiast.

Jeśli funkcję del() wykonano ze „złego” wątka, to InvokeRequired jest true (co oznacza że wymagane jest użycie Invoke lub BeginInvoke), więc wykonuje się BeginInvoke z parametrem del jako funkcją do wykonania i resztą parametrów taką samą.
BeginInvoke wykonuje podaną funkcję z podanymi parametrami w kontekście właściwego wątka.
Tym razem InvokeRequired będzie false i wykona się blok po else.

0

Robisz sobie dwie funkcje:

 
 int add(int x, int y)
     {
return x+y;
}

int sub(int x, int y)
{
 return x-y;
}

i teraz dopisujesz coś takiego:

delegate int Calc(int x, int y);

i dzięki temu w kodzie możesz napisać coś takiego:


Calc calc = new Calc(add);
int x, y;
Console.WriteLine("Dodawanie = " + calc(x,y).ToString());
calc = sub;
Console.WriteLIne("Odejmowanie = " + calc(x,y).ToString());

0

to co napisal ktos powyzej jednak nie dziala wie ktos z jakiego powodu?

blad jest:
Błąd 1 Dla niestatycznego pola, metody lub właściwości „ConsoleApplication1.Program.add(int, int)” wymagane jest odwołanie do obiektu. xxx 25 25 ConsoleApplication1
Błąd 2 Dla niestatycznego pola, metody lub właściwości „ConsoleApplication1.Program.sub(int, int)” wymagane jest odwołanie do obiektu. xxx 28 20 ConsoleApplication1

tylko ze nie zmieniam nigdzie na zadne static;ki?

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

namespace ConsoleApplication1
{

    class Program
    {

        int add(int x, int y)
        {
            return x + y;
        }

        int sub(int x, int y)
        {
            return x - y;
        }

        delegate int Calc(int x, int y);
        static void Main(string[] args)
        {
            Calc calc = new Calc(add);
            int x, y;
            Console.WriteLine("Dodawanie = " + calc(x, y).ToString());
            calc = sub;
            Console.WriteLine("Odejmowanie = " + calc(x, y).ToString());

        }
    }
}
1

Po co programujesz? Skoro najprostrzego problemu nie umiesz rozwiązać.
Dodaj "static" przed int add( oraz przed int sub(

0

Albo dodaj do add i sub słówko static albo przenieś wywołanie do metody, np tak:

void execute()
  {
   Calc calc=null;
   int x=3,y=4;
   calc=add;
   Console.WriteLine("Dodawanie = "+calc(x, y).ToString());
   calc=sub;
   Console.WriteLine("Odejmowanie = "+calc(x, y).ToString()); 
  }
 
static void Main(string[] args)
  {
   new Program().execute();
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1