7
votes

Manipulation des événements et des événements sous le capot

Je viens de travailler à travers certains programmes simples utilisant SDL et cela m'a fait réfléchir à des gites Java que j'ai écrites.

Dans les programmes SDL simples, j'ai une boucle qui vérifie les événements (Keyresses , Souris clics, etc.) et les réagit. Il s'agit essentiellement de l'interrogation pour l'entrée.

en Java, vous attachez les auditeurs aux objets d'interface graphique et les auditeurs sont déclenchés lorsque certains événements se produisent.

Ma question est que Java gère-t-il simplement cette boucle de vote à l'arrière-plan pour nous et de travailler comme quel contrôle de l'interface graphique a été cliqué pour pouvoir déclencher le bon auditeur ou y a-t-il quelque chose de plus complexe en cours ?

Je sais que QT a un système d'événements similaire à Java où vous utilisez des emplacements pour connecter un gestionnaire à un contrôle de l'interface graphique. Est-ce également simplement gérer tout le sondage et travailler sur quel contrôle a été cliqué pour nous? Ou encore, y a-t-il quelque chose de plus complexe?

Mise à jour

Peut-être que je n'étais pas assez claire avec la question. Je cherche vraiment à déterminer comment un événement pente la couche de couche d'exploitation - limite de la couche d'application. L'application interroge-t-elle la couche d'exploitation et tirez-vous des informations sur l'événement dans l'application? Ou le système d'exploitation a-t-il un moyen d'interrompre / d'informer l'application qu'un événement s'est produit et appuyez sur les informations d'événement à l'application.

Une troisième solution m'a été suggéré que l'application appelle une fonction native bloquée comme: xxx


0 commentaires

4 Réponses :


1
votes

C'est la ressource la plus ancienne mais, à la manière dont file d'événements Java AWT / Swing


0 commentaires

5
votes

"... Java gère-t-il juste cette boucle de vote à l'arrière-plan pour nous ...?"

À peu près, oui. Le système UI fournit au programme un accès à une file d'attente contenant des événements survenus et la cible. Le programme traverse une boucle demandant des articles de cette file d'attente, puis fait quoi que ce soit. Les bibliothèques comme Qt et Java appellent des fonctions spéciales dans les classes de widget qui leur disent qu'un événement est arrivé afin que le système puisse fonctionner de là, cependant stipulé par l'API. La bibliothèque doit traduire de l'ID de fenêtre spécifique au système à la classe régissant ce widget afin de le faire.

QT permet d'accéder à cette fonction sous la forme de fonctions protégées et virtuelles OnxxxXevent () . Le comportement standard de nombreux widgets est de générer des signaux en réponse aux événements, mais ceux-ci sont toujours une forme traduite de l'événement spécifique au widget concerné. QT vous donne accès à cela afin que vous puissiez remplacer la manière dont un widget gère un événement ou pour ajouter un comportement supplémentaire pour les événements qu'il n'a jamais écouté avant (par sous-classement).

Chaque système d'interface utilisateur est légèrement différent mais ils sont tous essentiellement les mêmes de cette manière de mon expérience. Nous parlons RAW WIN32 et XLIB ici.


2 commentaires

Je vais mettre à jour ma question pour le rendre plus clair, mais ce que je suis vraiment intéressé, c'est comment les événements entrent dans cette file d'attente (si la file d'attente est dans la demande). Si la file d'attente est à la calque OS, le sondage a du sens clairement.


Effectivement, vous pouvez considérer la couche d'exploitation. C'est spécifique du système.



2
votes

Je ne connais pas avec Qt, mais en Java essentiellement, oui. En pratique, il devient plus compliqué, avec des dialogues modaux et similaires, mais il s'agit essentiellement des événements du système d'exploitation sous-jacent (pour le clavier et de la souris) et de les afficher comme des événements sur l'EventQueue et les différents composants obtiennent ces événements et les utilisations et consommez-les ou transmettez-les comme ils le souhaitent.

Le cadre de l'auditeur permet au composant de déterminer ce que l'événement était à peu près et transmettez les informations appropriées à ce sujet l'auditeur approprié.


1 commentaires

Donc, ma question n'était donc pas la façon dont Java gère les événements une fois qu'il en connaît, mais comment obtiennent-ils de la couche d'exploitation à votre couche d'application. C'est-à-dire comment une application découvre-t-elle qu'un événement est arrivé?



4
votes

Comme indiqué par les intervenants avant, il est spécifique au système et pourrait être mis en œuvre de toute façon.

Si je me souviens du droit de l'API Windows (il y a longtemps), il y a une "fonction de fenêtre" qui a été appelée à chaque événement, et j'ai fait un gros interrupteur pour choisir la bonne action en fonction du type d'événement.

Je pense que la plupart des outils de boîte à outils abstrait sont-ils loin, comme le Java Awt avec sa file d'attente d'événement.

Pour le protocole X, les événements d'entrée (ainsi que "votre fenêtre doivent être peints") Venez sous messages d'événement sur le fil, et il appartient à la bibliothèque Toolkit de convertir cette soit dans une fonction d'application, appelle ou ajoutez-les à une file d'attente à interroger ultérieurement.

Le protocole X Fonctionne en fait (fondamentalement) avec deux octets-flux: un de l'application ("client") au système ("serveur"), un dans l'autre sens. Le client envoie des packages de demande, le serveur renvoie des résultats (pour certains types de demandes), des erreurs (si une demande n'a pas pu être remplie pour une raison quelconque) et des événements (lorsque quelque chose se passe à l'écran, comme un mouvement de souris, appuyez sur la touche , fenêtre redimensionner, ...).

Pour les affichages locaux sur les systèmes modernes, il est généralement mis en œuvre par certains mécanismes de mémoire partagés, mais cela peut en principe passer sur TCP (ou aujourd'hui surtout sur SSH) pour connexions à distance (ainsi "sur le fil").

J'ai déjà commencé à créer une mise en œuvre du client PURE Java X (N'a pas terminée, car j'ai trouvé d'autres choses plus intéressantes à faire), et là, j'ai simplement utilisé une prise avec son introuvream et sa sortie pour vous connecter au serveur. Ainsi, en principe, j'ai utilisé en principe le blocking NATICLE Lecture () Fonction de la prise-INPUTStream pour attendre des événements (et des résultats et des erreurs). J'aurais pu utiliser un java.nio.socketchannel en mode anti-blocking, et ensuite, j'avais fondamentalement une boucle de vote (faire d'autres choses entre bien sûr). (Ou je pourrais utiliser un sélecteur en attente jusqu'à ce que de nouvelles données lisibles soient là - bloquantes aussi.)

Je n'ai aucune idée de quel mécanisme de la mise en œuvre de l'AWT-for-x utilisé par les implémentations de Java Linux et Solaris de Java utilise - je suppose qu'elles sont basées sur une boîte à outils native, qui est à son tour basée sur la bibliothèque client X (pour C) "xlib", mais je ne sais pas s'il y a un sondage, bloquer l'attente ou être appelé par quelqu'un dans la base.


2 commentaires

Encore une fois, ce n'est pas ce que je demandais vraiment. Vous dites "Messages d'événements sur le fil". Expliquer ce bit. C'est ce que je cherche. Y a-t-il des systèmes qui sondent "le fil" pour ces messages et certains qui bloquent, attendant que ces messages soient livrés comme des valeurs de retour provenant de fonctions natales? Même un exemple de la façon dont un système spécifique serait-il intéressant?


Désolé, il semble que je n'ai pas compris votre question ... (Je vais ajouter la réponse à votre question ajoutée dans ma réponse).