Forum: PC-Programmierung WinApi CreateThread


von Thorsten S. (whitenoise)


Lesenswert?

Hi,

wenn ich in der WinApi einen Thread abspalten möchte, dann würde ich 
dies mit CreatThread machen. Arbeite mit diesem Beispiel:

http://www.cs.rpi.edu/academics/courses/netprog/WindowsThreads.html

Ich habe dazu folgendes in meiner Api mit eingebaut:



DWORD WINAPI ThreadRoutine1(LPVOID lpArg)
{
    while(1)
    {
        main_prog ();
        //Sleep(50);
    }
  return NULL;
}


Beginn des Api Mains:

int APIENTRY WinMain(HINSTANCE hInstance,
           HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{

   HWND       hWnd;
   MSG        msg;
   WNDCLASSEX   wc;

    HANDLE hHandle1;
    DWORD ThreadId1=0;
   ....


dann mache ich irgentwann das:

    hHandle1 = CreateThread(NULL,0,ThreadRoutine1,0,0,&ThreadId1);



Kann es sein das Create Thread nicht zurück kommt wenn ich im Thread 
eine While Schleife habe, oder was mache ich falsch?

Gruß,
Thorsten

von Klaus W. (mfgkw)


Lesenswert?

wieso sollte das nicht zurückommen?
Und was macht main_prog()?

von Vlad T. (vlad_tepesch)


Lesenswert?

Mich wundert, das das kompiliert.
Meiner Meinung nach müssste es heißen:

    hHandle1 = CreateThread(NULL,0, &ThreadRoutine1,0,0,&ThreadId1);
man beachte den Adressoperator!

von Thorsten S. (whitenoise)


Lesenswert?

main_prog testet nur bis ab...kann man so sagen...wäre doch aber fast 
egal was main_prog macht oder? ausser es beeinfluss etwas grundlegendes, 
da es ja eh nie zurückkommt..

von Klaus W. (mfgkw)


Lesenswert?

@Vlad:
nee, das & vor Funktionsnamen kann weggelassen werden (seit ANSI-C).

von Klaus W. (mfgkw)


Lesenswert?

wie soll man das sagen, wenn du nur Fragmente zeigst?
Könnte, sollte, müsste...

von Thorsten S. (whitenoise)


Lesenswert?

ist überall so:

Beitrag "Thread in Klasse"

von Thorsten S. (whitenoise)


Lesenswert?


von Thorsten S. (whitenoise)


Lesenswert?

...sobald man es so macht, läuft es:

DWORD WINAPI ThreadRoutine1(LPVOID lpArg)
{
    while(1)
    {
        main_prog ();
        Sleep(1);
        //fprintf(stderr,"My argument is \n");

    }
  return NULL;
}

nur etwas langsam...

eigentlich sollte das aber nicht weiter stören...

ich versuche gerad diese Geschichte etws zu entwirren. Momentan wird 
alles sequenziell aufgerufen, nun will ich erstmal 2 Thread starten, die 
die Softimer und das eigentliche AVR main bedienen...

von Thorsten S. (whitenoise)


Lesenswert?


von Vlad T. (vlad_tepesch)


Lesenswert?

Klaus Wachtler schrieb:
> @Vlad:
> nee, das & vor Funktionsnamen kann weggelassen werden (seit ANSI-C).

Ok, das war mir nicht bewusst, bei mir steht da immer einer, finde ich 
semantisch auch sinnvoller.

Dann liegt der Fehler definitiv nicht in dem hier geposteten Code.

@TO:
hast du mal einen Breakpoint auf das CreateThread gesetzt und dich 
vergewissert, dass er wirklich nicht aus er Funktion zurückkehrt?


Edit:
hab grad mal mein Quellcode-Verzeicnis durchgegrept, ist doch bunt 
gemischt mit und ohne '&'  ;)

von Klaus W. (mfgkw)


Lesenswert?

BTW: entsprechend kann man beim Aufruf einer Funktion über
einen Zeiger das * verwenden oder weglassen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.