# [C] Threads erstellen?



## MCX (8. Januar 2008)

Hiho,

ich programmiere zur Zeit an einer Ampelsteuerung, und dabei müssen verschiedene Ampeln gleichzeitig geschaltet werden, heißt also, mehrere Funktionen müssen gleichzeitig gestartet werden. Da diese Funktionen das System pausieren, habe ich mir gedacht, dass die einzige Möglichkeit dafür Threads wären.

Jedoch finde ich zum Thema Threads in C nicht viel im Internet. Kann mir jemand erklären, wie ich solche festlege und benutze? Oder vllt. hat jemand einen Vorschlag, wie ich 2 Funktionen gleichzeitig starten kann, die jeweils das System pausieren müssen (über eine Sleep-Funktion).


THX
MCX


----------



## AdmiralX (8. Januar 2008)

hallo,

schau dir einfach mal diesen Artikel in der MSDN an
http://msdn2.microsoft.com/en-us/library/ms682453(VS.85).aspx

am ende der seite sind auch noch einige funktionen erwähnt die dir weiter helfen könnten.

gruß
AdmiralX


----------



## MCX (9. Januar 2008)

hmm danke erstma... wie immer typisch ist das ziemlich unübersichtlich und ich weiß anhand von msdn jetzt nicht genau, was ich davon nutze und wie und was net


----------



## AdmiralX (9. Januar 2008)

hast du dir das beispiel angesehen?
http://msdn2.microsoft.com/en-us/library/ms682516(VS.85).aspx

in dem beispiel ist ist es sehr gut zu sehen wie threads zu programmieren sind, es ist nicht so schwer wie es in der beschreibung aussieht.

was genau ist bei den thread unklar, das ganze thema zu erklären wäre um die uhrzeit etwas zu viel ^^


----------



## MCX (10. Januar 2008)

hmm mit dem alten VC++ 6.0 scheint das nicht zu funktionieren, denn es gibt dorrt keine "strsafe.h", und auch, wenn ich sie mir irgendwie besorge, läufts net. muss wohl mal 2005 testen, auch wenn da wiederum alte 6.0 funktionen teilweilse fehlen.


----------



## MCoder (10. Januar 2008)

Hallo,

das Erstellen eines Threads ist eigentlich nicht so schwierig:

```
#include <windows.h>
#include <process.h>
#include <stdio.h>

unsigned int _stdcall ThreadFunction(void *param);

int main()
{
    unsigned int nThreadAddress;
    int          param = 100;

    uintptr_t hThreadHandle = _beginthreadex( 0,
                                              0,
                                              ThreadFunction,
                                              &param,
                                              0,
                                              &nThreadAddress );

    WaitForSingleObject((HANDLE)hThreadHandle, INFINITE); // Wartet auf das Ende des Threads
    return 0;
}


unsigned int _stdcall ThreadFunction(void *param)
{
    int n = *(int *)param;
    
    for( int i = 0; i < n; i++ )
    {
        printf("%d\n", i);
    }

    return 0;
}
```
Die größeren Schwierigkeiten liegen darin, mehrere Threads zu synchronisieren. Falls du für die Ampelsteuerung mehrere Threads verwenden willst, sind diese vermutlich nicht unabhängig voneinander.

Gruß
MCoder


----------



## MCX (10. Januar 2008)

also das mit den threads is jetzt hobbyinteresse, denn für die die ampelsteuerung hab ich ne andere lösung gefunden...


----------



## MCX (13. Januar 2008)

also ich hab den code mal so kopiert, da kommen dann leider fehler.

error C2065: 'uintptr_t' : nichtdeklarierter Bezeichner
error C2065: 'hThreadHandle' : nichtdeklarierter Bezeichner
error C2065: '_beginthreadex' : nichtdeklarierter Bezeichner
error C2106: '=' : Linker Operand muss ein L-Wert sein


----------



## MCoder (14. Januar 2008)

Ja, du hast recht, der Code funktioniert nicht mit VC6. Also hier die Variante für VC6:

```
#include <windows.h>
#include <process.h>
#include <stdio.h>

DWORD WINAPI ThreadFunction(void *param);
 
int main()
{
    int param = 100;
 
    HANDLE hThreadHandle = CreateThread( 0,
                                         0,
                                         ThreadFunction,
                                         &param,
                                         0,
                                         0 );
 
    WaitForSingleObject(hThreadHandle, INFINITE); // Wartet auf das Ende des Threads
    return 0;
}
 
 
DWORD WINAPI ThreadFunction(void *param)
{
    int n = *(int *)param;
    
    for( int i = 0; i < n; i++ )
    {
        printf("%d\n", i);
    }
 
    return 0;
}
```
Gruß
MCoder


----------



## lkjwouvnskld (19. März 2008)

Hi, 

also ich war auch grad dabei einen Thread zu erstellen,
nur wenn ich wie du im oberen Beispiel beschrieben den Thread mit _beginthreadex erstellen will bekomme ich folgende Fehlermeldung:

Fehler	2	error C3867: "comport::CommThread": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&comport::CommThread", um einen Zeiger auf den Member zu erstellen.

weil ja der Funktion eigentlich einen Parameter übergeben wird. Aber im Beispiel bei MSDN wird das ja genauso gemacht.

Danke schoma im Vorraus


----------



## MCoder (19. März 2008)

Hallo,

was ist "comport::CommThread"? Zeige doch mal die Deklaration/Definition dazu und auch den Aufruf der "_beginthreadex" - Funktion. Da "CommThread" vermutlich eine Klassenmethode ist, kannst du sie nur als Threadfunktionen verwenden, wenn sie als "static" deklariert wird.

Gruß
MCoder


----------



## lkjwouvnskld (19. März 2008)

Mensch das ging aber schnell

Also die Def.:

class comport{
...
        uintptr_t			m_hThread;
	UINT _stdcall CommThread(void *pParam);
...
}

Aufruf:
...
	UINT m_ThreadAdress;
	comport pParam;
	if(!(m_hThread = _beginthreadex(0,0,CommThread,pParam,0,&m_ThreadAdress)));
...


----------



## lkjwouvnskld (19. März 2008)

Also ich hab die Deklaration auf Grund deines Hinweises wie folgt geändert 

	static UINT _stdcall CommThread(LPVOID pParam);


und jetzt scheint die Sache zu funktionieren


Dankeschön


----------

