Threads mit C starten und beenden? Hilfe

DrBrain

Grünschnabel
Hallo zusammen !:suspekt:


wollte mal Threading in C mal ausprobieren jedoch komme ich nicht weiter !
das Programm wird compiliert und gestartet jedoch will der Thread irgendwie nicht starten! woran kann das liegen ?

:-) wer kann mir die Parameter vom _beginthread(x,x,x) detailierter erklären ?

Entwicklungsumgebung Visual Studio 2005

// Multithreading.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include "stdafx.h"
#include <process.h>
#include <conio.h>



int check =0;
int zaehler=0;

void counter(void *dummy )
{
int zaehler=0;
while(1)
{
zaehler+=1;
if(check==1)
{
break;
}
}

_endthread();
}

int _tmain(int argc, _TCHAR* argv[])
{



_beginthread(counter(void), 0, NULL);

printf("Bitte geben Sie die 1 ein um den Thread zu stoppen\n");
scanf("%i",&check);
fflush(stdin);
printf("Schleife durchlief = %i x ",zaehler);
getch();
return 0;
}
 
Hi und Willkommen im Forum!

1: Im Main beim scanf solltest du lieber %d nehmen (%i stammt meines Wissens noch aus der 16bit-Zeit, funktioniert vielleicht nicht in jedem Fall korrekt)
Ebenso beim printf

2: Die Parameter vom beginthread: a: Ein Funktionspointer ala "void x(void *)" - Zumindest der
Prototyp ist Korrekt
Dein Fehler liegt darin, dass hier nur der NAME der Funktion angegeben werden darf,
ohne Klammern, void oder sonst etwas
b: Denn Sinn des zweiten Parameters hab ich selber vergessen :(
Hab bis jetzt nie was anderes als 0 gebraucht :-)
c: Der dritte ist ein beliebiger Pointer, der im Thread dann als Variable -
bei dir heisst sie dummy - zur Verfügung steht
Wenn man das nicht braucht, übergibt man einfach NULL, so wie du

Noch ein paar kleine Sachen:
Statt zaehler+=1 kannst du auch zaehler++ schreiben - ist unter Umständen schneller, aber hier
egal
Und das _endthread ist - zumindest hier - nicht nötig, das geht von allein.


! Mir ist noch ein arger Fehler aufgefallen: Thread, erste Zeile:
Schreib da nur zaehler=0; und lass das int weg - sonst haben Thread und Main zwei verschiedene Zählervariablen, die miteinander nichts zu tun haben (und eben auch die Werte stimmen nicht überein)!

Hoffe, dass ich dir damit helfen konnte, bei weiteren Fragen meld dich einfach wieder :)

Gruß
 
zuerst einmal vielen Dank für die schnelle Antwort ! ;)

du hattest Recht es lag an der Variable int zaehler=0 weil ich den doppelt deklariert habe, einmal global und lokal in der Funktion.
Es funktioniert jetzt reibungslos der Thread lässt sich durch die Eingabe des Benutzer beenden und zeigt die gezählten Schleifendurchgänge an.

Gruß DrBrain


// Multithreading.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include "stdafx.h"
#include <process.h>
#include <conio.h>






int check =0;
int zaehler=0;

void counter(void *dummy )
{

while(1)
{
zaehler+=1;
if(check==1)
{
break;
}
}

_endthread();
}

int _tmain(int argc, _TCHAR* argv[])
{



_beginthread(counter, 0, NULL);

printf("Bitte geben Sie die 1 ein um den Thread zu stoppen\n");
scanf("%i",&check);
fflush(stdin);
printf("Thread hat in der Schleife %i x gezaehlt",zaehler);
getch();
return 0;
}
 
Hallo ich bins nochmal !

eine ganze kleine Frage habe ich noch :-) !
könntest du mir ein konkretes Beispiel mit den 3. Parameter als Pointer geben !
du meintest man kann es in der Funktion als Variable benutzen ?
ich hab mal ein Pointer übergeben jedoch bringt der Compiler einen Fehler.


Gruß DrBrain
 
ich hab auch keinen Pointer übergeben, wollte nur ein konkretes Beispiel von dir haben :-) in dem du mein Code veränderst !

thx. im voraus

Gruß DrBrain
 
ich hab mal ein Pointer übergeben jedoch bringt der Compiler einen Fehler.
ich hab auch keinen Pointer übergeben, wollte nur ein konkretes Beispiel von dir haben in dem du mein Code veränderst !
Gruß DrBrain
...aha
:suspekt:

was ist das Problem dabei? So wie es scheint, kennst dich mit Pointern schon aus, und die Erklärung, wo er zum übergeben ist, ist glaub ich eindeutig?

zb
C++:
int asd=123;
_beginthread(counter, 0, &asd);

Und im Thread, den du ja mit
void counter(void *dummy )
begonnen hast, kannst du jetzt über dummy drauf zugreifen-
*dummy ergibt also wieder 123 und da drüber kannst du auch den Wert
der int asd im main (oder sonst wo) verändern
 
Zurück