Estoy buscando desarrollar una aplicación que procese datos de una cámara de escaneo de línea de alrededor de 2000 líneas (cuadros) por segundo. Para esta aplicación en tiempo real, creo que C/C++ es el camino a seguir. (Es mi opinión, y otros estarán de acuerdo en que el código administrado no es el adecuado para esta tarea).¿Es posible el programa Fast C++, C# GUI?
Sin embargo, he hecho muy poco MFC o cualquier otra GUI de C++. Sin embargo, realmente estoy haciendo muy bien las GUI de C#.
Me parece natural escribir el código de datos intensivos en C/C++ y la GUI en C#. La GUI se usará para la configuración/calibración/monitoreo en línea (y posiblemente para la salida de datos vía UDP, porque es más fácil en C#.
Primero, me gustaría ver si alguien está de acuerdo en que esto Sea el camino a seguir. De acuerdo con mi experiencia en programación (buena en algoritmos C de bajo nivel y diseño de GUI de alto nivel en C#), me parece bien.
En segundo lugar, no estoy seguro de cómo hacerlo. Acerca de esto. Acabo de lanzar una solución en VS2005, que llama a algunas (DLL "C") funciones de una aplicación C#. Y para asegurarme de que podía hacerlo, escribí algunas variables globales en la DLL, y leí de ellos:
test.h
int globaldata;
extern "C" __declspec(dllexport) void set(int);
extern "C" __declspec(dllexport) int get();
test.cpp
extern int data=0;
__declspec(dllexport) void set(int num) {
data = num;
}
__declspec(dllexport) int get() {
return data;
}
test.cs
[DllImport("test")]
private static extern void set(int num);
[DllImport("test")]
private static extern int get();
Calling get()
y set()
trabajo correctamente (get()
devuelve el número que pasé a set()
).
Ahora, sé que también puede exportar una clase de C++, pero ¿tiene que administrarse? ¿Cómo funciona? ¿Voy por esto de la manera correcta?
¡Gracias por toda su ayuda!
*** EDIT ***
En primer lugar, GRACIAS para sus fantásticas respuestas hasta el momento! Siempre estoy increíblemente impresionado con Stack Overflow ...
Supongo que una cosa que debería haber tocado más, no era necesariamente la velocidad bruta (esto puede ser un prototipo y un punto de referencia). Una cosa que me preocupa más es el comportamiento no determinista del Garbage Collector. Esta aplicación podría no tolerar una demora de 500 ms mientras se realiza la recolección de basura.
Estoy todo por codificar y probar esto en C# puro, pero si sé de antemano que el GC y cualquier otro comportamiento .NET no determinista (?) Causarán un problema, creo que mi tiempo sería mejor pasó codificando en C/C++ y descubriendo la mejor interfaz de C#.
Esto suena como un proyecto realmente genial –
Para ayudar a reducir sus preocupaciones sobre la recolección de basura "Generación 2 colecciones (el tipo costoso), normalmente no sucederá hasta que la memoria esté bajo presión. Si su aplicación es un buen ciudadano .NET (es decir, siempre llama a deshacerse de los objetos IDisposables, y NO llama manualmente a GC.Colect()), entonces no debería experimentar grandes retrasos. –
@Mitch. No en mi experiencia, he visto que las colecciones de G2 ocurren muy a menudo en una memoria no limitada sistema que no solía estar inactivo. Verifique el contador perfmon para verlo por sí mismo, GC ocurre mucho más de lo que cree. Aún es bastante rápido en hardware moderno, pero puede no ser lo suficientemente bueno para el OP. – gbjbaanb