2010-12-01 7 views
0

J'ai code comme ceci:Comprendre quand/comment les événements sont envoyés

// Create event handler delegate 
symbolReader.ReadNotify += new EventHandler(symbolReader_ReadNotify); 

Lorsqu'un code-barres est scanné sur mon appareil portable puis symbolReader_ReadNotify est appelé.

Ceci est une version simplifiée de cette méthode:

/// <summary> 
/// Event that fires when a Symbol scanner has performed a scan. 
/// </summary> 
private void symbolReader_ReadNotify(object sender, EventArgs e) 
{ 
    ReaderData readerData = symbolReader.GetNextReaderData(); 

    // If it is a successful scan (as opposed to a failed one) 
    if (readerData.Result == Results.SUCCESS) 
    { 
     // Setup the next scan (because we may need the scanner 
     // in the OnBarcodeScan event below 
     Start(); 

     // Get the handle of the window that the user was on when the scan was sent. 
     IntPtr handle = CoreDLL.GetTopWindow(); 

     // If we have a barcode scanner method for this window then call that delegate now. 
     if (_scanDelegates.ContainsKey(handle)) 
     { 
      Action<BarcodeScannerEventArgs> scanDelegate; 
      // Get the method to call for this handle 
      // (previously added to the _scanDelegates dictionary) 
      bool delegateRetrieved = _scanDelegates.TryGetValue(handle, out scanDelegate); 
      if (delegateRetrieved && (scanDelegate != null)) 
       scanDelegate(e); 

     } 
    } 
} 

Cela fonctionne bien la plupart du temps. Mais lorsque l'appel à scanDelegate ouvre une nouvelle fenêtre que doit également accepter les analyses l'événement (symbolReader.ReadNotify) ne se déclenche pas (lorsque l'analyse est effectuée sur cette fenêtre). Mais une fois la fenêtre fermée (et scanDelegate(e) renvoie) l'événement se déclenche (mais maintenant je l'achemine vers la mauvaise fenêtre.)

Y a-t-il un moyen de dire à l'application d'envoyer l'événement? est un moyen de vider les messages) ou est-ce juste la bibliothèque de symboles qui ne parvient pas à envoyer l'événement jusqu'à ce qu'il soit trop tard?)

La seule chose que j'ai essayé est d'appeler Application.DoEvents dans une boucle dans la fenêtre qui est ouvert. Mais cela ne semble pas fonctionner.

Remarque: Il s'agit d'une application Compact Framework, mais je ne pense pas que ce soit un problème de Compact Framework, donc je ne l'étiquette pas avec Compact Framework.

Tout conseil pour déclencher l'événement lorsque l'analyse se produit (comme s'il ne s'agissait pas d'un scan imbriqué) serait super!

+0

Comment fonctionne exactement ce ouvrir une nouvelle fenêtre Cette nouvelle fenêtre utilise-t-elle la même instance 'symbolReader' que la fenêtre parente? – Jon

+0

Voulez-vous l'événement symbolReader.ReadNotify dans les fenêtres contextuelles? – jvanrhyn

+0

Vous posez des questions sur les détails de mise en œuvre pour une sorte d'API de scanner de codes à barres tiers sans documenter lequel. Votre meilleur pari est un forum de support sur le site du vendeur. –

Répondre

1

Est-ce que scanDelegate (e) ouvre la nouvelle fenêtre en tant que dialogue? Si c'est le cas, cela empêchera l'événement de remonter jusqu'à ce qu'il soit fermé, car il est appelé (ouvert) depuis le même gestionnaire d'événements.

Vous pouvez contourner le problème en soit retarder l'ouverture jusqu'à ce après l'événement est manipulé, ne pas ouvrir comme une boîte de dialogue ou en ouvrant sur un nouveau thread (ou utiliser BeginInvoke sur le délégué)

+0

Il l'ouvre. Je ne savais pas qu'il y a une limite pour qu'un gestionnaire d'événements n'ait qu'un seul appel actif à la fois! Je vais regarder dans multi-threading (et mon poser une question distincte pour plus de détails sur le pourquoi et le comment de cette limitation). Merci! – Vaccano

Questions connexes