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 184

    Warum ist panel1 hier nicht bekannt ?


Anmelden zum Antworten