CreateThread
-
Hallo,
ich versuche mich gerade in Threads einzuarbeiten. Allerdings funktioniert es mal wieder so wie es soll.Und zwar bekomme ich Folgenden Error vom Compiler:
[BCC32 Fehler] Unit1.cpp(630): E2034 Konvertierung von 'int' nach 'unsigned long (__stdcall *)(void *)' nicht möglich [BCC32 Fehler] Unit1.cpp(630): E2342 Keine Übereinstimmung des Parametertyps 'lpStartAddress' ('unsigned long (__stdcall *)(void *)' erwartet, 'int' erhalten)
Hier der Quellcode:
Angeln(){ [...] } void __fastcall TForm1::Button1Click(TObject *Sender) { HANDLE AngelThreadHandle; DWORD AngelThreadID; AngelThreadHandle=CreateThread( NULL, // default security attributes 0, // use default stack size Angeln(), // thread function NULL, // argument to thread function 0, // use default creation flags &AngelThreadID); // returns the thread identifier CloseHandle(AngelThreadHandle); }
Hoffe jemand kann mir Helfen,
mfg Eles
-
Hallo
Allerdings funktioniert es mal wieder so wie es soll.
Na dann ist doch super
Die Fehlermeldungen sagen doch schon aus, das deine Payload-Funktion Angeln nicht den korrekten Typ hat.
unsigned long Angeln(void* data) // So muß die Funktion deklariert sein { [...] }
Desweiteren muß der Aufruf der Threadfunktion auch noch korrigiert werden :
...=CreateThread(..., Angeln, // Nicht die Funktion Angeln aufrufen, sondern als Zeiger übergeben ...);
/Edit : Achja und der Builder bietet mit TThread auch eine einfache Kapselung. Wenn du bei den WinAPI-Funktionen bleiben willst, dann verschieb ich dich ins WinAPI-Forum.
bis bald
akari
-
Es hasst mich...
Ich habe es jetzt so:unsigned long Angeln(void* data){ [..] } void __fastcall TForm1::Button1Click(TObject *Sender) { HANDLE AngelThreadHandle; DWORD AngelThreadID; AngelThreadHandle=CreateThread( NULL, // default security attributes 0, // use default stack size Angeln, // thread function NULL, // argument to thread function 0, // use default creation flags &AngelThreadID); // returns the thread identifier (Das hier ist Line 630) CloseHandle(AngelThreadHandle); }
Jetzt kommt diese Fehlermeldungen:
[BCC32 Fehler] Unit1.cpp(630): E2034 Konvertierung von 'unsigned long(void *)' nach 'unsigned long (__stdcall *)(void *)' nicht möglich [BCC32 Fehler] Unit1.cpp(630): E2342 Keine Übereinstimmung des Parametertyps 'lpStartAddress' ('unsigned long (__stdcall *)(void *)' erwartet, 'unsigned long (*)(void *)' erhalten)
Ich habe keine Komponente TThread, nur die Komponenten IdThreadComponent, IdSchedulerOfThreadDefault und IdSchedulerOfThreadPool.
-
Hallo
Ja, hab noch das __stdcall vergessen.
unsigned long __stdcall Angeln(void* data)
bis bald
akari
-
Nun ist es ganz Kaputt
habe es jetzt geändert aufunsigned long __stdcall Angeln(void* data){ [..] }
Und nun kommt folgende Fehler:
[BCC32 Fehler] ws2def.h(213): E2238 Mehrfache Deklaration von 'sockaddr' [BCC32 Fehler] winsock.h(486): E2344 'sockaddr' bereits deklariert [BCC32 Fehler] ws2def.h(222): E2146 Bezeichner für die Deklaration erforderlich [BCC32 Fehler] ws2def.h(391): E2184 Syntax-Fehler in enum und noch viel mehr..
Ich rufe den Thread in einen TTimer auf, vielleicht hilft die Info ja.
-
Eles schrieb:
Ich habe keine Komponente TThread
Freilich hast du. Es ist eben eine Klasse und keine Komponente.
CreateThread() sollte man übrigens in C- oder C++-Anwendungen nicht direkt verwenden, sondern stattdessen _beginthread() oder _beginthreadNT(). Der mit Abstand einfachste Weg ist allerdings TThread.
Hier ist ein Tutorial zur Einführung in Threads mit TThread. Schau dir das mal näher an.
-
Hallo
Und noch ergänzend :
Und nun kommt folgende Fehler:
Der Fehlergrund liegt jedenfalls nicht direkt in dem vom dir geposteten Codeauszug.
bis bald
akari
-
Ich habe jetzt kurz TThread überflogen und so angelegt:
Neue TThread erstellt mit den Namen Angel
Dort eine Funktion unter puplic mit "void ang()" hinzugefügt
in dieser "void ang()" den Quellcode eingefügt
In den Mainfenster folgenden Code in einen Timer:Timer1->Interval=Edit5->Text.ToInt(); Memo7->Lines->Add("Start Angeln-Class"); Angeln *Ang = new Angeln(false); Ang->Ang();
Hier die Angel Cpp
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // Wichtig: Methoden und Eigenschaften von Objekten in der VCL können nur // in Methoden verwendet werden, die mit 'Synchronize' aufgerufen wurden, z.B.: // // Synchronize(&UpdateCaption); // // wobei UpdateCaption so aussehen könnte: // // void __fastcall Angeln::UpdateCaption() // { // Form1->Caption = "Im Thread aktualisiert"; // } //--------------------------------------------------------------------------- __fastcall Angeln::Angeln(bool CreateSuspended) : TThread(CreateSuspended) { } //--------------------------------------------------------------------------- void __fastcall Angeln::Execute() { } //--------------------------------------------------------------------------- void Angeln::Ang(){ [...] Form1->Memo7->Lines->Add("Start Angel-1"); [...] Sleep(4000); Form1->Memo7->Lines->Add("Start Angel-2"); [...] Sleep(2000); Form1->Memo7->Lines->Add("Start Angel-3"); [...] }
und die angel.h
//--------------------------------------------------------------------------- #ifndef Unit2H #define Unit2H //--------------------------------------------------------------------------- #include <Classes.hpp> //--------------------------------------------------------------------------- class Angeln : public TThread { private: protected: void __fastcall Execute(); public: __fastcall Angeln(bool CreateSuspended); void Ang(); }; //--------------------------------------------------------------------------- #endif
Leider "friert" das Hauptfenster während der Sleeps trotzdem ein
-
Habe es über _beginthread() geregelt
vielen dank für den tipp
-
Eles schrieb:
Ich habe jetzt kurz TThread überflogen
Das hat keinen Wert.
Ich habe dir einen Link zu einem ausführlichen Tutorial gegeben. Du sollst es nicht kurz überfliegen, sondern durcharbeiten. Sonst lernst du es nie.
Hast du übrigens den Kommentar, den die IDE da in deine "Angeln"-Klasse eingefügt hat, gelesen und verinnerlicht?
Eles schrieb:
//--------------------------------------------------------------------------- // Wichtig: Methoden und Eigenschaften von Objekten in der VCL können nur // in Methoden verwendet werden, die mit 'Synchronize' aufgerufen wurden, z.B.: // // Synchronize(&UpdateCaption); // // wobei UpdateCaption so aussehen könnte: // // void __fastcall Angeln::UpdateCaption() // { // Form1->Caption = "Im Thread aktualisiert"; // } //---------------------------------------------------------------------------
Wenn du das nicht beachtest, wirst du kurz über lang Probleme bekommen - zufällige Abstürze, seltsames Programmverhalten oder andere Häßlichkeiten. Und in einem durch _beginthread() erstellten Thread korrekt mit dem Hauptformular zu kommunizieren, ist deutlich weniger trivial als in einem TThread.
nimm TThread, lies das Tutorial gründlich durch und mach es richtig.
-
Habe es mir jetzt mal richtig durchgelesen.
Es funktioniert jetzt super auch mit TThread.
Vielen dank für eure Hilfe.