Threadübergreifende Parameter
-
Abend Leute ... wieder mal nen Problem:
Aus Rücksicht auf die Performance versuche ich aus der Klasse A:
public ref class EmailPanel : public DLLpanelklasse::BASISpanel { private: static void emailanzeigen (System::Collections::Generic::List<String^>^ emailabsender); ... void Sidebar::EmailPanel::getsenders () { Sidebar::EmailViewer^ tws = gcnew Sidebar::EmailViewer(EP_pop3, EP_benutzername, EP_benutzerpass, gcnew CallbackEmailViewer(&EmailPanel::emailanzeigen)); Thread^ t = gcnew Thread(gcnew ThreadStart(tws, &EmailViewer::getEmailsendersThread)); t->Start(); //t->Join(); // Auf Thread wird gewartet } }
...diese Funktion:
System::Collections::Generic::List<String^>^ Sidebar::EmailViewer::getEmailsenders () { return absenderlist; }
der Klasse B aufzurufen:
delegate void CallbackEmailViewer(System::Collections::Generic::List<String^>^ absender); namespace Sidebar { public ref class EmailViewer : public System::Windows::Forms::Form { ref class EmailPanel; protected: ref struct emailinfo; private: CallbackEmailViewer^ callback; public: void getEmailsendersThread() { if (callback != nullptr) callback(getEmailsenders ()); } public: EmailViewer (String^ server, String^ id, String^ pass, CallbackEmailViewer^ callbackDelegate) { InitializeComponent (); POP3server = server; POP3id = id; POP3pass = pass; callback = callbackDelegate; }
Anschliessend wird ja nun laut Klasse A die Callback Methode "emailanzeigen" aufgerufen, welche in etwa so aussieht:
// Neue Controls erstellen for each (String^ text in absender) { lb = gcnew Label (); lb->Name = "emaillabel" + nr.ToString (); lb->BackColor = Color::Transparent; lb->Tag = nr.ToString (); lb->ForeColor = Color::White; lb->AutoEllipsis = true; lb->AutoSize = true; lb->Text = text; lb->Location = System::Drawing::Point (5 , pos); Control^ ctl = safe_cast<Control^>(lb); panel1->Controls->Add (ctl); nr++; pos += 15; }
Leider gibt es genau hier Probleme beim erstellen bzw. hinzufügen der neuen Controls. Allerdings erhalte ich keine genauer Fehlermeldung als diese:
Warnung 1 warning C4677: "EmailViewer": Die Signatur des nicht privaten Members enthält den privaten Assemblytyp "CallbackEmailViewer". c:\users\jan\documents\visual studio 2008\projects\sidebar2101\emailpanel\EmailViewer.h 101
Fehler 2 error C2227: Links von "->Controls" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden. c:\Users\Jan\Documents\Visual Studio 2008\Projects\Sidebar2101\Emailpanel\EmailPanel.cpp 184
Fehler 3 error C2227: Links von "->Add" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden. c:\Users\Jan\Documents\Visual Studio 2008\Projects\Sidebar2101\Emailpanel\EmailPanel.cpp 184Warum ist panel1 hier nicht bekannt ?