"Projekt": Events

0

kazdego kto sie zastanawial kiedys, jak mozna rozwiazac kwestie eventow od C++, zapraszam do "artykulu" http://4programmers.net/C/Artykuły/Events

zawarlem w nim moja wysmazona na dniach mikro-biblioteczke pozwalajaca na w miare wygodne definiowanie zdarzen (eventow), ktorym mozna zarejestrowac sluchaczy (eventhandlers), i ktore pozniej mozna odpalic (event::fire(args..) ) co spowoduje odpalenie wszystkich zarejestrowanych sluchaczy.

zalozenia:

  • nie musi byc hiper-szybkie, stad brak fastcalli itp
  • zadnych hackow niskopoziomowych, jak najwiecej pisane w czystym c++
  • typesafety gdzie tylko sie da
  • event musi umiec przechowywac callbacki do roznych obiektow do metod o tej samej sygnaturze
  • event::fire moze dostarczac callbackow parametrow, kazdy z nich ma dostac to samo, przez kopie lub nie przez kopie - zalezy od definicji
  • callbacki nigdy nic nie zwracaja (->bo co by robic z calym zestawem N wartosci zwroconych z N callbackow?)

chetnie przyjme konstruktywne uwagi i sugestie wykonalnych zmian i poprawek :)

0

To ja mam pytanie - co sądzisz o Boost::Signals? Z tego co wiem rozwiązanie jest bardzo ciekawe i szybsze. Np. takie Qt nagminnie korzysta z sygnałów i slotów.

Aaa i dodaj, że wymaga boost żeby ludzie się błędom nie dziwili ;P

0

oczywiscie ze jest wieksze, szybsze, lepsze i naj- ;)
nie chcialem pisac od nowa calego frameworka, jedynie sprobowac napisac cos a'la jego core - pokazac, jak mozna napisac "kontener" trzymajacy callbacki i referencje do obiektow roznych klas, tak zeby bylo w miare zrozumiale :))
jakby to miala byc "powazna" rzecz, to bym chciazby zatroszczyl sie o wsparcie dla funktorow boost::bind zamiast pisac make_handler..

