Szybki program C++, C# GUI, możliwy? [zamknięte]

Zastanawiam się nad stworzeniem aplikacji, która będzie przetwarzać dane z kamery skanującej linie z prędkością około 2000 linii (klatek) na sekundę. Dla tej aplikacji czasu rzeczywistego, czuję, że C / C++ jest droga do zrobienia. (Mam wrażenie, że inni zgodzą się, że zarządzany kod nie jest odpowiedni do tego zadania.)

Jednak zrobiłem bardzo mały MFC, lub jakikolwiek inny C++ GUI. Naprawdę bardzo dobrze robię C # GUIs.

Więc wydaje mi się naturalne, aby napisać kod intensywnie wykorzystujący dane w C / C++, a GUI W C#. GUI będzie używany do konfiguracji / kalibracji / monitorowania on-line (i ewentualnie wyprowadzania danych przez UDP, ponieważ jest to łatwiejsze w C#.

Więc najpierw chciałbym zobaczyć, czy ktoś się zgodzi, że tak będzie najlepiej. Bazując na moim doświadczeniu w programowaniu (dobre algorytmy C niskiego poziomu i projektowanie C# GUI wysokiego poziomu), czuję się po prostu dobrze.

Po drugie, nie jestem pewien, czy dobrze się do tego zabrać. Właśnie wrzuciłem rozwiązanie w VS2005, który wywołuje niektóre (extern "C") Funkcje DLL z aplikacji C#. Aby się upewnić, że mogę to zrobić, napisałem do kilku globalnych zmiennych w DLL i przeczytałem z nich:

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();

Wywołanie get() i set() działa poprawnie (get() Zwraca numer, który przekazałem set()).

Teraz wiem, że można eksportować klasę C++, ale czy trzeba nią zarządzać? Jak to działa? Am Dobrze to rozegram?

Dzięki za pomoc!

*** EDIT ***

Po pierwsze, Dziękuję za fantastyczne odpowiedzi do tej pory! Zawsze jestem pod ogromnym wrażeniem Stack Overflow...

Myślę, że jedną rzeczą, którą powinienem był uderzyć na Więcej, niekoniecznie była prędkość surowa (może to być prototyp i benchmarked). Bardziej martwi mnie niedeterministyczne zachowanie śmieciarza. Aplikacja ta będzie nie bądź tolerancyjny na opóźnienie 500ms podczas odbierania śmieci.

Jestem za kodowaniem i próbowaniem tego w czystym C#, ale jeśli z wyprzedzeniem wiem, że GC i jakiekolwiek inne niedeterministyczne zachowanie. NET (?) spowoduje problem, myślę, że mój czas byłby lepiej spędzony na kodowaniu go w C / C++ i wymyślaniu najlepszego interfejsu C#.

Author: Jonathon Reinhart, 2009-08-08

12 answers

 30
Author: Mitch Wheat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:02

Moim zdaniem Twoje rozwiązanie jest dźwiękowe:

  1. chociaż C# jest szybki, nigdy nie może konkurować z dobrze napisanym niezarządzanym C / C++, sam stworzyłem wysokowydajne aplikacje, które dowodzą tego poza małymi przykładami, które ludzie zawsze publikują, gdy ktoś publikuje tego rodzaju wypowiedzi
  2. Programowanie MFC lub ATL UI jest uciążliwe i powolne, C# jest drogą, aby przejść tutaj, nigdy nie będę robić MFC / ATL UI programowania nigdy więcej, chyba że zmuszony

Twoje rozwiązanie, w jeśli jeszcze tego nie rozgryzłeś, nazywa się to" tryb mieszany", co w zasadzie oznacza, że łączysz zarządzany (C#) i Niezarządzany (C/C++) kod w tych samych projektach, często jest trochę kłopotów, aby uzyskać projekt VS-i-uruchomiony (błędy LNK2020..argh..) ale kiedy znajdziesz odpowiednie ustawienia, powinno działać dobrze.

Jedyną negatywną rzeczą jest to, że zespoły trybu mieszanego muszą działać w pełnym zaufaniu, jeśli to jest OK, to chyba wiesz, co robić.

Jeszcze jedna rzecz, którą warto obejrzeć at jest projektem open source o nazwie SWIG. SWIG pobiera kod C / C++ i tworzy z niego assembly. NET, sam go używałem w moim TM++ projekcie open source. Zobacz tutaj, aby uzyskać więcej informacji o SWIG http://www.swig.org/.

 15
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-09 12:24:38

Dla aplikacji czasu rzeczywistego: polecam C++, będziesz bardziej elastyczny z zarządzaniem pamięcią, szybszy, a nawet wieloplatformowy w zależności od tego, jaki framework jest używany...!

Jeśli chodzi o framework i GUI, polecam zajrzeć do Qt . Qt jest świetnym frameworkiem do tworzenia oprogramowania C++.

To chyba rozwiązanie twojego problemu !

 6
Author: Matthieu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-09 12:39:26

Pierwszą rzeczą, którą musisz zrobić, to przetestować swoje założenie . Jakie są Twoje ograniczenia wydajności? Jakiego rodzaju sprzęt spodziewasz się hostować aplikację? Napisz mały program w C#, który zajmuje się głównym problemem i zmierz jak szybko działa.

Dopiero po zapoznaniu się z faktami można podjąć decyzję o tym, czy używać C/C++ zamiast zarządzanego rozwiązania.

Wraz z innymi, którzy komentowali, podejrzewam, że rozwiązanie C#/managed wystarczy, szczególnie jeśli korzystasz z . NET równoległych rozszerzeń .

Jeśli skończysz przechodząc trasę C / C++, to są dwie opcje re interop, a mianowicie pInvoke i COM interop . Nie wierzę, że istnieje czysty sposób dostępu do niezarządzanych klas C++ bezpośrednio z.Net; w tym celu należy rozważyć implementację zarządzanego/niezarządzanego zestawu C++ .

 5
Author: Eric Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-08 05:55:43

Moja firma robi coś bardzo podobnego, chociaż z kamerami CCD zamiast kamer liniowych. Używamy C# Dla GUI, komunikacji sieciowej, wysokiego poziomu "hydrauliki" i C++ / CLI dla algorytmów niskiego poziomu. Działa całkiem dobrze. Nigdy nie będziesz w stanie napisać prawdziwego systemu czasu rzeczywistego z gwarantowanym maksymalnym czasem reakcji na windows, ale z mojego doświadczenia GC będzie najmniejszym z twoich problemów tutaj. Po pierwsze, GC działa tylko wtedy, gdy przydzielasz pamięć; tak samo malloc / new w C / C++, a także potrzebują czasu (pomyśl o fragmentacji pamięci). Z pomiarów, które zrobiliśmy, pełny GC zajmuje 10-50ms i nie będzie musiał zatrzymywać innych wątków w tym czasie (chyba że próbują przydzielić zarządzaną pamięć, myślę), co jest dla nas ok. Ale nie jestem pewien, czy te liczby można uogólnić do jakiegokolwiek rodzaju aplikacji, prawdopodobnie powinieneś zrobić własne profilowanie, aby mieć pewność.

Jeśli obawiasz się, że GUI może złamać Twoje ograniczenia czasu rzeczywistego, możesz rozważyć umieszczenie rzeczywistego przetwarzania obrazu w osobnym procesie i komunikacja z GUI za pomocą rur / gniazd. Albo przynajmniej Miej tę opcję na uwadze podczas projektowania systemu, więc masz ją jako najgorszą opcję, jeśli naprawdę napotkasz niewymuszone problemy z wydajnością.

Twoje drugie pytanie brzmiało, czy powinieneś używać C++ lub C# do rzeczywistych algorytmów. Osobiście czuję się bardziej komfortowo w C++, Gdy piszę złożone algorytmy przetwarzania obrazów. Myślę, że język lepiej nadaje się do zadanie, a bibliotek numbercrunchingu jest znacznie więcej dla C/C++ niż dla C#. Ale to może być kwestia osobistych preferencji. Z punktu widzenia wydajności, C++ ma tę zaletę, że C++ inliner jest lepszy niż. NET JIT inliner (tzn. może wbudować więcej małych wywołań funkcji).

Jeśli zdecydujesz się używać C++, sugerowałbym użycie C++ / CLI: w ten sposób możesz pisać klasy C++, które są kompilowane do kodu zarządzanego. C++ optimizer zoptymalizuje je, tylko ostatni krok kompilacji do kodu natywnego zostanie wykonany przez. Net JIT. Dużą zaletą jest to, że możesz bezpośrednio uzyskać dostęp do klas. NET z C++ / CLI i możesz łatwo tworzyć zarządzane klasy w C++ / CLI, do których można uzyskać dostęp z C#. Nie musisz pisać kodu opakowaniowego po obu stronach ogrodzenia. (C++ / CLI jest nieco niezgrabny, ponieważ zawiera konstrukcje językowe dla programowania zarządzanego i niezarządzanego, ale jeśli znasz już niezarządzane C++ i C#, prawdopodobnie nie będziesz miał żadnych problemów rozumiejąc to.)

 4
Author: Niki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-08 17:14:26

Do C++ używasz C++ / CLI - co właściwie nie jest takie złe. Jest o wiele lepszy niż stare zarządzane rozszerzenia.

Aby skomentować występ. To zależy. Ile będzie między Twoim kodem C++ a Twoim kodem C#? Czy będziesz miał wątek w tle zbierający dane w C++ i okresowo wysyłający je do kodu C#? Jeśli zamierzasz łączyć się z urządzeniem, czy będzie ono używać szeregowego, USB, jakiegoś API, które otrzymałeś?

 2
Author: sylvanaar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-09 12:09:23

Zgadzam się z Mitchem w 100%.

Jeśli po zbadaniu jego zasobów, nadal uważasz, że musisz użyć jakiegoś niezarządzanego kodu, możesz napisać warstwę "biznesową" w C++ (lub w tym przypadku naprawdę warstwę funkcjonalną) i napisać swój interfejs w C#. Użyj COM Interop, Aby wywołać z kodu zarządzanego w C#/kod niezarządzany.

Ponownie, jednak, mam wrażenie, że nie będziesz musiał tego robić.

 1
Author: Eric J.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-08 05:10:21

Język, który wybierzesz, nie wpłynie zbytnio na wydajność (powiedzmy, że możesz wpłynąć na szybkość o 5/10%). To, co będzie miało znaczenie, to algorytmy, z których będziesz korzystać, sposób przetwarzania danych, profilowanie aplikacji itp... (wydajność może się zmienić w stosunku 10x).

 0
Author: Nicolas Viennot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-08 04:36:47

Zrobiłem to z C++. Net

Ponieważ zarówno C++. Net, jak i C# są zarządzane, nie widzę powodu, dla którego nie można tego zrobić. Chodzi o to, jak to zrobisz.

Mój skaner miał do 3000 linii / S, ale kluczową strategią było wyświetlanie bloków po 32 linie na raz. Nie miałem trudnych wymagań w czasie rzeczywistym, więc czasami mogłem być trochę w tyle. Jeśli czas rzeczywisty jest dla ciebie bardzo ważny, powinieneś rozważyć platformę przełączania.

Istnieje rozwiązanie windows czasu rzeczywistego o nazwie " InTime OS" ale to naprawdę bolesne w użyciu.

Innym podejściem, jakie możesz mieć, jest oddzielenie twardego czasu rzeczywistego do osobnej biblioteki dll lub biblioteki, A C# pokazuje, co może z własną prędkością. Naprawdę, użytkownik nigdy nie będzie w stanie stwierdzić, czy twój interfejs ma 2000 fps lub 500 fps

 0
Author: Eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-09 02:33:57

Mam doświadczenie w natywnych systemach C / C++ i C# O bardzo niskich opóźnieniach.

  • W C/C++ 80% czasu procesora jest tracone w deterministycznych metodach malloc, ale kod natywny jest 10x szybszy niż kod msil

  • W C# alokacja pamięci jest szybsza, ponieważ jest procesem asynchronicznym

Twój wybór musi być dokonany przez stosunek: czas procesu / liczba malloc

So Granularity !!!

Rozwiązaniem dla C / C++ są bufory pre-alloc alls w pamięci (w razie potrzeby użyj bufora prefetch L2/L3)

Rozwiązaniem dla C# jest minimalizowanie mechanizmu konwersji P-Invoke

Gratulacje dla Twojego projektu, Paul

 -1
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-27 05:12:10

Front end WPF i C++ backend (pinvoke) jest szybki, ale gdy wykonujesz pracę GUI również na wątkach, Twój wątek GUI nie zostanie zablokowany przez Twój kod w tle. Kiedy to zrobisz, twój program będzie wyglądać szybciej i lekka waga.

 -1
Author: Rahul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-14 15:26:22

Dlaczego windows? Ma okropną wydajność pamięci i gorszą sieć w porównaniu z jakimkolwiek unixem. Wyspecjalizowane przechwytywanie czujnika liniowego oznacza, że potrzebujesz urządzenia do obsługi wejścia surowego. Rozważ najpierw użycie odpowiedniego systemu operacyjnego, który znacznie obniży inne presje ,z którymi będziesz musiał sobie poradzić (jestem bardzo dobrze zaznajomiony z technologiami skanerów liniowych).

 -3
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-09 21:10:36