C++ call back

pouCZ

Re:C++ call back
« Odpověď #15 kdy: 20. 12. 2023, 11:42:20 »
Jedná se o domácí bastl kód - žádné auto-motive nebo nic produkčního.
Tvořím na raspberry pico ovládání žaluzií, ovládání podlahovky a čtení teplot atd.
Cílem bylo vytvořit něco jako možnost potomků si zapnout periodické volání nějakých metod - nic víc.


Pokud to tedy chápu dobře, tak na zmíněném přístupu nic špatně není, ale je moc složitý. Je to tak?

Děkuji za std::function to jsem neznal a dalo by se také použit.

v c/c++ muzes napsat co chces :-)
ale doporucuji to psat co nejjednoduseji/nejpochopitelneji a dokumentovat.

a v dnesni dobe je dobre se drzet metod moderniho c++.


Proto se ptám zda toto je přístup moderního c++ a pokud ne tak jak by to mělo být.


alex6bbc

  • *****
  • 1 687
    • Zobrazit profil
    • E-mail
Re:C++ call back
« Odpověď #16 kdy: 20. 12. 2023, 11:43:01 »
Jedná se o domácí bastl kód - žádné auto-motive nebo nic produkčního.
Tvořím na raspberry pico ovládání žaluzií, ovládání podlahovky a čtení teplot atd.
Cílem bylo vytvořit něco jako možnost potomků si zapnout periodické volání nějakých metod - nic víc.

Snad si psal, ze to bude v Rustu ne? Takze zmena na C++, ktere je pro tebe opet moc zlozite? Nechapu.


Možná jsem před Vánoci trochu chorý na mysli ale o Rustu jsem se snad nezmínil....

udelej to v cem chces.
a kdyz se budes chtit ucit novy jazyk tak to pak do nej predelej a nenech si nakecat, ktery to ma byt.

modnar

Re:C++ call back
« Odpověď #17 kdy: 20. 12. 2023, 12:05:28 »
Jedná se o domácí bastl kód - žádné auto-motive nebo nic produkčního.
Tvořím na raspberry pico ovládání žaluzií, ovládání podlahovky a čtení teplot atd.
Cílem bylo vytvořit něco jako možnost potomků si zapnout periodické volání nějakých metod - nic víc.

Snad si psal, ze to bude v Rustu ne? Takze zmena na C++, ktere je pro tebe opet moc zlozite? Nechapu.


Možná jsem před Vánoci trochu chorý na mysli ale o Rustu jsem se snad nezmínil....

Zrovana tady tento pan chce take ovladat zaluzie na RPi, ale pres CAN bus v Rustu. Ale vidim, ze je to nekdo jiny. Tak pardon a klidne Vanoce ;).

Re:C++ call back
« Odpověď #18 kdy: 20. 12. 2023, 22:27:14 »
Jedná se o domácí bastl kód - žádné auto-motive nebo nic produkčního.
Tvořím na raspberry pico ovládání žaluzií, ovládání podlahovky a čtení teplot atd.
Cílem bylo vytvořit něco jako možnost potomků si zapnout periodické volání nějakých metod - nic víc.

Keby si niekde (github?) dal kod, dalo by sa o tom lepsie diskutovat.

Suhlasim s snugar_i ze toto nevyzera na pripad pre dedicnost. Skus urobit jednu triedu,
ktora poskytuje funkciu volania callbackov, mozno ako singleton, a tie jednotlive casti (ovladanie zaluzii)
si u nej budu registrovat co a kedy potrebuju volat (cez lambdu alebo std::function), pripadne v ktorom threade.
Pouziva sa pri tom finta, ze registrovanie callbacku vracia nieco (ID, pointer) pomocou ktoreho ten callback vies zrusit.

Uz som par rokov nerobil v C++ tak ti nenapisem detaily, skor myslienku.

struct Callback {
   int id;
   int frequency;
   std::function<> callback;
}

class Callbacks {
public:
   int registerCallback(int frequency, std::function<> callback) {
      int id = findFreeId();
      callbacks.push(new Callback(id, frequency, callback);
   };
   void unregisterCallback(int id) {
       // remove Callback with id from callbacks
  }

private:
  std::vector<Callback> callbacks;
  int findFreeId() const {
       // find some unused id
  }
  // zostava napisat ako sa spustaju callbacky...
}

D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Re:C++ call back
« Odpověď #19 kdy: 16. 01. 2024, 20:16:02 »
A nebylo by mozna jednodusi vyuzit misto callbacku (labda funkci a pod) funktory? Vyhodou je to ze nemusis ziskavat ukazatel na konkretni funkci (nebo metodu) callbacku, a protoze funktor je sam o sobe trida, a do pole muzes ukladat rovnou instance techto trid. Dalsi benefit je v tom, ze muzes do nej primo implmentovat metody, ktere otestuji splneni dane podminky. Trida BASE_CLASS uz pak jednak nepotrebuje vedet detaily o provedeni callbacku a taky uz nepotrebuje zadny polymorfismus pro provedeni dane operace, protoze na vsechno co potrebuje k provedeni metody proccess( ) jednoduse zavola metody funktoru. Ziskas tim taky docela solidni nezavislost pri dalsim rozsirovani kodu, protoze pro kazdou operaci, kterou budes chtit resit callbackem pak naimplementujes novy funktor, ktery "vi" co je potreba udelat a co ma delat, a BASE_CLASS::proccess( ) to uz jen diriguje ;) 
« Poslední změna: 16. 01. 2024, 20:22:23 od D.A. Tiger »