Brauche Hilfe bei: _beginthread
-
Hallo zusammen,
wollte mir gerade einen Thread basteln, aber ich bekomm das einfach nicht hin
Ich benutze Visual c++ 2005 ExpressTestWF.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!!
mfgFabian
-
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