Backgroundworker
-
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
-
Vermutlich müsste
CKlasse
alsref class CKlasse
definiert werden, damit sie "managed" ist und man die Methoden als Delegaten benutzen kann.
-
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?
-
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.
-
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?
Danke vielmals.
-
In C++/CLI Sourcecode kommen typischerweise "System::", "ref class", "ref struct", "value class", "value struct" und "^" (alle ohne Double Quotes) vor.
-
Hallo.
Ich habe es nun mit einem seperaten Thread hin bekommen das mein Download im Hintergrund geschieht.
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++ KenntnisseDieser Link hier beschreibt genau mein Problem und schildert mir auch eine relativ simple Lösung, leider aber in C#.
http://blogs.msdn.com/b/csharpfaq/archive/2004/03/17/91685.aspxHat mir jemand von euch eine nahezu genauso simple Lösung in C++? Oder ist es in C++ einfach komplexer?
Grüße schnips
-
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?
Oder ist es in C++ einfach komplexer?
Nein, eigentlich nicht.
-
Vielen Dank theta.
Ja ich arbeite unter Windows. Ok, dann probiere ich das gleich mal aus.
Grüße