| Autor |
Nachricht |
schnips
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 8
|
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
|
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
|
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
|
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
|
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?
Danke vielmals. |
|
|
|
 |
theta
Mitglied
Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 4074
|
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
|
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.
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
|
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
|
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 |
|
|
|
 |