Brauche Hilfe bei: _beginthread



  • Hallo zusammen,

    wollte mir gerade einen Thread basteln, aber ich bekomm das einfach nicht hin 😞
    Ich benutze Visual c++ 2005 Express

    TestWF.cpp

    #include "stdafx.h"
    #include <process.h>
    #include "Form1.h"
    using namespace TestWF;
    
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
    
    	_beginthread(Form1::ThreadProc,0,1);
    
    	void __cdecl Form1::ThreadProc( void* pvData ){
    		MessageBox::Show("angekommen!");
    	}
    .
    .
    .
    }
    

    Form1.h:

    void __cdecl ThreadProc( void* pvData );
    

    Fehlermeldungen und Warnungen:

    warning C4441: Die Aufrufkonvention von "__cdecl " wird ignoriert; stattdessen wird "__clrcall " verwendet.

    "TestWF::Form1::ThreadProc": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&TestWF::Form1::ThreadProc", um einen Zeiger auf den Member zu erstellen.

    'TestWF::Form1::ThreadProc': Lokale Funktionsdefinitionen sind unzulässig

    Bin am verzweifeln, für jegliche Hilfe wäre ich euch SEHR dankbar!!
    mfg

    Fabian



  • probier mal so:

    #include <windows.h>
    #include <process.h>
    
    void __cdecl ThreadProc (void* pvData)
    {
       MessageBox (NULL, "angekommen!", "", 0);
    }
    
    int main()
    {
        _beginthread (ThreadProc,0,(void*)1);
        Sleep (10000);
    }
    


  • Danke für die Hilfe, aber so funktioniert es auch nicht:

    .
    .
    .
    
    void __cdecl Form1::ThreadProc (void* pvData)
    {
    	MessageBox::Show("angekommen!");
    }
    
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
    
    	_beginthread (Form1::ThreadProc,0,(void*)1);
            Sleep (10000);
    .
    .
    .
    

    Die Aufrufkonvention von "__cdecl " wird ignoriert; stattdessen wird "__clrcall " verwendet.

    "TestWF::Form1::ThreadProc": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&TestWF::Form1::ThreadProc", um einen Zeiger auf den Member zu erstellen.

    😞



  • Rahul schrieb:

    Die Aufrufkonvention von "__cdecl " wird ignoriert; stattdessen wird "__clrcall " verwendet.

    ich weiss ja nicht, was du da anstellst. ist das irgendwas für .NET?
    was ich gepostet hab' ist C-code, könnte unter C++ auch gehen, aber nicht wenn schon '__cdecl' angemeckert wird...



  • Wenn Du mit C++/CLI einen Thread starten willst, dann solltest Du "Thread::Start" verwenden!!!

    using namespace System;
    using namespace System::Threading;
    public ref class ThreadWork
    {
    public:
       static void DoWork()
       {
          for ( int i = 0; i < 3; i++ )
          {
             Console::WriteLine( "Working thread..." );
             Thread::Sleep( 100 );
    
          }
       }
    
    };
    
    int main()
    {
       ThreadStart^ myThreadDelegate = gcnew ThreadStart( &ThreadWork::DoWork );
       Thread^ myThread = gcnew Thread( myThreadDelegate );
       myThread->Start();
       for ( int i = 0; i < 3; i++ )
       {
          Console::WriteLine( "In main." );
          Thread::Sleep( 100 );
    
       }
    }
    


  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum WinAPI in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • danke erstmal für die Antworten!!
    hab mich jetzt mal besser in die Threads-"Problematik" eingelesen, aber jetzt häng ich schon wieder fest:

    es ist doch möglich mit ParameterizedThreadStart der ThreadStartMethode ein Objekt zu übergeben...

    Kann ich damit auch ein STRUCT übergeben? wenn ja, wie???

    bisher sieht es bei mir so aus:

    ParameterizedThreadStart^ start = gcnew ParameterizedThreadStart( &ThreadWork::DoWork);
    Thread^ myThread = gcnew Thread(start);
    // myThread->Start(MEINESTRUKTUR);
    

    also kann ich mein struct irgendwie nach Object casten und dann wieder zurück, oder bin ich auf dem ganz falschen weg 😞



  • using namespace System;
    using namespace System::Threading;
    
    // The ThreadWithState class contains the information needed for
    // a task, and the method that executes the task.
    //
    ref class ThreadWithState {
      // State information used in the task.
    private:
      String ^boilerplate;
      int value;
    
    public:
      // The constructor obtains the state information.
      ThreadWithState(String ^text, int number)
      {
        boilerplate = text;
        value = number;
      }
    
      // The thread procedure performs the task, such as formatting 
      // and printing a document.
      void ThreadProc() 
      {
        Console::WriteLine(boilerplate, value); 
      }
    };
    
    // Entry point for the example.
    //
    int main() 
    {
      // Supply the state information required by the task.
      ThreadWithState ^tws = gcnew ThreadWithState("This report displays the number {0}.", 42);
    
      // Create a thread to execute the task, and then
      // start the thread.
      Thread ^t = gcnew Thread(gcnew ThreadStart(tws, &ThreadWithState::ThreadProc));
      t->Start();
      Console::WriteLine("Main thread does some work, then waits.");
      t->Join();
      Console::WriteLine("Independent task has completed; main thread ends.");
    }
    


  • Oder:

    using namespace System;
    using namespace System::Threading;
    
    ref class ThreadTest
    {
    public:
      static void ThreadProc(Object ^obj)
      {
        Console::WriteLine("Thread: {0}", obj); 
      }
    };
    
    int main()
    {
      Thread ^t = gcnew Thread(gcnew ParameterizedThreadStart(&ThreadTest::ThreadProc));
      t->Start("Hello world");
      Console::WriteLine("Main thread does some work, then waits.");
      t->Join();
      Console::WriteLine("Independent task has completed; main thread ends.");
    }
    


  • Vielen Dank Jochen!!!
    deine vorletzte Lösung war genau das was ich gesucht habe, so hab ich mir das vorgestellt 🤡


Anmelden zum Antworten