2009-09-14 11 views
1

J'écris actuellement une bibliothèque de wrapper pour Windows Mobile en C/C++. Je dois mettre en œuvre et d'exporter les fonctions suivantes:Windows Mobile/C: Attendre jusqu'à ce que la variable change

void start_scanning(); 
int wait_for_scanning_result(); 
void stop_scanning(); 

start_scanning() est appelée pour démarrer le processus de numérisation. wait_for_scanning_result() attendra jusqu'à ce qu'un résultat soit disponible et le renvoie, et stop_scanning annulera le processus.

La bibliothèque que j'utilise possède une fonction de rappel qui est exécutée lorsqu'un résultat est disponible.

void on_scanning_result(int result) 
{ 
    /* My code goes here */ 
} 

Malheureusement, je dois mettre en œuvre les fonctions ci-dessus, donc mon plan était de le résoudre comme ceci:

void on_scanning_result(int result) 
{ 
    scan_result_available = 1; 
    scan_result = result; 
} 

int wait_for_scanning_result() 
{ 
    /* ... wait until scan_result_available == 1 */ 
    return scan_result; 
} 

Je ne sais pas comment faire cela dans les fenêtres/C et je serais très content que quelqu'un puisse m'aider ou me dire quelles fonctions je dois utiliser pour accomplir ceci.

+1

Est-ce censé fonctionner plusieurs -filée? Si c'est le cas, vous pouvez utiliser des variables de condition ou un synchroniseur d'événements. – Dirk

+0

@Dirk: Cela n'a pas d'importance s'il s'exécute en un ou plusieurs threads. – xsl

Répondre

3

Vous pouvez utiliser les fenêtres Synchronization Functions.

Fondamentalement, tout ce que vous avez à faire est:
* CreateEvent - créer un événement
* WaitForSingleObject - attendent cet événement pour devenir signalé
* SetEvent - signaler l'événement

+1

+1. Ces fonctions existent exactement à ces fins. Malheureusement, les objets Event peuvent être lourds. Pour la question, les incréments et les décréments imbriqués (et wait()) peuvent faire l'affaire ... – SadSido

+0

Comme SadSido dit que c'est une façon correcte mais peut-être un peu lourde - les fonctions critiques des fenêtres pourraient également être utilisées ici. – Elemental

+0

Les événements sont des objets de synchronisation très basiques, supportés par Windows CE 1.0, ils devraient être très rapides. Des repères pour prouver le contraire? –

0

Quelque chose comme ça, je pense:

//declare as volatile to inform C that another thread 
//may change the value 
volatile int scan_result_available; 

int wait_for_scanning_result() 
{ 
    while(scan_result_available == 0) { 
     //do nothing 
    } 
    return scan_result; 
} 

Vous devriez savoir si le rappel va dans un autre thread, ou exécute de manière asynchrone dans le même fil, ou si la bibliothèque a besoin d'autres moyens pour permettre le rappel courir.

+0

Y at-il quelque chose à côté de l'attente dans une boucle que je pourrais faire? Je m'attendais à quelque chose comme des sémaphores. – xsl

+0

Oui, il y en a, mais je crains de ne pas être familier avec Windows Mobile. – Artelius

+0

En fait, ce serait une idée assez stupide à faire. Je ne connais pas de CPU multi-core pour la plate-forme WM, donc quand cette boucle s'exécute elle empêche l'exécution de l'autre code, et donc scan_result_available ne change pas (!) – MSalters

Questions connexes