2010-11-03 19 views
0

Pour les applications qui ne devraient pas mourir, devrait mettre en œuvre en boucle, afaik. commepourquoi alors que la boucle est utilisée pour les processus non-moribonds?

while(){ 
    key = getKeyPress(); 
    if(key) 
    processKey(key); 

} 

Je peux voir 200 programmes suspendus quand je l'utilise "top". Cela signifie qu'il y a 200 boucles en cours!

Je m'attends à ce que chaque programme place le hook pour les événements dans le système d'exploitation. Lorsque ces événements se produisent en utilisant sys pour appeler ces crochets de programme.

Les programmes Web exécutent les codes javascript lors de l'initialisation. Ensuite, on accroche un bouton si on clique ($ ('button') .clic (myClickJs)), on hook pour timer (setInterval) etc. On n'utilise pas de boucle pour attendre des évènements entiers sur une page. Une telle approche permet d'économiser beaucoup de temps et de ressources.

Pourquoi il n'y a pas une telle approche?

+3

Je n'arrive pas à comprendre ce que vous demandez. Pourquoi n'y a-t-il pas * quelle * approche? –

Répondre

0

Pour les "applications qui ne devraient pas mourir", une boucle DOIT être implémentée quelque part. Vous ne pouvez pas contourner cela.

Dans votre exemple de code, il est nécessaire d'appuyer sur une touche avant de faire ce qui doit être fait en réponse à cette touche. Après que la touche soit détectée et traitée, comment la réinitialiser pour attendre une autre touche (ou un autre type d'entrée)? La réponse est bien sûr d'utiliser une boucle (comme vous l'avez fait).

Cette boucle "externe" ne reflète en aucun cas ce qui se passe dans la routine 'getKeyPress()'. Il existe deux modes dans lesquels cette routine peut éventuellement fonctionner: interrogation et blocage.

S'il s'agit d'une routine d'interrogation, votre exemple de code attendra effectivement jusqu'à ce qu'une touche soit enfoncée. Ceci est connu pour être une utilisation inefficace du processeur (bien que pour certains problèmes c'est la bonne solution).

S'il s'agit d'une routine de blocage, le thread/tâche se bloque jusqu'à ce qu'une touche soit enfoncée. Bien que bloqué, ce thread/tâche ne consommera aucun cycle de processeur, ce qui leur permettra d'être utilisé par un autre thread/tâche/processus. Pour les besoins de cette réponse, les détails spécifiques sur la façon dont cet appel de blocage est implémenté sont sans importance. Le concept important est que le thread/tâche peut bloquer.

Sans la boucle "externe", vous n'obtiendrez qu'un seul passage pour détecter et traiter les appuis, que vous ayez des crochets ou non.

Espérons que cela aide.

+0

Je suis juste curieux de ça. Pour le programme régulier, attend les événements de la souris, le minuteur, la touche, l'activité du réseau. Donc, le blocage ne devrait pas fonctionner. Je pense que les cpu sont plus rapides. Donc, aucun corps ne s'en soucie. – nerkn

+0

Pour les programmes qui attendent plusieurs sources d'entrée, le blocage des appels peut toujours fonctionner, mais la conception du programme peut changer. 1. Bloquer en attente de toute entrée. 2. Déterminez le type d'entrée. 3. Entrer le processus. 4. Retournez à "1". Pour les programmes nécessitant un autre travail en attente d'une entrée, utilisez un autre thread. – Sparky

+0

En outre, même s'il est vrai que les processeurs sont plus rapides qu'auparavant, l'application que vous écrivez n'est souvent pas la seule à être utilisée sur le système. Lorsque plusieurs applications ratissent inutilement le temps du processeur, cela affecte la productivité de l'utilisateur et son expérience avec d'autres applications. En tant que développeur, je ne suis pas en position de dire quelle application est la plus importante pour l'utilisateur, et je veux qu'ils aient une expérience aussi agréable que possible. – Sparky