Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++/CLI mit .NET ::  Backgroundworker     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
schnips
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 8
Beitrag schnips Mitglied 14:37:38 29.05.2012   Titel:   Backgroundworker            Zitieren

Hallo zusammen,

ich bin neu hier im Forum und programmiere normalerweise in C#, daher entschuldige ich mich schon gleichmal im Voraus über "dumme" oder Anfänger Fragen. Wie gesagt, C++ ist normalerweise nicht mein Gebiet. :)

Folgendes:
Es geht um ein etwas älteres C++ Programm, welches ich erweitern soll. Das Programm führt unter anderem einen Download aus, welcher etwas länger andauert (ca. eine Minute) und damit der User währendessen nicht das Gefühl bekommt das Programm sei eingefroren soll ihm der Fortschritt angezeigt werden. In meinem vorherigen Projekt(C#), in dem das selbe statt findet, habe ich dieses Problem mit einem Backgroundworker gelöst. Funktioniert einwandfrei.

So habe ich diesen versucht zu implementieren:

CKlasse()
{
.
.
.
//*** Backgroundworker initialisieren ***
System::ComponentModel::BackgroundWorker^ BgWorker;
BgWorker->DoWork += gcnew DoWorkEventHandler(this, &CKlasse::BgWorker_DoWork);
.
.
.
}

void CKlasse::BgWorker_DoWork()
{
//Tu etwas
}

Fehlermeldung:
error C3364: "System::ComponentModel::DoWorkEventHandler": Ungültiges Argument für den Delegatkonstruktor. Delegatziel muss ein Zeiger auf eine Memberfunktion sein.

Ich habe mich dann ein wenig durch das Netz gelesen und bin darauf gestoßen, dass es irgendwelche Probleme macht mit "managed" und "unmanaged" Klassen. Das sagt mir aber momentan gar nichts, wie gesagt, bin ziemlich jungfreulich mit C++ unterwegs.
Sieht man auf den ersten Blick irgend einen Anfängerfehler oder ist es doch ein komplizierteres Thema? Naja, wäre für jede Hilfe dankbar.

Grüße
schnips
TyRoXx
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.06.2009
Beiträge: 1033
Beitrag TyRoXx Mitglied 14:44:52 29.05.2012   Titel:              Zitieren

Vermutlich müsste CKlasse als ref class CKlasse definiert werden, damit sie "managed" ist und man die Methoden als Delegaten benutzen kann.

_________________
.. aber dann wäre C++ uneinheitlich und nicht mehr so anfängergerecht.
schnips
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 8
Beitrag schnips Mitglied 14:48:48 29.05.2012   Titel:              Zitieren

Danke TyRoXx für die schnelle antwort.
Das vermute ich auch, da es sich aber um ein bestehendes Projekt handelt kann ich CKlasse nicht einfach so "umdefinieren". Fällt dir vielleicht eine andere Lösung ein?
GPC
Moderator

Benutzerprofil
Anmeldungsdatum: 11.07.2004
Beiträge: 6812
Beitrag GPC Moderator 15:49:49 29.05.2012   Titel:              Zitieren

Wenn es ein älteres C++-Programm ist, wird es vermutlich Standard C++ sein und kein C++/CLI, wie es für die Benutzung des BackgroundWorker notwendig wäre. An deiner Stelle würde ich aus dem C++-Programm auch kein C++/CLI-Quark machen.
Ich würde mich lieber etwas umschauen, wie man mit WinAPI bzw. MFC-Mitteln (je nachdem was es für ein Programm ist), etwas ähnliches zu BackgroundWorker realisiert. Da gibt es bestimmt was, denn das ist eine Standardaufgabe und .NET baut in vielen Dingen intern eh auf WinAPI auf.

_________________
"We're rockstars, not lumberjacks" (Axl Rose about Grunge)
schnips
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 8
Beitrag schnips Mitglied 08:39:47 30.05.2012   Titel:              Zitieren

Guten Morgen.

Vielen Dank GPC. Nach längerem googeln vermute ich das nun auch. Dann werde ich mich wohl um eine alternative umsehen müssen.
Ähm noch eine Frage, ich habe in anderen Foren gelesen das C++ und C++/CLI zwei völlig verschiedene Programmiersprachen sind. Woran erkenne ich denn nun ob dieses Programm C++ oder C++/CLI ist? :confused:
Danke vielmals.
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 4074
Beitrag theta Mitglied 09:26:53 30.05.2012   Titel:              Zitieren

In C++/CLI Sourcecode kommen typischerweise "System::", "ref class", "ref struct", "value class", "value struct" und "^" (alle ohne Double Quotes) vor.
schnips
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 8
Beitrag schnips Mitglied 11:34:32 01.06.2012   Titel:              Zitieren

Hallo.

Ich habe es nun mit einem seperaten Thread hin bekommen das mein Download im Hintergrund geschieht. :live:
Ich habe nun aber das Problem, dass ich meine Oberfläche von diesem Thread aus aktuallisieren muss. Habe dazu auch einiges gegoogelt und bin auf das Thema Signale/Slots gestoßen. Das scheint mir aber alles ein wenig komplex. Liegt wahrscheinlich an meinen mangelnden C++ Kenntnisse ;)

Dieser Link hier beschreibt genau mein Problem und schildert mir auch eine relativ simple Lösung, leider aber in C#.
http://blogs.msdn.com/b/c ....... ive/2004/03/17/91685.aspx

Hat mir jemand von euch eine nahezu genauso simple Lösung in C++? Oder ist es in C++ einfach komplexer?

Grüße schnips
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 4074
Beitrag theta Mitglied 13:43:45 01.06.2012   Titel:              Zitieren

Zitat:
Hat mir jemand von euch eine nahezu genauso simple Lösung in C++?

In C++ gibt es nicht DIE Lösung, sondern es ist abhängig von der benutzen API (OS, Libraries). Falls, und das nehme ich an, Du unter Windows arbeitest sind die Win API Funktionen PostMessage(..) und PostThreadMessage(..) ein Anfang. Je nach GUI Toolkit gibt es aber schon andere Lösungen. Also, wie sieht dein Setup aus?

Zitat:
Oder ist es in C++ einfach komplexer?

Nein, eigentlich nicht.
schnips
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 8
Beitrag schnips Mitglied 14:11:33 01.06.2012   Titel:              Zitieren

Vielen Dank theta.

Ja ich arbeite unter Windows. Ok, dann probiere ich das gleich mal aus.

Grüße
c++.de :: C++/CLI mit .NET ::  Backgroundworker   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.