Question

J'utilise la bibliothèque Fonction ConnectToTCPServer . Ce temps de fonctionnement quand l'hôte n'est pas accessible. Dans ce cas, l'application se bloque avec l'erreur suivante: "NON FATAL erreur d'exécution: "myclient.c", ligne 93, colonne 15, id de fil 0x000017F0:. Erreur des fonctions de bibliothèque (valeur de retour == -11 [0xfffffff5]) Erreur Timeout"

Errorcode 11 est un ACQ, donc cela pourrait se produire assez souvent dans ma demande - mais l'application se bloque. - Je voudrais saisir cette erreur plutôt que d'avoir mon plantage de l'application

Comment puis-je attraper cette erreur d'exécution dans Ansi C90?

EDIT: Voici une codesnippet de l'utilisation actuelle:

ConnectToTCPServer(&srvHandle, srvPort, srvName, HPMClientCb, answer, timeout);

avec

int HPMClientCb(UINT handle, int xType, int errCode, void *transData){
    printf("This was never printed\n");
    return errCode;
}

Le callbackFunction est jamais appelé. Mon serveur ne fonctionne pas, si ConnectToTCPServer va délai d'attente. Je suppose que le rappel est appelé -. Mais il ne s'appelle

EDIT 2: La fonction de rappel est en fait pas appelée, le ReturnValue de ConnectToTCPServer contient les mêmes informations d'erreur. Je pense que ce pourrait être un bug qui ConnectToTCPServer jette cette erreur. Je juste besoin de l'attraper et le bac dans C90. Des idées?

EDIT 3:. Je l'ai testé le callbackFunction, sur le occaision rare que mon serveur est en ligne la fonction de rappel est en fait appelé - cela ne l'aide que parce que le rappel n'est pas appelée lorsqu'une erreur se produit

Était-ce utile?

La solution

Recherche dans la documentation NI, je vois ceci:
« Erreur de bibliothèque de points d'arrêt -. Vous pouvez définir une option pour interrompre l'exécution du programme chaque fois qu'une fonction de bibliothèque LabWindows / CVI renvoie une erreur lors de l'exécution »

Je spéculer qu'ils ont une option de débogage pour provoquer l'arrêt du programme sur les erreurs d'exécution, que vous devez désactiver la configuration, dans le temps de compilation ou d'exécution.

Ma première estimation aurait été la valeur de configuration ou drapeau de compilation, mais c'est la seule option que je trouve, ce qui est une option d'exécution:
// If debugging is enabled, this function directs LabWindows/CVI not
// to display a run-time error dialog box when a National Instruments
// library function reports an error.
DisableBreakOnLibraryErrors();

Dis si elle a aidé.

Autres conseils

Theres pas une telle chose comme un cas général de « rattrapage » une erreur (ou une « exception ») dans la norme C. Cest à votre bibliothèque de décider quoi faire avec elle. Probablement son exploitation forestière de son état, puis simplement appeler abort (). Dans Unix, que les signaux SIGABRT qui peut être manipulé et non seulement ed sortie (). Ou leur bibliothèque peut juste être l'exploitation forestière, puis appeler exit ().

Vous pourriez exécuter votre application en vertu d'un utilitaire comme strace pour voir ce que les appels système sont effectuée et quels sont les signaux revendiqués.

Je travaillerais avec votre fournisseur si vous ne pouvez pas faire des progrès autrement.

De la documentation, il semble que vous devriez obtenir un appel à votre clientCallbackFunction lorsqu'une erreur se produit. Si vous ne le faites pas, vous devez modifier votre question afin de préciser que.

Je ne suis pas sûr que je vous comprends.

Je regarde la documentation de la fonction bibliothèque ConnectToTCPServer(). Il retourne un entier; 0 signifie le succès, les nombres négatifs sont les codes d'erreur.

  

EDIT: Voici un codesnippet du   utilisation courante:

ConnectToTCPServer(&srvHandle, srvPort, srvName, HPMClientCb, answer, timeout);

Si c'est vraiment l'utilisation actuelle, vous ne semblez pas essayer de dire si ConnectToTCPServer() réussit. Pour ce faire, vous auriez besoin

int err_code;
...
err_code = ConnectToTCPServer(&srvHandle, srvPort, srvName, HPMClientCb, answer, timeout);

puis ERR_CODE test.

La documentation ConnectToTCPServer() implique que votre fonction de rappel ne sera pas appelé à moins qu'il ya un message à partir d'un serveur TCP. Aucun serveur, aucun message. Dans ce cas,

  1. ConnectToTCPServer() doit retourner un nombre négatif.
  2. Vous devriez vérifier la valeur de retour de ConnectToTCPServer().
  3. Trouver un numéro de négatif là-bas, vous devez faire quelque chose de sensé.

Ai-je bien compris la documentation?

Normalement, vous devriez être en mesure de vérifier simplement la valeur de retour. Le fait que vos sorties d'application implique que quelque chose est appréhendaient déjà l'erreur et l'affirmation (ou quelque chose de similaire). Sans voir tout contexte (à savoir le code montrant comment vous utilisez cette fonction), il est difficile d'être plus précis.

La documentation indique que ConnectToTCPServer renverra le code d'erreur. Le rappel est appelée que si la connexion est établie, déconnectée ou quand il y a des données prêtes à être lues.

Le message que vous obtenez états que l'erreur est NON MORTEL, donc il ne devrait pas abandonner. Si vous êtes sûr que le code n'a pas abort plus tard, il semble en effet comme un bug dans la bibliothèque.

Je ne suis pas familier avec CVI, mais il pourrait y avoir un (compile- / runtime-) l'option d'avorter même sur des erreurs non fatales (pour le débogage). Si vous pouvez reproduire cela dans un exemple minimal que vous devez à NI .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top