Pregunta

Estoy usando la función de biblioteca ConnectToTCPServer . Esta función expira cuando el anfitrión no es alcanzable. En ese caso, la aplicación se bloquea con el siguiente error: "No fatal en tiempo de ejecución: "MyClient.c", línea 93, col 15, ID del tema 0x000017F0:. Error biblioteca de funciones (valor de retorno == -11 [0xfffffff5]) error de tiempo de espera"

El Errorcode 11 es una Tiempo de espera de error, por lo que esto podría suceder muy a menudo en mi solicitud - sin embargo, la aplicación se bloquea -. Me gustaría encontrar este error en lugar de tener mi caída de la aplicación

¿Cómo puedo detectar este error de ejecución en ANSI C90?

EDIT: Aquí está una Codesnippet del uso actual:

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

con

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

El callbackFunction nunca es llamado. Mi servidor no se está ejecutando, por lo ConnectToTCPServer agotará el tiempo. Sospecho que la devolución de llamada -. Pero nunca se llama

EDIT 2: La función de devolución de llamada en realidad no se llama, el ReturnValue de ConnectToTCPServer contiene la misma información de error. Creo que podría ser un error que ConnectToTCPServer lanza este error. Sólo tengo que cogerlo y Bin en C90. Alguna idea?

EDITAR. 3: He probado el callbackFunction, en el occaision raro que mi servidor está en línea la función de devolución de llamada se llama en realidad - esto no ayuda, porque aunque la devolución de llamada no se llama cuando se produce un error

¿Fue útil?

Solución

Buscando en la documentación de NI, veo esto:
"Puntos de interrupción de error de la biblioteca -. Se puede establecer una opción para interrumpir la ejecución de programas cada vez una función de LabWindows / CVI biblioteca devuelve un error en tiempo de ejecución"

Me quiso especular que tienen una opción de depuración para hacer que el programa de parada en los errores de tiempo de ejecución, que deberá desactivar en la configuración, en tiempo de compilación o en tiempo de ejecución.

Mi primera suposición habría sido el valor de configuración o la bandera de compilación, pero esta es la única opción que encontré, que es una opción en tiempo de ejecución:
// 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();

Diga si ayudó.

Otros consejos

Theres ninguna cosa tal como un caso general de "captura" un error (o un 'excepción') en la norma C. Eso es hasta la biblioteca para decidir qué hacer con él. Probablemente su registro de su estado y luego simplemente llamando a abort (). En Unix, que las señales SIGABRT que puede ser manejado y no sólo de salida () ed. O su biblioteca puede ser sólo el registro y después de llamar a exit ().

Se podría ejecutar su aplicación en virtud de una utilidad como strace para ver qué llamadas al sistema son que se realizan y qué señales están siendo afirmaron.

Me iba a trabajar con su proveedor si no se puede hacer ningún progreso lo contrario.

A partir de la documentación, parece que debe recibir una llamada a su clientCallbackFunction cuando se produce un error. Si no lo hace, debería editar su pregunta para aclarar eso.

No estoy seguro de que te entiendo.

Me miró a la documentación de la ConnectToTCPServer() función de biblioteca. Devuelve un entero; 0 significa éxito, los números negativos son los códigos de error.

EDIT: Aquí está una Codesnippet de la Uso actual:

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

Si eso es realmente el uso actual, que no parecen estar tratando de decir si tiene éxito ConnectToTCPServer(). Para ello, se necesitaría

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

y luego ERR_CODE prueba.

La documentación para ConnectToTCPServer() implica que su función de devolución de llamada no se llamará a menos que haya un mensaje de un servidor TCP. No hay ningún servidor, ningún mensaje. En ese caso,

  1. ConnectToTCPServer() debe devolver un número negativo.
  2. Debe comprobar el valor de retorno de ConnectToTCPServer().
  3. Encontrar un número negativo allí, se debe hacer algo sensato.

¿Entendí la documentación correctamente?

Normalmente, usted debería ser capaz de simplemente comprobar el valor de retorno. El hecho de que sus salidas de aplicación implica que algo ya se está imponiendo el error y afirmar (o algo similar). Sin ver cualquier contexto (es decir, código demuestra cómo se está utilizando esta función), es difícil ser más preciso.

La documentación indica que ConnectToTCPServer devolverá el código de error. La devolución de llamada sólo se le llama, si se establece la conexión, desconexión o cuando hay datos listos para ser leído.

El mensaje que aparece estados que el error es no fatal, por lo que no debe abortar. Si estás seguro de que el código no abortar después parece hecho como un error en la librería.

No estoy familiarizado con CVI, pero podría ser una opción (de compilación / tiempo de ejecución-) para abortar incluso en los errores no fatales (para fines de depuración). Si puede reproducir esto en un ejemplo mínimo que debe informar de ello a NI .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top