Thread wie geht das?
-
Also mit _beginthread(ex) kann ich irgendwie nicht um...
Gibts dazu hier im Forum keine Beispiele? Habe zumindest in der
Forensuche nichts gefunden.Ist es nun einfach nur unfein das auf die andere Art zu machen,
sofern man diese speziellen CRT nicht nutzt, oder auch sonst grundsätzlich ernsthaft bedenklich?Wie machens die Leute sonst hier im Forum?
Dank und Gruß
Thr
-
Es ist ernsthaft bedenklich, einen anderen als den eigenen Thread zu beenden. Du weißt nicht, welchen Code der andere Thread gerade ausführt und welche gemeinsam genutzten Objekte er manipuliert. Wenn du einen anderen Thread beendest, werden seine WaitHandles freigegeben und er hinterlässt unter Umständen ein Objekt, dass sich in einem inkosistenten Zustand befindet, was dann von anderen Threads so genutzt wird.
Es gibt keine Möglichkeit, dieses Problem zu verhindern, außer indem sich jeder Thread selbst beendet.
-
Jochen Kalmbach schrieb:
Du solltest aber den Thread nicht mit "CreateThread" sondern mit _beginthread(ex) erstellen! Oder Du stellst sicher, dass Du *keine* CRT Funktionen in denm Thread verwendest, dann kannst Du auch CreateThread verwenden.
Falls Du doch CRT-Funktionen verwenden solltest, entstehts sonst ein Speicherleck.
Oder Du beendest den Thread mittels _endthread(ex); dann passt es auch wieder...Wann entstehen Speicherlecks? Mit welchen CRT Funktionen entstehen die und wieso?

-
Kann mir bitte jemand ein Beispiel für beginthread geben?
Ich versuche damit verzweifelt ne Funktion aufzurufen...
-
Jochen Kalmbach schrieb:
CodeFinder schrieb:
TerminateThread
Diese Funktion sollte man nie aufrufen!
Siehe: Why you should never call Suspend/TerminateThread (Part I-III)
http://blog.kalmbachnet.de/?postid=6
http://blog.kalmbachnet.de/?postid=16
http://blog.kalmbachnet.de/?postid=17Ich weiß, das is dirty... alá "Prozessstruktur beenden" im TaskMgn...aber damit kann er ihn beenden

-
Thr schrieb:
Kann mir bitte jemand ein Beispiel für beginthread geben?
Ich versuche damit verzweifelt ne Funktion aufzurufen...Das ist doch wohl lachhaft. Benutz google oder koders.com um Beispiele zu finden. Alternativ könntest du auch programmieren lernen.
-
Ich dachte das Forum wäre auch Newbie-freundlich, darum habe ich das
hier gepostet. Entschuldigt, falls das hier nicht hingehört.
Ich habe erst mit C++ angefangen (vor knapp 2 Wochen).
Mir ist daher nicht so ganz klar wie ich beginthread verwenden soll.
Besonders, wenn ich eine einfache void-Funktion damit aufrufen will.Muss man aber wohl mit Pointern innerhalb der Funktion arbeiten oder?
-
Thr schrieb:
Kann mir bitte jemand ein Beispiel für beginthread geben?
Ich versuche damit verzweifelt ne Funktion aufzurufen...Jop, hier: http://msdn2.microsoft.com/en-us/library/kdzttdcb.aspx
-
Hallo Codefinder!
Ich kann damit also keine void-Funktion aufrufen richtig?
_beginthread(lesson5, 0, 1); //lesson5 ist = void lesson5(void)'_beginthread': Konvertierung des Parameters 1 von 'void (void)' in 'void (__cdecl *)(void *)' nicht möglich
Start address of a routine that begins execution of a new thread. For _beginthread, the calling convention is either __cdecl or __clrcall; for _beginthreadex, it is either __stdcall or __clrcall.
Alles noch etwas böhmische Dörfer

-
Der Prototyp müsste:
void __cdecl ThreadProc( void* pvData )sein.
EDIT: was vergessen ("__cdecl")
-
hmm, ändert nichts an der Meldung. Ich verstehs net.
-
siehe EDIT, sorry
-
Ich fasse mal zusammen:
Der Aufruf:
_beginthread(ThreadProc,0,1);Die Funktion die gerufen wird:
*.h
void __cdecl ThreadProc( void* pvData );*.cpp
void __cdecl ThreadProc( void* pvData ) { MessageBox(0,"angekommen!",0,0); }Und das läuft bei dir
Bei mir liegt wohl der Fehler im
ersten Parameter vom Aufruf oder?
-
Hab nit getestet...
Aber mal daran gedacht:
* This program requires the multithreaded library.
*
* If you are using the Visual C++ development environment, select the
* Multi-Threaded runtime library in the compiler Project Settings
* dialog box.und daran:
#include <process.h> /* _beginthread, _endthread */Edit: Mist doppeltpost, einen löschen bitte

-
Hab nit getestet...
Aber mal daran gedacht:
* This program requires the multithreaded library.
*
* If you are using the Visual C++ development environment, select the
* Multi-Threaded runtime library in the compiler Project Settings
* dialog box.und daran:
#include <process.h> /* _beginthread, _endthread */
-
Bei mir kommt die Fehlermeldung auch! Auch mit dem Include.
-
Zeig mal deinen Code.
-
Thr schrieb:
Ich dachte das Forum wäre auch Newbie-freundlich, darum habe ich das
hier gepostet. Entschuldigt, falls das hier nicht hingehört.
Ich habe erst mit C++ angefangen (vor knapp 2 Wochen).
Mit 2 Wochen C/C++-"Erfahrung" solltest du dich IMVHO nicht mit Threads rumschlagen...
Thr schrieb:
Muss man aber wohl mit Pointern innerhalb der Funktion arbeiten oder?
Jein.
Wenn du deinem Thread Daten übergeben willst kannst du das folgendermaßen bewerkstelligen:
#include <stdio.h> #include <process.h> #include <windows.h> struct thread_data_t { int a; int b; }; void __cdecl thread_proc( void *thread_data ) { printf( "Die zwei Parameter, die ich bekommen habe, lauten %i und %i.\n", ( ( thread_data_t* )thread_data )->a, ( ( thread_data_t* )thread_data )->b ); } int main( ) { thread_data_t thread_data; thread_data.a = 10; thread_data.b = 20; _beginthread( thread_proc, 0, &thread_data ); printf( "Ich wart' mal eine Sekunde...\n" ); Sleep( 1000 ); }Natürlich musst du dein Programm mit der Multithread-Version der CRT linken. Wie das geht verrät dir die Dokumentation deines Compilers.
Greetz, Swordfish
-
das thread_data objekt sollte man aber in den meisten fällen auf dem heap anlegen.
-
Kann in einigen Fällen Sinn machen. Argumente?
Greetz, Swordfish