180

bien entendu on ne peut pas attendre autre chose d'un mec du steering commitee de KDE, environnement qui se base avant tout sur Qt. Ca fait rien, c'est pas grave.

181

Déjà KDE n'a pas de "steering committee" et puis je ne suis que simple développeur (mainteneur de Kompare) dans le projet KDE, je ne suis dans aucun comité du projet KDE. (En revanche, je suis dans le Fedora KDE SIG Steering Committee, et actuellement aussi dans le Fedora Engineering Steering Committee (FESCo) (mais les élections sont proches et je ne compte pas me reporter candidat).)

Et puis certains endroits de KDE utilisent Boost, du moins certains modules. Ma position n'est pas un avis global au projet KDE, il y a des développeurs de KDE qui apprécient Boost. (Mais cela n'implique pas non plus forcément qu'ils le conseilleraient à un débutant.)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

182

c'est pareil. fedora => kde4 => Qt
Kevin Kofler (./182) :
Mais cela n'implique pas non plus forcément qu'ils le conseilleraient à un débutant.


Qt n'est pas mieux.

fin bref Folco comme dit, je pense qu'en premier lieu c'est bien de coder ton truc à la main.

183

Je suis un peu d'accord avec Kevin, Boost est une usine a gaz complexe pour un débutant alors que Qt est plus accessible. Mais bon les 2 bibliothèques ont des objectifs différents qui ne permettent pas de les comparer objectivement!
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

184

Ce qui m'emmerde avec Qt, c'est que tu te plonges dans u QOBJECT dont tu ne connais ni les tenants ni les aboutissants, et ton code est à moitié complété tu-sais-pas-comment, bref je n'ai pas besoin de ça. Peut-être plus tard.

185

./179 Ah ok, en vérité je n’ai jamais utilisé Boost grin Je me basais juste sur ce que j’ai pu en lire…
En fait, je pensais que ce serait un peu moins lourd que Qt, et surtout ça me semble un peu dommage d’utiliser Qt juste pour QtCore.

Folco, j’ai une idée de projet pour toi si tu t’ennuies : un LXDE like Qt-based.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

186

http://lxde.org/

Le seul problème, c'est que là tu me prends pour un mec bon en informatique grin

187

Sasume (./177) :
Le type de message en void *, c’est une mauvaise idée. Le destinataire ne saura pas vraiment quel est le message, à moins de faire de l’introspection, mais c’est généralement une mauvaise idée.

Le truc, c'est que si le destinataire reçoit un void* vers un objet, il saura grâce au m_MsgMain ce dont il s'agit comme objet (m_MsgMain comportant une donnée du genre OBJET_TRUC ou OBJET_MACHIN). Le destinataire saura comment traiter l'objet.
Sasume (./138) :
Une façon simple de faire ça c’est de configurer ton bouton à l’initialisation en lui passant en paramètre l’action à réaliser. Et au moment convenu, le bouton exécutera l’action. Qu’est-ce qu’une Action ? Ça peut être une classe abstraite (ce qu’on appelle une interface en conception objet) qui contient une opération virtuelle pure (abstraite) : execute(). Tu pourras ainsi simplement créer une classe pour chaque action, lui faire implémenter l’opération execute() où tu lui feras faire ce que tu voudras, et ensuite passer une instance de cet classe en paramètre à ton icône, qui se chargera d’appeler sa méthode execute.

Graphiquement, ça donne cette architecture :
tromb.gif Fichier joint : WrUD (action.png)

