Hoi
ben bezig met een cross-platfom realtime video libary (voor alle cameras, tuners) op windows, linux, mac en mobile platforms.
sinds ik windows gewoon ben heb ik de directshow implementatie (en VFW) het eerst geschreven.
om het toch lekker cross platform te houden heb ik een heel eenvoudig interface zodat de backend (VideoForlinux, Quicktime, ...) gewoon kan swappen zonder client code changes...
zo kan al de client end code gewoon met de interfaces werken ipv 'native' solutions. Maar in c++ kom ik op dit probleem:
wat blijkt de destructor van t (DirectShowImageServer()) wordt NIET aangeroepen! en cleaned het object zelf niet op. Wat sinds er soms gebruik gemaakt wordt van callbacks en multiple threads soms tot een heel mooi accessviolation geeft.
Ik wel geen REF count gaan gebruiken want moet een lowel level API zijn en geen goesting voor het heruitvinden van DCOM. Trouwens je kan dit dan gewoon wrappen.
nu gaat het wel MAAR nu is IImageServer een abstracte classe en geen echte interface.
en dat vind ik niet proper. Wat het eigenlijk zou moeten zijn lukt me langs geen kanten
om op te lossen:
compiled gewoon niet (wat ik ook wel snap) maar wil dit zeggen dat je geen ECHTE destroyable interfaces kunt maken? en dat elke interface een soort van 'destroy' method moet hebben?
in Java heb je die issues natuurlijk niet want is allemaal REF based en ook in COM (windows) is een
interface altijd ref (vandaar dat __interface geen destructor allowed).
Wat denken dat ik best zou doen? method of abstract (met name op zicht voor cross platform)
ben bezig met een cross-platfom realtime video libary (voor alle cameras, tuners) op windows, linux, mac en mobile platforms.
sinds ik windows gewoon ben heb ik de directshow implementatie (en VFW) het eerst geschreven.
om het toch lekker cross platform te houden heb ik een heel eenvoudig interface zodat de backend (VideoForlinux, Quicktime, ...) gewoon kan swappen zonder client code changes...
C++:
1
2
3
4
5
6
| class IImageServer { //*snip* public: virtual IImage* get_next() = 0; } |
zo kan al de client end code gewoon met de interfaces werken ipv 'native' solutions. Maar in c++ kom ik op dit probleem:
C++:
1
2
3
4
5
6
7
| //ergens in de factory of #ifdef clause per platform... niet belangrijk. IImageServer* t = reinterpret_cast< IImageServer* > (new DirectShowImageServer()); //do all the stuff (no probs) delete t; |
wat blijkt de destructor van t (DirectShowImageServer()) wordt NIET aangeroepen! en cleaned het object zelf niet op. Wat sinds er soms gebruik gemaakt wordt van callbacks en multiple threads soms tot een heel mooi accessviolation geeft.
Ik wel geen REF count gaan gebruiken want moet een lowel level API zijn en geen goesting voor het heruitvinden van DCOM. Trouwens je kan dit dan gewoon wrappen.
C++:
1
2
3
4
5
6
| class IImageServer { public: virtual ~IImageServer() {}; //add virtual destructor virtual IImage* get_next() = 0; } |
nu gaat het wel MAAR nu is IImageServer een abstracte classe en geen echte interface.
en dat vind ik niet proper. Wat het eigenlijk zou moeten zijn lukt me langs geen kanten
om op te lossen:
C++:
1
2
3
4
5
6
| class IImageServer { public: virtual ~IImageServer() = 0; //but pure doesn't work virtual IImage* get_next() = 0; } |
compiled gewoon niet (wat ik ook wel snap) maar wil dit zeggen dat je geen ECHTE destroyable interfaces kunt maken? en dat elke interface een soort van 'destroy' method moet hebben?
in Java heb je die issues natuurlijk niet want is allemaal REF based en ook in COM (windows) is een
interface altijd ref (vandaar dat __interface geen destructor allowed).
Wat denken dat ik best zou doen? method of abstract (met name op zicht voor cross platform)
offtopic:
wel effe anders dan ActionScript v2.0
wel effe anders dan ActionScript v2.0