Encapsuler api (sans mfc) dans une seule classe

cs_mannix Messages postés 8 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 23 novembre 2004 - 15 nov. 2004 à 17:00
cs_mannix Messages postés 8 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 23 novembre 2004 - 7 déc. 2004 à 14:45
Bonjour à tous, voilà je débute en c++ mais j'ai quand meme reussi à programmer une api qui fonctionne !

mais mon probleme est que ce doit etre un soft "embarqué" et pour cela je dois incorporer le source de cette petite api au source du robot sous forme d'une classe

Comment dois-je m'y prendre svp?

merci d'avance pour vos reponses...

PS : j'utilise vc++
A voir également:

10 réponses

cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
15 nov. 2004 à 18:57
Bonjour,

Tu veux inclure le code des APIs Windows dans un programme embarqué ? Si c'est cela je te répond déjà que c'est impossible.

Pour avoir l'expérience de travailler sur des systems embarqués tu as les libs de ton DSP ou autre proc de ton system à utilisé.

@+
Arnotic,
Admin CS, MVP Visual C++
0
Salut Arnotic, je vai m'expliquer un peu sur mon projet car il n'est (je le pense) pas impossible. en effet, je travaille sur un robot piloté en haut niveau par un prog en c++. Ce programme possede un noyau auquel on peut ajouter des fonctionnalités comme un "recorder" qui permet d'enregistrer les commandes de vitesse ,angle (...) envoyées.
mon api à moi est un simulateur ie il reproduit les commandes et emule les capteurs; il renvoie donc des infos qui doivent correspondre à celles que reçoit le noyau... bref voila pour le contexte

ce n'est pas moi qui est programmé le coeur du prog mais on(mes boss) m'a dit qu'il serait preferable d'encapsuler mon api sous forme d'une seule classe qu'on "grefferait" au noyau pour faire des simulations...
je sais que sous linux il existe des commandes du genre 'fork' qui permettent de lancer des proc en parallele et d'établir des liens entre eux mais sous windows ....

en résumé (pour ne pas faire trop long) je voudrai savoir si tu as des exemples en tete (ou des liens) qui me permettraient d'en savoir un peu plus à ce sujet.

Merci de ton attention, @ plus Mannix
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
16 nov. 2004 à 10:15
Bonjour,

Tu peux en effet encapsuler TES fonctions sous forme de classe se qui te permettra de les réutilisers facilement.

Concernant les gestions des process et des threads sous Windows va voir sur msdn les fonctions CreateProcess(), CreatePipe et ses compagnons ainsi que CreateThread(), ...

http://msdn.microsoft.com/library/

@+
Arnotic,
Admin CS, MVP Visual C++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 nov. 2004 à 14:13
CreateThread() est contre indique quand on utilise des classes, il faut utiliser _beginthreadex() pour que la memoire soit correctement geree.
Richter explique cela en details:
http://brunews.free.fr/brunews/download/JR4.zip
http://brunews.free.fr/brunews/download/JR4Sources.zip

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_mannix Messages postés 8 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 23 novembre 2004
17 nov. 2004 à 11:31
Merci à tous les deux, je vais me plonger là dedans.
Je donnerai des nvelles quand j'aurai avancé.

@+ Mannix
0
cs_mannix Messages postés 8 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 23 novembre 2004
18 nov. 2004 à 16:15
Bonjour,
j'ai un probleme avec la fonction _beginthreadex.
J'ai 1 erreur à la compilation :

'&' : illegal operation on bound member function expression

voici mon code (pour tester la fonction)

j'ai créé une classe simulator et dans simulator.cpp il y a :

#include <windows.h>
#include <stdio.h>
#include 

#include "Simulator.h"

Simulator::Simulator()
{

}

Simulator::~Simulator()
{

}

unsigned int __stdcall Simulator::SimProc(LPVOID)
{
HWND hwnd;
MessageBox(hwnd,"thread","essai",MB_OK);
}

void Simulator::startsim()
{
hThread = (HANDLE) _beginthreadex ( NULL , 0 , &SimProc , NULL , 0 , &threadID ) ;
}



et dans simulator.h :

class Simulator  
{
public:
unsigned int __stdcall SimProc (LPVOID);
Simulator();
virtual ~Simulator();
HANDLE hThread;
HANDLE hEvent;
unsigned int threadID;
void startsim();

};



je ne suis pas un chef dans le maniement des classes et j'ai beau chercher, je ne vois pas ce qu'il veut me signifier par "fonction membre attachée".

je voudrai savoir si vous savez comment gerer ce type d'erreur.

