Thread benutzen wie



  • Ich versteh leider nicht wie ich denn zugriff synchronisiere könnt ich vieleicht eine erklärung kriegen wie das geht? Ich hab nur herausgefunden wie ich Strings an Threads schiecken kann das sieht dann so aus.

    #include<Windows.h> 
    
    int c=0;
    
    #pragma once 
    
    namespace Thread1 { 
    
        using namespace System; 
        using namespace System::ComponentModel; 
        using namespace System::Collections; 
        using namespace System::Windows::Forms; 
        using namespace System::Data; 
        using namespace System::Drawing; 
    
        /// <summary> 
        /// Zusammenfassung für Form1 
        /// </summary> 
        public ref class Form1 : public System::Windows::Forms::Form 
        { 
        public: 
            Form1(void) 
            { 
                InitializeComponent(); 
                // 
                //TODO: Konstruktorcode hier hinzufügen. 
                // 
            } 
    
        protected: 
            /// <summary> 
            /// Verwendete Ressourcen bereinigen. 
            /// </summary> 
            ~Form1() 
            { 
                if (components) 
                { 
                    delete components; 
                } 
            } 
        private: System::Windows::Forms::Button^  button1; 
        static System::Windows::Forms::TextBox^  s; 
        protected: 
    
        public: 
            /// <summary> 
            /// Erforderliche Designervariable. 
            /// </summary> 
            System::ComponentModel::Container ^components; 
    
    #pragma region Windows Form Designer generated code 
            /// <summary> 
            /// Erforderliche Methode für die Designerunterstützung. 
            /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. 
            /// </summary> 
            void InitializeComponent(void) 
            { 
                this->button1 = (gcnew System::Windows::Forms::Button()); 
                this->s = (gcnew System::Windows::Forms::TextBox()); 
                this->SuspendLayout(); 
                // 
                // button1 
                // 
                this->button1->Location = System::Drawing::Point(13, 26); 
                this->button1->Name = L"button1"; 
                this->button1->Size = System::Drawing::Size(75, 23); 
                this->button1->TabIndex = 0; 
                this->button1->Text = L"button1"; 
                this->button1->UseVisualStyleBackColor = true; 
                this->button1->Click += gcnew System::EventHandler(this, &Form1::t); 
                // 
                // s 
                // 
                this->s->Location = System::Drawing::Point(35, 98); 
                this->s->Name = L"s"; 
                this->s->Size = System::Drawing::Size(100, 20); 
                this->s->TabIndex = 1; 
                // 
                // Form1 
                // 
                this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); 
                this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; 
                this->ClientSize = System::Drawing::Size(292, 266); 
                this->Controls->Add(this->s); 
                this->Controls->Add(this->button1); 
                this->Name = L"Form1"; 
                this->Text = L"Form1"; 
                this->ResumeLayout(false); 
                this->PerformLayout(); 
    
            } 
    
    #pragma endregion 
        delegate void Delg_1(int zahl_1); 
        Threading::Thread^ newThread;
    
          static void update_1(int zahl_1) 
            { 
    
                    if(Thread1::Form1::s->InvokeRequired) 
                    { 
                        Thread1::Form1::Delg_1^a=gcnew Delg_1(update_1); 
                         Thread1::Form1::s->Invoke(a,1); 
                    } 
                    else 
                    { 
                       Thread1::Form1::s->Text = "aa"; 
                    } 
    
            } 
    
       void PR () 
            { 
    			    int h=1;
    				while(h)
    				{
    
    					if(Threading::Thread::CurrentThread->Name=="1")
    					{
    						h=0;
    					}
    
                   Thread1::Form1::Delg_1^a=gcnew Delg_1(update_1); 
                         Thread1::Form1::s->Invoke(a,1); 
    				}   
    
            } 
       static int u=0;
        private: System::Void t(System::Object^  sender, System::EventArgs^  e) { 
                     HANDLE    tr;   
    
                     DWORD    N;   
    				  c=c+1;
    				  if(c>1)
    				  {
    					  c=0;
    
    				  }
    				  if(c==1)
    				  {
    					  newThread = gcnew 
                     Threading::Thread(gcnew Threading::ThreadStart(this,&Thread1::Form1::PR)); 
    
    				 newThread->Start(); 
    
    				  }
    				  else
    				  { 
    
    					newThread->Name="1";
    
    				  }
    
    ; 
    
                 } 
        }; 
    }
    


  • Wie wäre es denn mit ein wenig eigeninitiative?

    Dieses fucking Tutorial arbeitest du bitte durch!



  • Ich kann leider kein Englisch.
    kennt sich vieleicht jemand mit der Materie aus und könnte folgenden Cod berichtigen

    #include<Windows.h> 
    
    int c=0; 
    int z=1; 
    #pragma once 
    
    namespace Thread1 { 
    
        using namespace System; 
        using namespace System::ComponentModel; 
        using namespace System::Collections; 
        using namespace System::Windows::Forms; 
        using namespace System::Data; 
        using namespace System::Drawing; 
    
        /// <summary> 
        /// Zusammenfassung für Form1 
        /// </summary> 
        public ref class Form1 : public System::Windows::Forms::Form 
        { 
        public: 
            Form1(void) 
            { 
                InitializeComponent(); 
                // 
                //TODO: Konstruktorcode hier hinzufügen. 
                // 
            } 
    
        protected: 
            /// <summary> 
            /// Verwendete Ressourcen bereinigen. 
            /// </summary> 
            ~Form1() 
            { 
                if (components) 
                { 
                    delete components; 
                } 
            } 
        private: System::Windows::Forms::Button^  button1; 
        static System::Windows::Forms::TextBox^  s; 
        protected: 
    
        public: 
            /// <summary> 
            /// Erforderliche Designervariable. 
            /// </summary> 
            System::ComponentModel::Container ^components; 
    
    #pragma region Windows Form Designer generated code 
            /// <summary> 
            /// Erforderliche Methode für die Designerunterstützung. 
            /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. 
            /// </summary> 
            void InitializeComponent(void) 
            { 
                this->button1 = (gcnew System::Windows::Forms::Button()); 
                this->s = (gcnew System::Windows::Forms::TextBox()); 
                this->SuspendLayout(); 
                // 
                // button1 
                // 
                this->button1->Location = System::Drawing::Point(13, 26); 
                this->button1->Name = L"button1"; 
                this->button1->Size = System::Drawing::Size(75, 23); 
                this->button1->TabIndex = 0; 
                this->button1->Text = L"button1"; 
                this->button1->UseVisualStyleBackColor = true; 
                this->button1->Click += gcnew System::EventHandler(this, &Form1::t); 
                // 
                // s 
                // 
                this->s->Location = System::Drawing::Point(35, 98); 
                this->s->Name = L"s"; 
                this->s->Size = System::Drawing::Size(100, 20); 
                this->s->TabIndex = 1; 
                // 
                // Form1 
                // 
                this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); 
                this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; 
                this->ClientSize = System::Drawing::Size(292, 266); 
                this->Controls->Add(this->s); 
                this->Controls->Add(this->button1); 
                this->Name = L"Form1"; 
                this->Text = L"Form1"; 
                this->ResumeLayout(false); 
                this->PerformLayout(); 
    
            } 
    
    #pragma endregion 
        delegate void Delg_1(int zahl_1); 
        Threading::Thread^ newThread; 
    
          static void update_1(int zahl_1) 
            { 
    
                    if(Thread1::Form1::s->InvokeRequired) 
                    { 
                        Thread1::Form1::Delg_1^a=gcnew Delg_1(update_1); 
                         Thread1::Form1::s->Invoke(a,1); 
                    } 
                    else 
                    { 
                       Thread1::Form1::s->Text = "aa"; 
                    } 
    
            } 
    
       void PR () 
            { 
                    int h=1; 
                    while(h) 
                    { 
    
                      Threading::Monitor::TryEnter(z); 
                          h=z; 
                          Threading::Monitor::Exit(z); 
                   Thread1::Form1::Delg_1^a=gcnew Delg_1(update_1); 
                         Thread1::Form1::s->Invoke(a,1); 
                    }   
    
            } 
        private: System::Void t(System::Object^  sender, System::EventArgs^  e) { 
                     HANDLE    tr;   
    
                     DWORD    N;   
                      c=c+1; 
                      if(c>1) 
                      { 
                          c=0; 
    
                      } 
                      if(c==1) 
                      { 
                          Threading::Monitor::TryEnter(z); 
                          z=1; 
                          Threading::Monitor::Exit(z); 
                     newThread = gcnew 
                     Threading::Thread(gcnew Threading::ThreadStart(this,&Thread1::Form1::PR)); 
                     newThread->Start(); 
                      } 
                      else 
                      { 
    
                           Threading::Monitor::TryEnter(z); 
                          z=0; 
                          Threading::Monitor::Exit(z); 
    
                      } 
    
    ; 
    
                 } 
        }; 
    }
    

    ich bekomme folgende Fehlermeldung

    "Thread.exe" (Verwaltet (v4.0.30319)): "C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll" geladen 
    "Thread.exe" (Verwaltet (v4.0.30319)): "C:\Thread\Funktion in Funktion\Release\Thread.exe" geladen, Symbole geladen. 
    "Thread.exe" (Verwaltet (v4.0.30319)): "C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll" geladen 
    "Thread.exe" (Verwaltet (v4.0.30319)): "C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll" geladen 
    "Thread.exe" (Verwaltet (v4.0.30319)): "C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll" geladen 
    "Thread.exe" (Verwaltet (v4.0.30319)): "C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_de_b77a5c561934e089\mscorlib.resources.dll" geladen 
    Eine Ausnahme (erste Chance) des Typs "System.Threading.SynchronizationLockException" ist in Thread.exe aufgetreten. 
    Eine nicht behandelte Ausnahme des Typs "System.Threading.SynchronizationLockException" ist in Thread.exe aufgetreten. 
    
    Zusätzliche Informationen: Die Objektsynchronisationsmethode wurde von einem nicht synchronisierten Codeblock aufgerufen. 
    
    Das Programm "[4036] Thread.exe: Verwaltet (v4.0.30319)" wurde mit Code 0 (0x0) beendet.
    

    Was bedeutet Die Objektsynchronisationsmethode wurde von einem nicht synchronisierten Codeblock aufgerufen.
    Heist das ich darf
    Threading::Monitor::TryEnter(z);
    und Threading::Monitor::Exit(z);
    nur zwichen zwei bestimmten befehlen verwenden die angeben das der Codblock synchronisiert ist oder muss ich bei den Projecteinstellungen angeben das ich einen synchronisierten Cod verwenden möchte?



  • Was bedeutet Die Objektsynchronisationsmethode wurde von einem nicht synchronisierten Codeblock aufgerufen.

    ➡
    http://msdn.microsoft.com/de-de/library/system.threading.synchronizationlockexception(v=vs.80).aspx

    Heist das ich darf
    Threading::Monitor::TryEnter(z);
    und Threading::Monitor::Exit(z);
    nur zwichen zwei bestimmten befehlen verwenden die angeben das der Codblock synchronisiert ist oder muss ich bei den Projecteinstellungen angeben das ich einen synchronisierten Cod verwenden möchte?

    Nein und Nein.

    Es bedeutet: Rufe nicht Exit(..) auf, wenn nicht gelockt ist!
    Monitor::TryEnter(..) hat einen Rückgabe Wert -> Prüfe den!
    Lies das: http://msdn.microsoft.com/de-de/library/system.threading.monitor(v=vs.80).aspx

    Ich denke, es ist besser die Mutex Klasse zu verwenden, aber noch besser wäre C# zu verwenden und Englisch zu lernen. Aber hey, die MSDN Doku ist auch Deutsch!



  • ich hab gelesen dass wenn der aktuelle Thread gesperrt ist lievert TryEnter eine 1. Dass heisst wenn es nicht 1 ist hat es die erlaubnis. Dann müsste folgendes Funktionieren.

    #include<Windows.h> 
    
    int c=0; 
    int z=1; 
    int sch=1;
    #pragma once 
    
    namespace Thread1 { 
    
        using namespace System; 
        using namespace System::ComponentModel; 
        using namespace System::Collections; 
        using namespace System::Windows::Forms; 
        using namespace System::Data; 
        using namespace System::Drawing; 
    
        /// <summary> 
        /// Zusammenfassung für Form1 
        /// </summary> 
        public ref class Form1 : public System::Windows::Forms::Form 
        { 
        public: 
            Form1(void) 
            { 
                InitializeComponent(); 
                // 
                //TODO: Konstruktorcode hier hinzufügen. 
                // 
            } 
    
        protected: 
            /// <summary> 
            /// Verwendete Ressourcen bereinigen. 
            /// </summary> 
            ~Form1() 
            { 
                if (components) 
                { 
                    delete components; 
                } 
            } 
        private: System::Windows::Forms::Button^  button1; 
        static System::Windows::Forms::TextBox^  s; 
        protected: 
    
        public: 
            /// <summary> 
            /// Erforderliche Designervariable. 
            /// </summary> 
            System::ComponentModel::Container ^components; 
    
    #pragma region Windows Form Designer generated code 
            /// <summary> 
            /// Erforderliche Methode für die Designerunterstützung. 
            /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. 
            /// </summary> 
            void InitializeComponent(void) 
            { 
                this->button1 = (gcnew System::Windows::Forms::Button()); 
                this->s = (gcnew System::Windows::Forms::TextBox()); 
                this->SuspendLayout(); 
                // 
                // button1 
                // 
                this->button1->Location = System::Drawing::Point(13, 26); 
                this->button1->Name = L"button1"; 
                this->button1->Size = System::Drawing::Size(75, 23); 
                this->button1->TabIndex = 0; 
                this->button1->Text = L"button1"; 
                this->button1->UseVisualStyleBackColor = true; 
                this->button1->Click += gcnew System::EventHandler(this, &Form1::t); 
                // 
                // s 
                // 
                this->s->Location = System::Drawing::Point(35, 98); 
                this->s->Name = L"s"; 
                this->s->Size = System::Drawing::Size(100, 20); 
                this->s->TabIndex = 1; 
                // 
                // Form1 
                // 
                this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); 
                this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; 
                this->ClientSize = System::Drawing::Size(292, 266); 
                this->Controls->Add(this->s); 
                this->Controls->Add(this->button1); 
                this->Name = L"Form1"; 
                this->Text = L"Form1"; 
                this->ResumeLayout(false); 
                this->PerformLayout(); 
    
            } 
    
    #pragma endregion 
        delegate void Delg_1(int zahl_1); 
        Threading::Thread^ newThread; 
    
          static void update_1(int zahl_1) 
            { 
    
                    if(Thread1::Form1::s->InvokeRequired) 
                    { 
                        Thread1::Form1::Delg_1^a=gcnew Delg_1(update_1); 
                         Thread1::Form1::s->Invoke(a,1); 
                    } 
                    else 
                    { 
                       Thread1::Form1::s->Text = "aa"; 
                    } 
    
            } 
    
       void PR () 
            { 
                    int h=1; 
                    while(h) 
                    { 
    
                       if(Threading::Monitor::TryEnter(z)!=1)
    				   {
                          h=z; 
                          Threading::Monitor::Exit(z); 
    				   }
                   Thread1::Form1::Delg_1^a=gcnew Delg_1(update_1); 
                         Thread1::Form1::s->Invoke(a,1); 
                    }   
    
            } 
        private: System::Void t(System::Object^  sender, System::EventArgs^  e) { 
                     HANDLE    tr;   
    
                     DWORD    N;   
                      c=c+1; 
                      if(c>1) 
                      { 
                          c=0; 
    
                      } 
                      if(c==1) 
                      { 
                             sch=1;
    					  while(sch)
    					  {
                           if(Threading::Monitor::TryEnter(z)!=1)
    					   {
    
                          z=1; 
    					  sch=0;
                          Threading::Monitor::Exit(z); 
    					   }
    					  }
                     newThread = gcnew 
                     Threading::Thread(gcnew Threading::ThreadStart(this,&Thread1::Form1::PR)); 
                     newThread->Start(); 
                      } 
                      else 
                      { 
                          sch=1;
    					  while(sch)
    					  {
                           if(Threading::Monitor::TryEnter(z)!=1)
    					   {
                          z=0; 
    					  sch=0;
                          Threading::Monitor::Exit(z); 
    					   }
    					  }
    
                      } 
    
    ; 
    
                 } 
        }; 
    }
    

    Aber dass hängt sich auf Wo ist der fehler?



  • Je länger je mehr: Benutze C# oder wenigstens hier einfach die Klasse Mutex!



  • Ich hab ein Beispiel gefunden wo mit Hilfe der Classe Mutex gewartet wurde bis ein String beim Thread ankommt der vorher von einem anderen Thread dort hingeschickt wurde. Wie mach ich dass wen ich mehrere Threads habe und die ihre Nachrichten an einen Thread schicken wie halt ich die nachrichten dann auseinander und kommen die dann auch noch ganz an?



  • Wo bitte sollten die denn verloren gehen?



  • Wenn ich von mehreren threads aus gleichzeitig eineNachricht an ein Thread schicke stehen die dann nacheinander in Threading::Thread::CurrentThread->Name drin und ist dass erlaubt. Muss ich für jeden Thread der eine Variable anlegen der den Thread beinhaltet anm den die Nachricht geschickt werden soll wenn die Threads ihre nachricht an ein Thread gleichzeitig schicken solln?

    Ich hatte folgendes schonmal gefragt aber leider keine Antwot bekommen ich hoffe ich bekomm jetzt eine. 😉

    Kann ich neben Name auch noch andere Verbindungen zum Thread erschafen.
    zum Beispiel
    im Hauptprogramm
    Thread->a="1"
    Thread->b="22"
    Thread->c="11"
    im Thread
    Threading::Thread::CurrentThread->a
    Threading::Thread::CurrentThread->b
    Threading::Thread::CurrentThread->c



  • 😞



  • theta schrieb:

    😞

    Nicht traurig sein. 🙄



  • OT: Soll ich das nicht mal schliessen... das ist ja nicht zum aushalten...



  • Ich weiss leider nicht was ich verkert mach warum ihr sauer seid. Ich würd gern wissen ob dass möglich ist (siehe meine vorige Frage).



  • Hallo Jim,

    am besten, du liest dir erst einmal ein gutes Buch oder Tutorial zum Thema Multithreading durch (wie z.B. [Artikel]Multi-Threaded Programmierung - Codebeispiele sind aber natürlich in C# 😉

    Und zur Kommunikation zwischen Threads verwendet man am besten "synchronisierte Queues" - eine Implementierung davon (auch wieder in C#) gibt es unter SyncQueue <T> - Eine praktische Job-Queue

    Und ab .NET 4.0 gibt es dazu schon eingebaut die BlockingCollection<T>-Klasse.



  • Ist folgender Cod richtig synchronisiert

    #include<Windows.h> 
    int c=0;
    
    CRITICAL_SECTION  kl;
    int io=0;
    
    #pragma once 
    
    namespace Thread1 { 
    
        using namespace System; 
        using namespace System::ComponentModel; 
        using namespace System::Collections; 
        using namespace System::Windows::Forms; 
        using namespace System::Data; 
        using namespace System::Drawing; 
    
        /// <summary> 
        /// Zusammenfassung für Form1 
        /// </summary> 
        public ref class Form1 : public System::Windows::Forms::Form 
        { 
        public: 
            Form1(void) 
            { 
                InitializeComponent(); 
                // 
                //TODO: Konstruktorcode hier hinzufügen. 
                // 
            } 
    
        protected: 
            /// <summary> 
            /// Verwendete Ressourcen bereinigen. 
            /// </summary> 
            ~Form1() 
            { 
                if (components) 
                { 
                    delete components; 
                } 
            } 
        private: System::Windows::Forms::Button^  button1; 
        static System::Windows::Forms::TextBox^  s; 
        protected: 
    
        public: 
            /// <summary> 
            /// Erforderliche Designervariable. 
            /// </summary> 
            System::ComponentModel::Container ^components; 
    
    #pragma region Windows Form Designer generated code 
            /// <summary> 
            /// Erforderliche Methode für die Designerunterstützung. 
            /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. 
            /// </summary> 
            void InitializeComponent(void) 
            { 
                this->button1 = (gcnew System::Windows::Forms::Button()); 
                this->s = (gcnew System::Windows::Forms::TextBox()); 
                this->SuspendLayout(); 
                // 
                // button1 
                // 
                this->button1->Location = System::Drawing::Point(13, 26); 
                this->button1->Name = L"button1"; 
                this->button1->Size = System::Drawing::Size(75, 23); 
                this->button1->TabIndex = 0; 
                this->button1->Text = L"button1"; 
                this->button1->UseVisualStyleBackColor = true; 
                this->button1->Click += gcnew System::EventHandler(this, &Form1::t); 
                // 
                // s 
                // 
                this->s->Location = System::Drawing::Point(35, 98); 
                this->s->Name = L"s"; 
                this->s->Size = System::Drawing::Size(100, 20); 
                this->s->TabIndex = 1; 
                // 
                // Form1 
                // 
                this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); 
                this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; 
                this->ClientSize = System::Drawing::Size(292, 266); 
                this->Controls->Add(this->s); 
                this->Controls->Add(this->button1); 
                this->Name = L"Form1"; 
                this->Text = L"Form1"; 
                this->ResumeLayout(false); 
                this->PerformLayout(); 
    
            } 
    
    #pragma endregion 
        delegate  int Delg_1(int zahl_1); 
        Threading::Thread^ newThread;
    
          static int update_1(int zahl_1) 
            { 
    
                    if(Thread1::Form1::s->InvokeRequired) 
                    { 
                        Thread1::Form1::Delg_1^a=gcnew Delg_1(update_1); 
                         Thread1::Form1::s->Invoke(a,1); 
    					 return 1;
                    } 
                    else 
                    { 
                       Thread1::Form1::s->Text = "aa"; 
    				   return 1;
                    } 
    
            } 
    
       void PR () 
            { 
    			    int o=0;
    			    int h=1;
    				while(h)
    				{
    
                       _try
    				   {
    					    EnterCriticalSection(&kl); 
    					DeleteCriticalSection(&kl);
    
    							h=io;
    
    				   }
    		           _finally
    				   {
    					   LeaveCriticalSection(&kl); 
    
    				   }
    
                   Thread1::Form1::Delg_1^a=gcnew Delg_1(update_1); 
                       Thread1::Form1::s->Invoke(a,1);
    
    				}   
    
            } 
       static int u=0;
    
        private: System::Void t(System::Object^  sender, System::EventArgs^  e) { 
                     HANDLE    tr;   
    
                     DWORD    N;   
    				  c=c+1;
    				  if(c>1)
    				  {
    					  c=0;
    
    				  }
    				  if(c==1)
    				  {
    
    				io=1;
    					 InitializeCriticalSection(&kl); 
    
    					  newThread = gcnew 
                     Threading::Thread(gcnew Threading::ThreadStart(this,&Thread1::Form1::PR)); 
    
    				 newThread->Start(); 
    
    				  }
    				  else
    				  { 
    
    					_try
    				   {
    					    EnterCriticalSection(&kl); 
    					     io=0;
    
    				   }
    		           _finally
    				   {
    
    					   LeaveCriticalSection(&kl); 
    
    				   }
    				  }
    
    ; 
    
                 } 
        }; 
    }
    


  • Es ist die reinste Katastrophe!!



  • Ist das nun richtig oder verkert. Wenns verkert ist dann sag mir bitte was?.



  • Bitte stelle konkrete Fragen und poste hier nicht fast den ganzen Code...


Anmelden zum Antworten