Multithreading - aber wie?



  • Abend Leute ...

    Stehe wieder mal vor einem Problem welches ich einfach nicht verstehe. Es geht um ein simples Programm, welches mir bei ausführung die Public IP an meine Email Adresse sendet. Nur darum geht es mir nicht.

    Mein Problem besteht darin, dass ich beim Starten des Programms einen BUTTON drücke, wobei anschließend eine Sounddatei abgespielt werden soll. An sich kein Problem, nur wird die Programmausführung dabei ja unterbrochen.

    Also habe ich mir überlegt - dass ganze mit einem neuen Thread zu lösen.

    Mein Ansatz ist wie folgt:

    char sounddatei			   [] = "Wolf.wav";
    ...
    ...
    DWORD WINAPI sound(void *sounddatei);
    ...
    ...
    ...
    DWORD WINAPI sound(void *sounddatei)
    {
    PlaySound(TEXT("Wolf.wav"), NULL, SND_FILENAME);
    return 0;
    }
    ...
    ...
    

    Das ganze versuche ich innerhalb eines Formevents in einen Thread umzuwandeln ...

    HANDLE hThreadHandle = CreateThread( 
    										 0,
                                             0,
                                             &IPSender::sound,
                                             &sounddatei,
                                             0,
                                             0 );
    

    Als fehlermeldung erhalte ich ständig:

    Error	2	error C2664: 'CreateThread' : cannot convert parameter 3 from 'DWORD (__stdcall *)(void *)' to 'LPTHREAD_START_ROUTINE´
    

    Was mache ich hier falsch?



  • shaun1981 schrieb:

    Was mache ich hier falsch?

    Im falschen Forum posten...



  • ...da hab ich mich wohl verklickt ... sorry



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • unsigned __stdcall thread1(void* param)
    {
    	// ..
    	return 0;
    }
    
    // ...
    
    _beginthreadex(0, 0, thread1, 0, 0, 0);
    


  • Du solltest dir mal den letzen Parameter von Playsound (SND_ASYNC) anschauen, also ich mach das immer so

    void Play_SoundFile(char *filename){
    
    	PlaySound(filename, NULL, SND_ASYNC | SND_FILENAME | SND_NODEFAULT);
    }
    


  • Danke ... das wars.



  • Es hat sich leider noch ein Problem aufgetan:

    Um das oben ganannte Problem zu lösen habe ich eine Headerdatei "SOUNDS.h" erstellt und darin die Thread Funktion Sound wie folgt definiert:

    #pragma once
    #include "stdafx.h"
    
    /*** Sound abspielen ***/
    unsigned int __clrcall sound(void *sounddatei)
    		{
    			PlaySound(TEXT("C:\\Users\\Jens\\Desktop\\Downloads\\C++ lernen\\Sounds\\ping.wav"), NULL, SND_FILENAME);
    
    			return 0;
    		}
    

    Aufgerufen wird diese Funktion als Event einer Form::

    _beginthreadex(0, 0, sound, 0, 0, 0);
    

    Bis hierhin klappt das alles. Nun wurde mir gesagt, dass man keine Funktionen in Headerdateien definieren solle. Also versuchte ich diese Funktion in die Form1.h zu integrieren - so wie es eigentlich hätte sein sollen.

    Nur wie stelle ich das an? Versuche ich diese Funktion in die Klasse Form1 zu integrieren - erhalte ich wieder folgenden Fehler:

    error C3867: 'IPSender::Form1::sound': function call missing argument list; use '&IPSender::Form1::sound' to create a pointer to member
    

    Der Prototyp der Funktion lautet immer noch:

    unsigned int __clrcall sound(void *sounddatei);
    

    Hat das was mit dem __clrcall zu tun? Leider werde ich aus der Hilfe nicht wirklich schlau...



  • oje.



  • wie ich diese Kommentare hasse ... Chaos pur?



  • Was hat die an meiner fertigen Funktion, die auch noch lauffähig ist nicht gepasst? Naja wie auch immer so gehtz:

    headerdatei.h

    void Play_SoundFile(char *filename);
    

    eine_c_datei.c

    void Play_SoundFile(char *filename){
    
        PlaySound(filename, NULL, SND_ASYNC | SND_FILENAME | SND_NODEFAULT);
    }
    

    Diese Headerdatei in jede *.c Datei includieren, die die Soundfunktion benötigt. Ich empfehle dir mal dein Grundlagenwissen aufzupolieren. Lad dir halt mal irgendwelche Sourcecodes aus dem Netz und schau dir an wie andere das machen.



  • Du hast ja recht. Aufpolieren wäre hier aber schwierig - ich bin mitten drin, beim Lernen. Mache das aus Spaß und habe eben nicht all zu viel Vorwissen. Versuche mich aber an dem ein oder anderen Projekt, da ich denke, dass der Lerneffekt hier viel größer ist.

    In der Schule etc. macht man ja nichts anderes. Fragen sollte hierbei schon erlaubt sein ...


Anmelden zum Antworten