Merci de vos réponses :)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 nov. 2004 à 16:27
Simulator::SimProc doit etre declaree 'static' car compilo doit connaitre son adresse. N'oublie pas de retourner une valeur.

ciao...
BruNews, MVP VC++
0
cs_mannix Messages postés 8 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 23 novembre 2004
18 nov. 2004 à 16:43
merci pour l'info ça marche mais maintenant y'a un probleme pendant le link :

Linking...

Simulator.obj : error LNK2001: unresolved external symbol "public: static unsigned int __stdcall Simulator::SimProc(void *)" (?SimProc@Simulator@@SGIPAX@Z)
LIBCMTD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/essai thread2.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

essai thread2.exe - 3 error(s), 0 warning(s)


est-ce un probleme de librairie ?? j'ai essayé de rajouter libcmt.lib ou msvcrt.lib mais c'est pire (conflit avec libcmtd.lib)!

Merci pour ton attention BruNews
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 nov. 2004 à 16:53
A ce point ça devient mystique, faudrait etre devant pour regler le prob, desole.

ciao...
BruNews, MVP VC++
0
cs_mannix Messages postés 8 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 23 novembre 2004
7 déc. 2004 à 14:45
Bonjour à tous,

bon, voila je suis de retour avec de nouveaux problemes à la clé (normal quoi !)

Je me suis donc lancé dans l'encapsulation à poprement parler de mon api apres maintes simplifications du source.
J'ai donc creer une classe Simulator decrite ci dessous :

#include "../Display/DDraw_Class.h"
#include "../Display/Display.h"
#include "Data_Info.h"
#include "Mode.h"

class Simulator  
{
public:

char szPath[260];
static double speedInMetersByPeriod;
static double steeringAngleInRad;

static void endThread(HANDLE hThread,HANDLE hEvent, DWORD threadID);
static HINSTANCE TheInstance ;
static HANDLE hThread_main;
static HANDLE hEvent_main;
static UINT threadID_main;

private:

HWND hdlgdem;
static HWND hwnd;

static DD_OBJ dd_obj;
static Data_Info informations;
static Display window;
static Mode mode;

Simulator();
virtual ~Simulator();

static char * background_path;
static char * odopix_path;

void startsim();
static unsigned int WINAPI Sim_Thread_Proc( LPVOID );
static int startThread ( HANDLE , HANDLE , DWORD );
static DWORD CALLBACK Thread_Draw_Proc( LPVOID );

static LRESULT CALLBACK Loader (HWND hdlgdem, UINT msg, WPARAM wParam, LPARAM lParam);
static BOOL CALLBACK Main_Window_Proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK Draw_Window_Proc(HWND, UINT, WPARAM, LPARAM);

static double checkSteeringAngle(double angle);
static double drivenDistance;
static double cumulDrivenDistance;
static double speedInMetersBySecond;

static double position_x,position_y,position_theta;

};



A noter que je declare des classes(DD_ODJ, Data_infos ...) dans les variables privées de la classe simulator et toutes les variables dont j'ai besoin dans la classe simulator sont 'static'
Bref ça compile mais lors du link j''ai l'erreur classique :

simcab.obj : error LNK2001: unresolved external symbol "public: static double Simulator::steeringAngleInRad" (?steeringAngleInRad@Simulator@@2NA)
Simulator.obj : error LNK2001: unresolved external symbol "public: static double Simulator::steeringAngleInRad" (?steeringAngleInRad@Simulator@@2NA)
simcab.obj : error LNK2001: unresolved external symbol "public: static double Simulator::speedInMetersByPeriod" (?speedInMetersByPeriod@Simulator@@2NA)
Simulator.obj : error LNK2001: unresolved external symbol "public: static double Simulator::speedInMetersByPeriod" (?speedInMetersByPeriod@Simulator@@2NA)
Simulator.obj : error LNK2001: unresolved external symbol "public: static struct HINSTANCE__ * Simulator::TheInstance" (?TheInstance@Simulator@@2PAUHINSTANCE__@@A)
Simulator.obj : error LNK2001: unresolved external symbol "public: static void * Simulator::hThread_main" (?hThread_main@Simulator@@2PAXA)


(je n'ai pas mis ttes les erreurs bien sur mais seulement un aperçu)

Si vous avez le temps de vous pencher 2 minutes sur mon probleme et que vous avez la soluce (car je pense que je n'ai pas la bonne methode) je vous serai reconnaissant de me la donner.

Voila @+ et MERCI d'avance !

_--''MANU''--_
0
Rejoignez-nous