Ce que je ne comprends pas, c'est le fonctionnement exact. Si je fais exécuter l'action (par exemple, lancement d'un nouveau Module) par l'icone, le TaskManager perd la main sur ce qui se passe, alors que c'est lui qui est censé lancer puis gérer (décharge par exemple) les modules. Si Module1 peut lancer Module2 qui peut lancer Module3 qui peut lancer Module1, je vais avoir une boucle et un enchainement d'objets chargés les uns par dessus les autres.
Si ça passe par le task manager, Module1 demande le chargement de Module2 tout en demandant sa décharge, Module2 demande le chargement de Module3 tout en demandant sa décharge etc... Ca évite l'empilement en mémoire de modules qui n'ont plus rien à y faire.

Sinon, comment une icone de ModuleX peut-elle elle-même décharger le module auquel elle appartient, et donc entrainer sa propre destruction (le destructeur du module provoquant la destruction des objets le contenant), puis lancer un nouveau module ?

188

Ouais, le truc un peu chiant, c’est que c’est un élément à l’intérieur d’un module qui doit activer le switch de modules, alors qu’un module n’a pas forcément connaissance des autres modules.
[nosmile]
La solution très simple, c’est que chaque module connaisse le TaskManager, comme ça il peut directement lui dire quoi faire en fonction des boutons qui sont cliqués. Mais du coup ça introduit un couplage entre les modules et le TaskManager…

Pour découpler ça, il faut que chaque module ne fasse que « notifier » un observateur (qui sera le TaskManager) quand un événement important a lieu. Tu peux jeter un coup d’œil au design pattern Observer.

Je pense que ça n’est pas si grave que chaque Module connaisse le TaskManager (parce que sinon on n’en finit pas de mettre de la distance entre les classes, il y a bien un moment où il faut s’arrêter…).
class TaskManager { public: TaskManager(); void loadTitle(); void startGame(); void mainLoop(); private: Module *activeModule; Module *titleModule; Module *gameModule; boolean quit; }; TaskManager::TaskManager() { titleModule = new TitleModule(this); gameModule = new GameModule(this); activeModule = titleModule; quit = false; } void TaskManager::loadTitle() { activeModule = titleModule; } void TaskManager::startGame() { activeModule = gameModule; } void TaskManager::mainLoop() { while (!quit) { activeModule->run(); } } typedef void (*CallBack)(void); class Icon : public Component { public: Icon(CallBack callBack); void onClicked(); private: Callback callBack; }; Icon::Icon(CallBack callBack) { this->callBack = callBack; } void Icon::onClicked() { callBack(); } class Module { public: virtual void run() = 0; }; class TitleModule : public StaticModule { public: TitleModule(TaskManager *tm); private: Icon *startGame; }; TitleModule::TitleModule(TaskManager *tm) { startGame = new Icon(tm->startGame); } void TitleModule::run() { // s’afficher et gérer les icônes // si une icône est cliquée, appeler // son opération onClicked }
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

189

Sasume (./188) :
Ouais, le truc un peu chiant, c’est que c’est un élément à l’intérieur d’un module qui doit activer le switch de modules, alors qu’un module n’a pas forcément connaissance des autres modules.

Voilà, qui plus est, j'ai pas envie qu'une simple icone (ie un sprite qui réagit à la souris et qui renvoie un message en cas de clic) apprenne à lancer un module.
Sasume (./188) :
La solution très simple, c’est que chaque module connaisse le TaskManager, comme ça il peut directement lui dire quoi faire en fonction des boutons qui sont cliqués. Mais du coup ça introduit un couplage entre les modules et le TaskManager…

Eh oui... C'est pour ça que j'ai fait la classe Message (il faut bien de la communication entre modules quand même), un bouton ou autre écrit un message, tout simplement, sans même se préoccuper de savoir ce que ça va faire et comment le faire.
Sasume (./188) :
Pour découpler ça, il faut que chaque module ne fasse que « notifier » un observateur (qui sera le TaskManager) quand un événement important a lieu. Tu peux jeter un coup d’œil au design pattern Observe

Voilà. Le TaskManager crée une instance unique de Message, dont l'adresse est fournie aux différents objets qui ont besoin de lire/écrire des messages. Je vais regarder Observer, merci bien pour le nom.

Par contre, j'ai prévu qu'un message contienne l'ID de son destinataire, qui n'est pas forcément le TaskManager : une icone peut envoyer un message à son module, ça évite par exemple que l'icone aille bidouiller directement une autre icone, ou une liste, etc... Ca reste un simple message à son niveau, et c'est seulement une info qui est répercutée à qui de droit.
Un objet n'a donc pas à savoir comment en utiliser un autre, c'est l'autre qui sait quoi faire à partir du message reçu.
Sasume (./188) :
Je pense que ça n’est pas si grave que chaque Module connaisse le TaskManager (parce que sinon on n’en finit pas de mettre de la distance entre les classes, il y a bien un moment où il faut s’arrêter…).

En fait, il ne connait que Message, et il s'adresse au TaskManager par message.

Mon concept est moins bon que ce que tu proposes ?

void TaskManager::mainLoop() 
{ 
  while (!quit) { 
    activeModule->run(); 
  } 
}

Je compte plutôt faire
PlanePtr = activeModule->CreatePlane();
<consultation de Message s'il y a un message pour quitter>
<attente/synchro>
MainScreen.dispPlane(PlanePtr);

190

Folco (./189) :
Mon concept est moins bon que ce que tu proposes ?
Non, ton idée me paraît plutôt bonne.
C’est le coup du void * qui est mal. C’est toujours une très bonne idée de bien typer ses données.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

191

avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

192

En effet grin

J'ai pensé à faire une classe fourre-tout, mais est-ce propre ? Je ne veux pas non plus faire une classe avec tous les objets possibles et immaginables du programme (tout serait extrêmement lié du coup, tous les headers à inclure dans chaque classe etc...). Je trouve ça crade. Le seul truc commage, c'est qu'il n'y ait pas de pointeurs UnknownObject* ^^
Bref, un bon vieux void* fera l'affaire grin

193

Attends Kevin, tu nous sors le qvariant, et tu oublies de dire la quantité de merdes que ça pose dans visual basic?

un essayage de typage dynamique dans un langage a typage statique, ça fait tilt à personne?

194

Pas à moi en tout cas. On peut typer dynamiquement en C++ ? Un simple cast fera l'affaire non, je ne parle que de pointeurs ici, c'est pas là mort ?

195

Il y a plusieurs templates de cast en C++. static_cast, const_cast, reinterpret_cast, et j'en oublie.

Les types Variant sont effectivement plutôt une mauvaise idée en pratique, et pas que pour des raisons de performance...
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

196

Bah avec void * (et Object en Java) tu peux faire passer tout ce que tu veux comme données. Ce genre de pratique conduit souvent à des bugs détéctés uniquement à l’exécution alors que le C++ et le Java sont plutôt des langages à typage statique, qui te permettent de détecter pas mal d’erreur statiquement, c’est-à-dire lors de la compilation.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

197

oui mais au moins Object et void* ce sont des features naturelles du langage, on sait ce que ça fait, et ça fait tout. mais un qVariant regarde le bien, il ne contient qu'un nombre limité de possibilités de transformations.

bref il sert à la même chose qu'object et void* mais il le fait moins bien fleche poubelle

198

squalyl, c'est toi qui n'as pas compris l'intérêt ni le fonctionnement de QVariant:
1. Contrairement à static_cast sur des void *, c'est type safe! (Et dynamic_cast ne marche pas avec des types de base, ni avec les classes sans vtable d'ailleurs, donc ce n'est pas une alternative non plus.) Certes, ce n'est type safe qu'à l'exécution, pas à la compilation (normal, c'est du typage dynamique!), mais ça te garantit que tu ne transtypes pas en le mauvais type.
2. Tu peux mettre pratiquement n'importe quel type dans un QVariant, il suffit de le déclarer avec Q_DECLARE_METATYPE. Regarde les méthodes qui font référence à un type T dans la doc, ce sont des templates qui acceptent n'importe quel type.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

199

j'ai déja eu à utiliser les QmetaTypes, et je sais que c'est ni facile ni évident à utiliser.

200

J’ai déjà rencontré, moi aussi, des limitations avec QVariant, du coup j’ai du contourner en faisant un dynamic_cast… (mais je ne me souviens plus du problème en question)
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

201

Bah, pour moi, les types perso dans QVariant marchent très bien.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

202

le problème c'est quand tu te retrouves avec des erreurs incompréhensibles en utilisant n'importe quoi avec qvariant, et que de toute ta vie tu n'as JAMAIS entendu parler de QMetaObject, et que tu perds une demi journée en cherchant ce qu'il faut faire </vecu>.

le qvariant, il varie comme il veut en fait.

203

squalyl (./202) :
le problème c'est quand tu te retrouves avec des erreurs incompréhensibles en utilisant n'importe quoi avec qvariant, et que de toute ta vie tu n'as JAMAIS entendu parler de QMetaObject, et que tu perds une demi journée en cherchant ce qu'il faut faire </vecu>.

Bah, si tu utilises "n'importe quoi", il te faut un Q_DECLARE_METATYPE(n'importe quoi) et puis tout passera. smile
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

204

Kevin Kofler (./204) :
et que de toute ta vie tu n'as JAMAIS entendu parler de QMetaObject


T'as des pixels morts sur ton écran ou quoi?

205

(erreur de cite)
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

206

squalyl (./204) :
Kevin Kofler (./204) :
et que de toute ta vie tu n'as JAMAIS entendu parler de QMetaObject


T'as des pixels morts sur ton écran ou quoi?

Tout est détaillé clairement dans la doc de QVariant, ça aide de lire. roll La doc de Qt est parmi les meilleures!
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

207

pencil Tu ne peux pas utiliser QVariant et ne jamais avoir entendu parler de QMetaObject
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

208

Bon, ça a plus sa place ici : http://www.regismedina.com/articles/fr/principes-avances-conception-objet (posté par Jackosking ici : topics/128031-striiiiiiiiiiiiiiing/34 ).

Bon, c'est donc hyper intéressant. J'ai beaucoup tiré de cette lecture ainsi que de tous les termes que vous avez employé lors de vos discussions (WP powa). Enfin, je crois en avoir beaucoup tiré grin

Par exemple, un truc qui a été un véritable flash fut ça : http://fr.wikipedia.org/wiki/Extreme_programming#Conception_simple
Je fais toujours compliqué, évolutif et tout ce qu'on veut. Forcément, comme c'est trop compliqué pour moi, ça n'évolue jamais parce que ce n'est jamais finalisé. grin

Par contre, ça ne me dérange pas de réimplémenter x fois la même chose dans différents projets (ou en réimplémentant pour la n-ième fois un projet) : je ne suis pas un pro, je n'ai pas du tout les contraintes de livraisons et de réutilisabilité du code qu'on les entreprises. Mais ça reste intéressant. Ca donne une idée de la complexité pour mener à terme un projet info.

209

Folco (./208) :
Par exemple, un truc qui a été un véritable flash fut ça : http://fr.wikipedia.org/wiki/Extreme_programming#Conception_simple
Je fais toujours compliqué, évolutif et tout ce qu'on veut. Forcément, comme c'est trop compliqué pour moi, ça n'évolue jamais parce que ce n'est jamais finalisé. grin

C'est ce que j'essaie de te faire comprendre depuis longtemps, mais tu ne m'as jamais écouté. roll

Par exemple ça ne sert strictement à rien d'avoir des programmes chargés dynamiquement en RAM morceau par morceau ou exécutés directement en FlashROM quand le programme fait moins de 10 KO sur une machine qui a 100-200 KO de RAM disponible.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

210

Ce que je trouve assez formidable dans l'EP, c'est qu'on a réussi à théoriser de façon quasi rationnelle la Rache grin
avatar