0
DzieX napisał(a)
`boost' has not been declared        test        EventBase.h        line 10        1203068524646        2720
..
boost/smart_ptr.hpp: No such file or directory        test        EventBase.h        line 5        1203068524646        2702

w EventBase.h:5 jest #include <boost/smart_ptr.hpp>. wyglada na to ze nie masz boost'a poprawnie doczepionego

0

Gapnąłem się chwile po napisaniu posta. Korzystając z sytuacji, nie wiesz jak poprawnie skompilować boosta dla mingw? Próbowałem przeróżnych kombinacji - statycznie, dynamicznie, ale nigdy nie udało mi się potem poprawnie zlinkować go w programie. Dodam, że gdy używałem MSVC 8.0 to kompilacja i użycie przebiegała bez problemów. Tzn. podawałem mu w ścieżkach gdzie znajdują się pliki *.lib, gdzie nagłówki i wszystko banglało. Pod gcc tak nie jest :(

Trochę offtopic, ale myślę że więcej osób użyje twoich zdarzeń gdy będą mieli boosta :)

0

niestety, nie wiem:( jeden jedyny raz kompilowalem boosta pod mingwem, to bylo jakies 1-2 lata temu jak stawialem sobie srodowisko pod cygwinem pod windowsami.. ale nie przypominam sobie zadnych problemow.. linia polecen, ustawialo sie toolset na ten od mingwa, puszczalo bjam'a i juz.. a, no i trzeba bylo boost'owe katalogi include i lib dodac do pathow INCLUDE i LIB, ale to dosc oczywiste. jak tak pomysle.. jakis problem mialem -- krzyzowaly mi sie MAKE'i, tzn. bjam odpalal 'make -f Makefile' i ... odpalal sie nmake z Visuala ktorego tez mialem zainstalowanego. drobna zabawa pathami znowu i juz make z GNU mial pierwszenstwo.. wiecej nie pamietam, zbyt dawno to bylo - i to byl jeszcze boost w starej wersji, nie 1.34

0

Ha! Udało się. Polecam paczkę MinGW 3.5 http://nuwen.net/mingw.html Boost jest "wbudowany". No i koniecznie opcje -lnazwa_biblioteki o ile jest potrzebna.

0

Eee, offtopa Ci quetzalcoatl zrobię, tego boosta kontynuując. Nie chciałem się odzywać, bo mi głupio trochę z tego powodu... ale DzieX mnie ośmielił stwierdzeniem, że jednak to normalne, że:

koniecznie opcje -lnazwa_biblioteki o ile jest potrzebna

no ale właśnie... na pewno normalne? nie da się zainstalować boosta jakoś tak w stylu biblioteki standardowej, znaczy, żeby automatycznie linkował? To trochę deprymujące, jak na chama trzeba wklepywać nazwę liba, którego się używa, albo wsadzać cały komplet 13-tu plików, do każdego boostowego projektu... :|

Nie da się tej listy jakieś jedno "shared-miejsce" dać?
I czy Visual Studio też tak ma, czy wystarczy gdzieś globalnie coś ustawić?

0

hmhm.. dziwne.. uzywam sobie boost::thread, pamietam ze ono wymagalo kompilacji.. i u mnie wystarczy pod visualstudio dac #include <boost/thread.hpp> i zadnej podpowiedzi dla linkera nie musze dawac. podejrzewam ze gdzies w naglowkach threada jest umieszczona linijka a'la:

#pragma comment(lib, "nazwa.lib")

...grep grep grep..
o, mam:

#include <boost/thread.hpp>
->
#include <boost/thread/thread.hpp>
->
#include <boost/thread/detail/config.hpp>
->
....blahblahblah
#include <boost/config/auto_link.hpp>
->
...blaaaaaah
...blaaaah
#ifndef BOOST_AUTO_LINK_NOMANGLE
#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION ".lib")
#  ifdef BOOST_LIB_DIAGNOSTIC
#     pragma message ("Linking to lib file: " BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION ".lib")
#  endif
#else
#  pragma comment(lib, BOOST_STRINGIZE(BOOST_LIB_NAME) ".lib")
#  ifdef BOOST_LIB_DIAGNOSTIC
#     pragma message ("Linking to lib file: " BOOST_STRINGIZE(BOOST_LIB_NAME) ".lib")
#  endif
#endif

czyli o ile Twoj compiler rozumie pragma-comment-lib ORAZ masz sciezki do libow boosta dodane do kompilatorowego searchpath'a, to powinno sie automatycznie linkowac.

edit: oczywiscie, o ile dana biblioteka z boosta uzywa tego systemu auto-link. sprawdzalem na threadzie, za inne glowy nie dam, ale wydaje mi sie ze wszystkie tego uzywaja

0

@quetzalcoatl
Ale przecież rozszerzenia *.lib nie są dla gcc. Biblioteki zbudowane dla gcc mają rozszerzenia *.a. Znajomy użytkownik linuksa powiedział mi że przy konfiguracji statycznej, tj. takiej w której nie trzeba bibliotek ładowanych dynamicznie, zawsze podaje się z opcją -lnazwa_liba. Można to potem wrzucić do makefile'a i się nie przejmować, bo to operacja jednorazowa. Jako że MinGW to port gcc dla windowsa, więc pewnie tu jest tak samo. Zresztą chyba w instrukcji na stronce boost.org też jest to zaznaczone. tu i to:

Auto-Linking

Most Windows compilers and linkers have so-called “auto-linking support,” which eliminates the second challenge. Special code in Boost header files detects your compiler options and uses that information to encode the name of the correct library into your object files; the linker selects the library with that name from the directories you've told it to search.

The GCC toolchains (Cygwin and MinGW) are notable exceptions; GCC users should refer to the linking instructions for Unix variant OSes for the appropriate command-line options to use.

Kiedyś używałem vc++, ale zbuntowałem się, bo VS pod względem funkcjonalności dla C++ jest naprawdę biedne. Głupie CDT dla Eclipse'a jest dużo lepsze...

Bibliotek boost jest tylko tyle:

c:\MinGW\lib\libboost_date_time.a
c:\MinGW\lib\libboost_filesystem.a
c:\MinGW\lib\libboost_graph.a
c:\MinGW\lib\libboost_iostreams.a
c:\MinGW\lib\libboost_prg_exec_monitor.a
c:\MinGW\lib\libboost_program_options.a
c:\MinGW\lib\libboost_regex.a
c:\MinGW\lib\libboost_serialization.a
c:\MinGW\lib\libboost_signals.a
c:\MinGW\lib\libboost_system.a
c:\MinGW\lib\libboost_test_exec_monitor.a
c:\MinGW\lib\libboost_thread.a
c:\MinGW\lib\libboost_unit_test_framework.a
c:\MinGW\lib\libboost_wave.a
c:\MinGW\lib\libboost_wserialization.a

więc, przy większym projekcie to chyba nie jest specjalnie wkurzające :)

@Ranides
Jest opcja zbudowania dllek boostowych. Tylko głupio to wygląda - program niemal w czystym C++ a obok dll. Poza tym ja tradycyjnie nie umiem tego zrobić ;P

0

1' ah.. mingw, trzeba bylo tak od razu - tutaj nie ma bata, -lbiblioteka i koniec. nie wiedzialem ze o mingw mowicie.
2' dll? ale wtedy tez i tak trzeba dolinkowac liba/a od tej dllki, wiec bez roznicy w tym temacie!

0

DzieX, dzięki za wyjaśnienie w kwestii: "czy aby na pewno nie jestem ułomny" ;) Jeśli chodzi o build pod gcc w Windows, to niedawno przechodziłem i w jednym środowisku mi szło, w drugim nie - znaczy, że MinGW musi być "dopakowany". Ja to robiłem tak, być może nadmiarowo.
Ściągnąłem

  • boost_1_34_1
  • boost-build-2.0-m12
  • boost-jam-3.1.16-1-ntx86
    rozpakowałem jedno na drugie do wspólnego foldeu.
    i wpisałem za manualem:
    bjam --toolset=gcc stage
    pewnie z samym MinGWem cholerstwem coś nie tak masz.
    Wywal z path wszystkie inne kompilatory, albo daj na sam koniec, niech MinGW będzie pierwszy. Jakie paczki mam zainstalowane w MinGW?
    binutils 2.16.91
    gcc-core 3.4.2
    gcc-g++ 3.4.2
    gcc-objc 3.4.2
    gbb 6.6
    mingw32-make 3.81
    mingw-runtime 3.13
    mingw-utils 0.3
    w32api-3.10
    I MSYSa mam, chociaż to nie powinno być wcale istotne.
    mktemp-1.5-MSYS
    msys 1.0.10
    msys-autoconf 2.59
    msys-automake 1.8.2
    msys-libtool 1.5

Na takim mixie kompilacja idzie. I trwała u mnie 3-6 godzinm, generując 3-3.5 GB plików, z czego 800MB w "stage". Są tam m.in dlle, release buildy, debug buildy, thread-safe'y i niesafe'y. Po odsianiu zostało 200 MB ;]

0

tylko 200? waw.. u mnie boost po 'skomplikowaniu' wazy 1g08 :)

a tak jak juz gadamy o booscie.. bawilem sie ostatnio wyciagnietym z sandboxa boost::statechart.. yezu.. ale miodzio..

0

Eee to i tak macie dużo. Wystarczy po jednej bibliotece *.a z każdego zagadnienia skopiować do katalogu mingw\lib. Waga? 10MB. Chyba że o czymś nie wiem ;P

@Ranides
Ale co Ty rozmawiasz? Kompilacja boost na mingw idzie gładko. Miałem tylko problemy z linkowaniem, ale już rozwiązane. Skompilowałem sobie nawet asio :)

@quetzalcoatl
A co to jest to to?

0

statechart = frameworczek do implementowania maszyny stanow, zerknij na UML: statemachine diagram, moj ulubiony :) jak jeszcze do tego dolozyc watki.. komunikaty lataja az milo, wszystko zdefiniowane wedlug modelu, zero wpadek w switchach po typach wiadomosci, zero wpadek przy przejsciach przez stany.. IMHO, bomba. ale - trzeba dobrze zaprojektowac

0

DzieX, piszę, hmmm... tak z związku z tym na przykład?

Ha! Udało się. Polecam paczkę MinGW 3.5 http://nuwen.net/mingw.html Boost jest "wbudowany"

Znaczy, nie wiem, co to znaczy "wbudowany", ale w w prostocie swej pomyślałem, że warto bezpośrednio ze źródła wyciągnąć binarki - chociażby dlatego, żeby mieć te kilkaset MB - w końcu 10MB, to znaczy, że masz tylko-ale-to-tylko jakąś wersję release, a robiąc własnego bydlaka masz ładne parę kompletów, między którymi możesz wybierać, chociażby informacje dla debuggera są.

Ale jak problemu nie ma... ja tu tylko sprzątam (ba, nawet to nie).

0

Aaa, bo zapomniałem napisać. Wróciłem do oficjalnego wydania mingw bo tamtego z kolei nie wspiera Qt. Z tego co mi się zbudowało wybrałem po jednym libie i skopiowałem do katalogu. Co do różnych wersji tego samego to owszem ale chyba aż takich wielkich projektów nie piszę :P Oczywiście leżą sobie na innej partycji nieużywane. A Qt właśnie kończy się budować.

0

nie wiem jak z mingwem, ale w kontekscie VisualStudio - trzeba miec komplet.. static/DLL, singlethreaded/multithreaded, debug/release.. 8 wersji wszystkiego. i ni hu hu bez ktorejs. debug/release chyba nie trzeba tlumaczyc czemu, single-multi -- chyba tez nie. erm. ok. w kontekscie boost::thread, tutaj rzeczywiscie mozna sobie single darowac, bo to deko bezsensu :)))) ogolnie to z czystym sumieniem chyba tylko kolekcje staticlibow mozna sobie darowac i jechac tylko na dllkach, ale to i tak zostaja 4ry wersje wszystkiego:)

0

Stąd pobierzesz skompilowane biblioteki boost - może coś będzie pasować: http://widera.com.pl/boosting-mainmenu-14/get-compiled-boost-library.html

0

wiesz.. dla vc90 lepiej brac z boost-consulting. jesli chciales zarekamowac swoja (?) stornke, warto raczej by bylo wspomniec ze opublikowales tez binaria dla mingw

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