Laufende Uhr per Threading



  • Hallo,
    ich will mal lernen wie man Threads programmiert. Am besten mal am Beispiel einer laufenden Uhr. (klar ... geht auch mit nem Timer ... aber möchte eben mal den Umgang mit Threads lernen.

    Ich hab dazu ne Windows-Forms-Anwendung gemacht in der ich auf einem Label immer die aktuelle Uhrzeit haben will. Dann habe ich es mir so gedacht, dass ich ne eigene Klasse erstellen möchte, der ich das Label als Objekt übergebe und die dann den Thread erstellt.

    Die Klasse sieht bis jetzt so aus:
    uhr.h

    #pragma once
    
    using namespace System;
    using namespace System::Threading;
    using namespace System::Windows::Forms;
    
    ref class Uhr
    {
      System::Threading::ThreadStart^ ts;
      System::Threading::Thread^ th;
      System::Windows::Forms::Label^ lb;
    
      public:
    	  void start(Label^ meinLabel);
    
      private:
    	  void uhrzeit(void);
    };
    

    uhr.cpp

    #include "StdAfx.h"
    #include "Uhr.h"
    #include <windows.h>
    
    void Uhr::start(Label^ meinLabel)
    {
    	lb = meinLabel;
    	ts = gcnew ThreadStart(&Uhr::uhrzeit);
    	th = gcnew Thread(ts);
    	th->Start();
    }
    
    void Uhr::uhrzeit(void)
    {
    	while(true)
    	{
    		lb->Text = "-----"; // Uhrzeit kommt noch 
    		Sleep(500);
    	}
    }
    

    Den Code um die Uhrzeit auszulesen mache ich auch noch rein ... ist ja bis jetzt noch nicht wichtig ...

    In der OnLoad-Methode der Form steht dann folgendes:

    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    				 uhr.start(lbUhr);
    			 }
    

    Die Instanz der Klasse lege ich bereits weiter oben an.

    Das Ganze sollte - laut nem Kollegen der C# kann - auch gehen. Warum es so in Visual C++ nicht geht weis er auch nicht.

    Beim kompilieren kommen dann ewig viele Fehlermeldungen:

    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7408) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(246) sein: System::Windows::Forms::IDataObject IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7408) : error C3699: "": Diese Referenzierung kann nicht für den Typ "IDataObject" verwendet werden.
    Der Compiler ersetzt "
    " durch ^", um die Analyse fortzusetzen.
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) : error C2371: 'IDataObject': Neudefinition; unterschiedliche Basistypen
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(246): Siehe Deklaration von 'IDataObject'
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7583) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7596) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7609) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7621) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7634) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7648) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7661) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7676) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7688) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7721) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7734) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7823) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7863) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7885) : error C2872: 'IMessageFilter': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(258) sein: System::Windows::Forms::IMessageFilter IMessageFilter'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IMessageFilter"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7885) : error C3699: "": Diese Referenzierung kann nicht für den Typ "IMessageFilter" verwendet werden.
    Der Compiler ersetzt "
    " durch ^", um die Analyse fortzusetzen.
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7931) : error C2371: 'IMessageFilter': Neudefinition; unterschiedliche Basistypen
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(258): Siehe Deklaration von 'IMessageFilter'
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(8028) : error C2872: 'IMessageFilter': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7931) sein: IMessageFilter'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IMessageFilter"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(8043) : error C2872: 'IMessageFilter': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7931) sein: IMessageFilter'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IMessageFilter"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(8057) : error C2872: 'IMessageFilter': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7931) sein: IMessageFilter'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IMessageFilter"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(16030) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(16036) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(16041) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(16047) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(16052) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(16059) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(435) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(570) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(1416) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(1422) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(1760) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(1775) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(4408) : error C2872: 'IDropTarget': Mehrdeutiges Symbol
    kann 'c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(168) sein: System::Windows::Forms::IDropTarget IDropTarget'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDropTarget"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(4408) : error C3699: "": Diese Referenzierung kann nicht für den Typ "IDropTarget" verwendet werden.
    Der Compiler ersetzt "
    " durch ^", um die Analyse fortzusetzen.
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(4448) : error C2371: 'IDropTarget': Neudefinition; unterschiedliche Basistypen
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(168): Siehe Deklaration von 'IDropTarget'
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(4452) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(4465) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(4555) : error C2872: 'IDropTarget': Mehrdeutiges Symbol
    kann 'c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(4448) sein: IDropTarget'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDropTarget"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(4556) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(4570) : error C2872: 'IDropTarget': Mehrdeutiges Symbol
    kann 'c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(4448) sein: IDropTarget'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDropTarget"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(4584) : error C2872: 'IDropTarget': Mehrdeutiges Symbol
    kann 'c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(4448) sein: IDropTarget'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDropTarget"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(4595) : error C2872: 'IDropTarget': Mehrdeutiges Symbol
    kann 'c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(4448) sein: IDropTarget'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDropTarget"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\oleidl.h(4596) : error C2872: 'IDataObject': Mehrdeutiges Symbol
    kann 'C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\objidl.h(7422) sein: IDataObject'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : System::Windows::Forms::IDataObject"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(93) : error C2872: 'IServiceProvider': Mehrdeutiges Symbol
    kann 'c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(48) sein: System::IServiceProvider IServiceProvider'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : System::IServiceProvider"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(93) : error C3699: "": Diese Referenzierung kann nicht für den Typ "IServiceProvider" verwendet werden.
    Der Compiler ersetzt "
    " durch ^", um die Analyse fortzusetzen.
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(100) : error C2371: 'IServiceProvider': Neudefinition; unterschiedliche Basistypen
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(48): Siehe Deklaration von 'IServiceProvider'
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(117) : error C2872: 'IServiceProvider': Mehrdeutiges Symbol
    kann 'c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(100) sein: IServiceProvider'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : System::IServiceProvider"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(231) : error C2872: 'IServiceProvider': Mehrdeutiges Symbol
    kann 'c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(100) sein: IServiceProvider'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : System::IServiceProvider"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(238) : error C2872: 'IServiceProvider': Mehrdeutiges Symbol
    kann 'c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(100) sein: IServiceProvider'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : System::IServiceProvider"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\urlmon.h(5174) : error C2872: 'IServiceProvider': Mehrdeutiges Symbol
    kann 'c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(100) sein: IServiceProvider'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : System::IServiceProvider"
    C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\include\urlmon.h(5176) : error C2872: 'IServiceProvider': Mehrdeutiges Symbol
    kann 'c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(100) sein: IServiceProvider'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : System::IServiceProvider"
    .\Uhr.cpp(8) : error C3350: "System::Threading::ThreadStart": Ein Delegatkonstruktor erwartet 2 Argument(e).

    Und das obwohl ich die dort genannten Dateien servprov.h und objidl.h gar nirgens im Quellcode habe ...

    Was mache ich falsch?



  • Ich bin die Sache vielleicht etwas falsch angegangen ... jetzt bin ich auf jeden Fall weiter ...

    Es treten weder beim Compiler, noch beim Linker Fehler oder Warnungen auf - Aber genau dann wenn die Form geladen werden soll tritt eine MethodAccessException auf. Das ist scheinbar eine Exception die auftritt, wenn man keine Rechte hat eine Methode aufzurufen - Also z.B. wenn dir private ist.

    Mit dem Quellcode sieht das jetzt etwas anders aus:

    Uhr.h

    #pragma once
    
    #include <windows.h>
    
    using namespace System;
    using namespace System::Threading;
    using namespace Windows::Forms;
    
    ref class Uhr
    {
    	Label^ myLabel;
    
      public: Uhr(System::Object^ obj);
      public: void working();
    };
    

    Uhr.cpp

    #include "StdAfx.h"
    #include "Uhr.h"
    
    Uhr::Uhr(System::Object^ obj)
    {
    	myLabel = (Label^) obj;
    }
    
    void Uhr::working()
    {
        while (true)
        {
            myLabel->Text = "-----"; // Uhrzeit kommt noch ^^
            Sleep(1000);
        }
    }
    

    Aufgerufen wird das alles nun über die OnLoad-Methode der Form1. Und zwar so:

    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    				 Uhr^ threadWork = gcnew Uhr(lbUhr);
    			     Thread^ newThread = gcnew Thread(gcnew ThreadStart(threadWork, &Uhr::working));
    				 newThread->Start();
    			 }
    

    Nun tritt aber die besagte Exception in der Zeile in der main-Methode auf:
    LaufendeUhrTest.cpp

    // Hauptfenster erstellen und ausführen
    	Application::Run(gcnew Form1());
    

    Beim compilieren geht alles ohne Fehler und dann kommt:

    MethodAccessException wurde nicht behandelt.
    Uhr.working()

    Was mache ich da falsch?



  • Du darfst aus einem anderen Thread als dem UI-Thread keine UI-Elemente verändern. Mach es mit "Invoke/BeginInvoke".



  • Jochen Kalmbach schrieb:

    Du darfst aus einem anderen Thread als dem UI-Thread keine UI-Elemente verändern. Mach es mit "Invoke/BeginInvoke".

    Also ich verstehe schon was Du meinst warum es nicht geht ... aber wie das mit Invoke/BeginInvoke gehen soll ... mmh ... also davon hab ich leider echt keine Ahnung.

    Gibts dazu irgendwo ein kleines Beispiel?



  • Warum machst Du es nicht mit einem OnTimer? also die "System.Windows.Forms.Timer" Klasse in den Designer ziehen und fertig.

    Du brauchst keinen eigenen Thread dazu.



  • ich will mal lernen wie man Threads programmiert. Am besten mal am Beispiel einer laufenden Uhr. (klar ... geht auch mit nem Timer ... aber möchte eben mal den Umgang mit Threads lernen.



  • Knuddlbaer schrieb:

    ich will mal lernen wie man Threads programmiert. Am besten mal am Beispiel einer laufenden Uhr. (klar ... geht auch mit nem Timer ... aber möchte eben mal den Umgang mit Threads lernen.

    Genau das ist die Sache. Das ich ne laufende Uhr auch per Timer realisieren kann ist mir schon klar, aber der Umgang mit Threads ist halt manchmal schon notwendig. Wäre halt schön, wenn Jemand ein Beispiel hat wie das geht, dass man mit Invoke/BeginInvoke auf ein Element wie ein Label oder ne TextBox von einem Thread heraus zugreift. Muss auch nicht zwingend ne Uhr sein ...



  • Such mal nach Deinen Methoden, ich glaube wir hatten schon mal jemanden der mit diesen Methoden gearbeitet hat. Da gabs dann Beispiele und links zu.



  • Ich hab jetzt mal ne ganze Weile prumprobiert und gesucht und auch einiges dazu gefunden ... aber leider nichts das mir zur Lösung verholfen hat.

    Hab jetzt auch ein funktionierendes Beispiel in C#, aber obwohl sich C#-Code in der Regel immer gut umsetzen ließ geht es da nicht weil dort eine Methode aufgerufen wird, die es so nicht in C++ gibt.

    Also das Prog ist ein Beispiel zur Berechnung von Pi, bei dem auf eine textBox und eine progressBar zugegriffen wird.

    calcButton_Click:

    // Asynchrone Delegate-Methode
    CalcPiDelegate calcPi = new CalcPiDelegate(CalcPi);
    calcPi.BeginInvoke((int)_digits.Value, null, null);
    

    CalcPiDelegate:

    delegate void CalcPiDelegate(int digits);
    

    CalcPi:

    void CalcPi(int digits)
    {
      for( ... )
      {
          // ...
          // Pi berechnen und stückweise ausgeben
          // ...
    
          // Fortschritt anzeigen
          ShowProgress(pi.ToString(), digits, i + digitCount);
      }
      }
    }
    

    ShowProgressDelegate:

    delegate void ShowProgressDelegate(string pi, int totalDigits, int digitsSoFar);
    

    ShowProgress:

    void ShowProgress(string pi, int totalDigits, int digitsSoFar)
    {
      // Sicherstellen, dass es sich um den richtigen Thread handelt
      if( _pi.InvokeRequired == false )
      {
        _pi.Text = pi;
        _piProgress.Maximum = totalDigits;
        _piProgress.Value = digitsSoFar;
      }
      else
      {
        // Fortschritt asynchron zeigen
        ShowProgressDelegate  showProgress = new ShowProgressDelegate(ShowProgress);
    
        // BeginInvoke von "showProgress()"
        BeginInvoke(showProgress, new object[] { pi, totalDigits, digitsSoFar});
      }
    }
    

    Das habe ich nun versucht soweit in C++ umzusetzen. Probleme macht mir dabei aber das BeginInvoke beim Button selbst - Das kann ich in C++ nämlich nicht auf dieses Objekt anwenden.

    Kann mir vielleicht doch noch Jemand weiterhelfen? Wäre echt extrem praktisch, wenn das endlich ginge.


Anmelden zum Antworten