[dev-cpp] Elementfunktion als thread starten ?



  • Hallo,

    ich habe da eine Elementfunktion die ich gerne in einem Tread starten würde.
    Hier erst mal bissl Code:

    Snake gamer[2] = {
    	Snake(100,100,1,D,F),
    	Snake(200,200,3,EINS,ZWEI)
    };
    
    boost::thread t1(&(gamer[0].bewege()));
    

    Compiler Fehler:

    F:\Dev-Cpp\main.cpp In function `int _mangled_main()': 
     481 F:\Dev-Cpp\main.cpp non-lvalue in unary `&' 
     F:\Dev-Cpp\Makefile.win [Build Error]  [main.o] Error 1
    

    😕

    Wie geht das den jetzt mit Elementfunktion und Threads oder hat einer nen guten Links zu einer Seite wo steht wie man Treads anwendet.



  • Also ich bin gerade dabei, ein wenig mit C/C++ zu experimentieren. Von Threads habe ich keine Ahnung. Aber ich könnte mir vorstellen, dass das eine parallele Verarbeitung von Code im selben Programm ist. Und dafür habe ich gerade ein lauffähiges Programm am Wickel:

    // sound a tugboat toot using a midi voice from the winmm.lib
    // in case of Dev C++ link with libwinmm.a via
    // Project>>Project Options>>Parameters>>Add Lib>>libwinmm.a
    // BCX generated C code painstakingly modified for Dev C++
    //
    // Sound(Frequency,Duration[,Volume,Voice,Tempo])
    // Volume = 0 to 127 (off to loudest)
    // Voice = 0 to 127 (Shanai = 111, Tuba = 58, Accordion = 21)
    // more midi voices:
    // Rock Organ = 18, Marimba = 12, Steel String Guitar = 25
    // Choir Aahs = 52, Alto Sax = 65, Bird Tweet = 123, Sitar = 104
    // FX 8 (sci-fi) = 103, FX 3 (crystal) = 98, Glockenspiel = 9
    //
    // a Dev-C++ tested Console Application by  vegaseat  21nov2004
    
    #include <cmath>
    #include <windows.h>
    #include <mmsystem.h>
    #include <stdio.h>
    
    //using namespace std;
    
    #define SNDQUE 10000
    
    typedef struct _soundtype
    {
            double  Freq;
            int     Dura;
            int     Vol;
            int     Voice;
            double  Tempo;
            int     sndTid;
    } soundtype, *LPSOUNDTYPE;
    
    static soundtype  SndPmtr[SNDQUE+1];
    static int        gTenter;
    static int        gTwait;
    static int        gTexit;
    static int        gTarray;
    static BOOL       gTsig;
    static HANDLE     gSThread = NULL;
    
    double  Round (double,int);
    double  Abs (double);
    int     Sound (float,int=0,int=127,int=0,float=1);
    // changed this from int PlaySnd(void) to:
    DWORD WINAPI PlaySnd (VOID);
    
    int main()
    {
            // Tugboat whistle sound 95 hertz, 2000ms, 127 = loud, 111 = Shanai
            // experiment with your own sounds, it's fun ...
            Sound(95,2000,127,111);  // 2 second blast
            Sound( 1,1000,  0,111);  // 1 second of silence
            Sound(95,2000,127,111);  // 2 second blast
            Sound( 1,1000,  0,111);  // 1 second of silence
            Sound(95,2000,127,111);  // 2 second blast
    
            // wait till que is empty
            while(Sound(0) != 0)
            {
                    printf ("sleep(500)\n");
                    Sleep(500);
            }
    
            return 0;
    }
    
    double Round (double n, int d)
    {
            return (floor((n)*pow(10.0,(d))+0.5)/pow(10.0,(d)));
    }
    
    double Abs (double a)
    {
            if (a < 0)  return -a;
            return  a;
    }
    
    int Sound (float Freq,int Dura,int Vol,int Voice,float Tempo)
    {
            DWORD  dwThreadId;
    
            if (Freq == 0 && Dura < 1) return gTenter-gTexit;
            // silence
            if (Freq == 0) Vol = 0;
            if (Dura < 5) Dura = 5;
            gTenter++;
            gTsig = FALSE;
            if (gTenter >= SNDQUE)
            {
                    gTarray = gTenter % SNDQUE+1;
            }
            else
            {
                    gTarray=gTenter;
            }
            SndPmtr[gTarray].Freq = Freq;
            SndPmtr[gTarray].Dura = Dura;
            SndPmtr[gTarray].Tempo = Tempo;
            SndPmtr[gTarray].Vol = Vol;
            SndPmtr[gTarray].Voice = Voice;
            SndPmtr[gTarray].sndTid = gTenter;
            if (gSThread == NULL && (Freq == Abs(Freq) || Freq == 0))
            {
                    // "PlaySnd" needs casting (void *)
                    gSThread = CreateThread(NULL,0,PlaySnd,(void *)"PlaySnd",0,&dwThreadId);
                    Sleep(1);
                    return 0;
            }
            if (Freq != Abs(Freq))
            {
                    if (Freq == -1)
                    {
                            Freq = 0;
                            SndPmtr[gTarray].Vol=0;
                    }
                    SndPmtr[gTarray].Freq=Abs(Freq);
                    gTsig=TRUE;
                    while(gSThread!=NULL)
                    {
                            Sleep(10);
                    }
                    gTexit = gTenter-1;
                    gTwait = gTenter-1;
                    gTsig = FALSE;
                    return PlaySnd();  // needs some kind of argument
            }
            return 0;
    }
    
    DWORD WINAPI PlaySnd (VOID)
    {
            soundtype  LocSndPar;
            int  lTarray;
    
            while(gTenter > gTexit && gTsig == FALSE)
            {
                    gTwait++;
                    if (gTwait >= SNDQUE)
                    lTarray = gTwait % SNDQUE+1;
                    else
                    lTarray = gTwait;
                    LocSndPar = SndPmtr[lTarray];
                    int Note = 0;
                    int Phrase = 0;
                    HMIDIOUT hMidi;
                    midiOutOpen(&hMidi,(UINT)-1,0,0,CALLBACK_NULL);
                    midiOutShortMsg(hMidi,(256*LocSndPar.Voice)+192);
                    // convert frequency to midi note
                    Note = (int)Round((log(LocSndPar.Freq)-log(440.0))/log(2.0)*12+69,0);
                    Phrase = (LocSndPar.Vol*256+Note)*256+144;
                    midiOutShortMsg(hMidi,Phrase);
                    printf ("sleep((int)(LocSndPar.Dura*(1/LocSndPar.Tempo+0.0001)))\n");
                    Sleep((int)(LocSndPar.Dura*(1/LocSndPar.Tempo+0.0001)));
                    Phrase = (LocSndPar.Vol*256+Note)*256+128;
                    midiOutShortMsg(hMidi,Phrase);
                    midiOutClose(hMidi);
                    gTexit++;
            }
            CloseHandle(gSThread);
            gSThread = NULL;
            return 0;
    }
    

    Wenn du das laufen lässt, wirst du sehen, dass die Testprints munter durcheinander ausgegeben werden. Ich hoffe, dass dir das hilft.



  • ---> Das hilf mir jetzt leider überhaupt nicht !



  • Naja, du mußt Funktionsobjekte haben damit boost::thread deinen Thread aufrufen kann. Konkret heißt das, du mußt den ()-Operator in deiner Klasse definieren. Z.B. so:

    class Snake {
    public:
          void operator() () {
               while(true) {
                // running
               };
          }
    
          // geht auch mit Parameter!
          void operator() (int a) {
          }
    };
    
    boost::thread t1(gamer[0]());
    
    // Oder mit Paramter aufrufen
    boost::thread t2(gamer[1](123));
    

    So würde dein Snake im Thread laufen und div. Aktionen durchführen können.

    Auf www.kharchi.de hab ich was über boost::thread geschrieben. Müsste ich mal demnächst etwas ausbauen die Infos.



  • Danke Artchi,
    deine Seite kenne ich natürlich bin ja auch dadurch zu den Threads gekommen 😃


Anmelden zum Antworten