Member function pointer i delegat + freeRTOS

Tu możesz pisać o swoich problemach z pisaniem programów w języku C/C++ dla STM.
Awatar użytkownika
Federerer
Posty: 9
Rejestracja: wtorek 15 gru 2015, 21:43

Member function pointer i delegat + freeRTOS

Postautor: Federerer » środa 06 sty 2016, 19:45

Na chacie jest ograniczenie do 500 znaków więc napiszę tutaj:

Wykombinowałem tak: tworze klasę bazową TaskManager ze statyczną metodą Dispatcher przyjmującą void*. Dziedziczę po tej klasie i tworze w niej kilka obiektów Task. W konstruktorze na każdym tasku wywołuję metodę Create która przyjmuje delegata na metode w mojej klasie dziedziczacej po TaskManager. Task w metodzie Create tworzy docelowy task freertosa przekazując jako funkcję statyczna funkcje z przekazanego this => this.Dispatcher i delegata jako parametr. Czyli freertos wywoluje tak naprawde funkcje statyczna z parametrem w ktorej rzutuję sobie parametr na delegata i wywoluje docelowa metode na obiekcie. Może tak być?

Awatar użytkownika
mokrowski
User
User
Posty: 190
Rejestracja: czwartek 08 paź 2015, 20:50
Lokalizacja: Tam gdzie Centymetro

Re: Member function pointer i delegat + freeRTOS

Postautor: mokrowski » środa 06 sty 2016, 23:25

Tak. Może tak być.
Jeśli jednak rozważasz całkowite oddzielenie się od "warstwy proceduralnej", możesz potraktować każdy task jak wątek. Wtedy konwencja z C++11
,,Myślenie nie jest łatwe, ale można się do niego przyzwyczaić" - Alan Alexander Milne: Kubuś Puchatek

Awatar użytkownika
Federerer
Posty: 9
Rejestracja: wtorek 15 gru 2015, 21:43

Re: Member function pointer i delegat + freeRTOS

Postautor: Federerer » środa 06 sty 2016, 23:38

Udało mi się zaimplementować delegaty stąd:
http://www.etlcpp.com/function_tutorial.html
Dispatchera przeniosłem do klasy Task. Póki co delegaty tworzę w klasie z wątkami, ale jutro przerzuce je do klasy Task, i wystarczy deklaracja z szablonem Task<KlasaZWatkami> jakisTask; i potem w metodzie jakisTask.Create(&KlasaZWatkami::Metoda, inne parametry); i wsio.
mokrowski pisze:Jeśli jednak rozważasz całkowite oddzielenie się od "warstwy proceduralnej", możesz potraktować każdy task jak wątek. Wtedy konwencja z C++11

Możesz odrobinkę rozwinąć, żebym wiedział gdzie/czego szukać? :)

Awatar użytkownika
mokrowski
User
User
Posty: 190
Rejestracja: czwartek 08 paź 2015, 20:50
Lokalizacja: Tam gdzie Centymetro

Re: Member function pointer i delegat + freeRTOS

Postautor: mokrowski » czwartek 07 sty 2016, 10:34

W C++11 do konstruktora wątku przekazujesz... hm... lepiej to napiszę w pseudokodzie:

Kod: Zaznacz cały

class MojaKlasa {
public:
   void work_method(int arg1, int arg2);
};

// w main()
auto m = MojaKlasa();
// start wątku...
std::thread(&MojaKlasa, &m, arg1, arg2);


Jak widzisz start wątku następuje po przekazaniu "w stylu statycznym" wskaźnika na metodę (choć jest ona obiektowa a nie statyczna), przekazanie.. "this'a" oraz argumentów. Co ciekawe że spójne z (znów pseudokod):

Kod: Zaznacz cały

void work_function(int arg1, int arg2) {
   // ciało funkcji
}
// w main()
// start wątku...
std::thread(&work_function, arg1, arg2);

.. po prostu nie przekazujesz "this'a" :-) Moim zdaniem eleganckie i właśnie o tym wspomniałem...
,,Myślenie nie jest łatwe, ale można się do niego przyzwyczaić" - Alan Alexander Milne: Kubuś Puchatek


Wróć do „Programowanie STM w C/C++”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 7 gości