Sto cercando di sviluppare un'applicazione che elaborerà i dati da una telecamera line-scan a circa 2000 linee (frame) al secondo. Per questa applicazione in tempo reale, sento che C/C++ è la strada da percorrere. (È un mio sentimento, e altri saranno d'accordo che il codice gestito non è giusto per questo compito.)Programma C++ veloce, C# GUI, possibile?
Tuttavia, ho fatto molto piccolo MFC, o qualsiasi altra GUI C++. Comunque sto facendo davvero bene le C# GUI.
Quindi mi sembra naturale scrivere il codice ad alta intensità di dati in C/C++ e la GUI in C#. La GUI sarà utilizzata per il monitoraggio di set-up/calibrazione/on-line (ed eventualmente per l'output di dati via UDP, perché è più semplice in C#.
Quindi, per prima cosa, vorrei vedere se qualcuno è d'accordo che questo sarebbe Sulla base della mia esperienza di programmazione (buona con algoritmi C di basso livello e progettazione GU # C di alto livello), mi sembra giusto
In secondo luogo, non sono sicuro che il modo giusto per andare Ho appena creato una soluzione in VS2005, che chiama alcune funzioni DLL (extern "C" da un'app C#. E per assicurarmi di poterlo fare, ho scritto alcune variabili globali nella DLL e ho letto loro:
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()
e set()
opera correttamente (get()
restituisce il numero che ho passato a set()
).
Ora, so che è possibile esportare una classe C++, ma deve essere gestita? Come funziona? Sto andando su questo nel modo giusto?
Grazie per tutto il vostro aiuto!
*** EDIT ***
Prima di tutto, GRAZIE per le risposte fantastiche finora! Sono sempre incredibilmente colpito da Stack Overflow ...
Immagino che una cosa su cui avrei dovuto puntare di più, non fosse necessariamente velocità raw (questo può essere prototipato e benchmark). Una cosa che mi preoccupa di più è il comportamento non deterministico del Garbage Collector. Questa applicazione dovrebbe non essere tollerante di un ritardo di 500 ms durante l'esecuzione di garbage collection.
Io sono tutto per la codifica e provare questo in puro C#, ma se so in anticipo che il GC e qualsiasi altro comportamento .NET non deterministico (?) Causerà un problema, penso che il mio tempo sarebbe meglio speso codificandolo in C/C++ e comprendendo la migliore interfaccia C#.
Per ridurre le preoccupazioni sulla raccolta dei rifiuti "Generalmente le raccolte di 2 (il tipo costoso) non si verificano fino a quando la memoria non è sotto pressione. richiama sempre gli oggetti IDisposable e NON chiama manualmente GC.Colect()), quindi non dovresti riscontrare notevoli ritardi. –
@Mitch. Nella mia esperienza, ho visto che le raccolte G2 si verificano molto spesso su una memoria non vincolata sistema che non era spesso inattivo. Controlla il contatore perfmon per vedere di persona, GC succede molto più di quanto pensi che sia. È ancora abbastanza veloce sull'hardware moderno, ma potrebbe non essere abbastanza buono per l'OP. – gbjbaanb