Problem mit _beginthread

C

colt4ever

Hallo,
ich würde gerne ein Spiel programmieren das mit Threads läuft.

ich habe eine Funktion
Code:
void setBallPos(int *ball_pos);

und möchte diese mit der Threadfunktion
Code:
int ball_pos = 0;
...
_beginthread(setBallPos(&ball_pos),0,NULL);
...

aufrufen.
Ich weiss, dass normalerweise die Funktion setBallPos einen void * Parameter bekommen muss, aber ich benötige diese int * Parameter (möchte nicht globale Variablen verwenden).

Wess jemand wie ich das hinbekomme, oder gibt es da eine bessere Threadfunktion als _beginthread()
 
moin


Hä?!

Was hat das mit der _beingthread zu tun wenn dein setBallPos einen PArameter bekommen muss?


mfg
umbrasaxum
 
Es kommt immer ein Fehler bei dem steht der Prototyp der Funktion von _beginthread(...), wenn ich es mit meiner set_Ball Funktion probiere.
Aber wenn ich meine Funktion auf void set_ball(void *) umändere funktioniert es.
 
moin


Hast du schon versucht, wenn du deine Funktion nach void set_ball(void *) geändert hast, int *ball_pos "rein zu casten"?


Hab hier noch was aus der MSDN, da wird mit einem Parameter anders umgegangen:
Code:
// crt_BEGTHRD.C
// compile with: /MT /D "_X86_" /c
#include <windows.h>
#include <process.h>    /* _beginthread, _endthread */
#include <stddef.h>
#include <stdlib.h>
#include <conio.h>

void Bounce( void *ch );
void CheckKey( void *dummy );

/* GetRandom returns a random integer between min and max. */
#define GetRandom( min, max ) ((rand() % (int)(((max) + 1) - (min))) + (min))

BOOL repeat = TRUE;     /* Global repeat flag and video variable */
HANDLE hStdOut;         /* Handle for console window */
CONSOLE_SCREEN_BUFFER_INFO csbi;    /* Console information structure */

int main()
{
    CHAR    ch = 'A';

    hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );

    /* Get display screen's text row and column information. */
   GetConsoleScreenBufferInfo( hStdOut, &csbi );

    /* Launch CheckKey thread to check for terminating keystroke. */
    _beginthread( CheckKey, 0, NULL );

    /* Loop until CheckKey terminates program. */
    while( repeat )
    {
        /* On first loops, launch character threads. */
        _beginthread( Bounce, 0, (void *) (ch++)  );

        /* Wait one second between loops. */
        Sleep( 1000L );
    }
}

/* CheckKey - Thread to wait for a keystroke, then clear repeat flag. */
void CheckKey( void *dummy )
{
    _getch();
    repeat = 0;    /* _endthread implied */

}

/* Bounce - Thread to create and and control a colored letter that moves
 * around on the screen.
 *
 * Params: ch - the letter to be moved
 */
void Bounce( void *ch )
{
    /* Generate letter and color attribute from thread argument. */
    char    blankcell = 0x20;
    char    blockcell = (char) ch;
    BOOL    first = TRUE;
   COORD   oldcoord, newcoord;
   DWORD   result;


    /* Seed random number generator and get initial location. */
    srand( _threadid );
    newcoord.X = GetRandom( 0, csbi.dwSize.X - 1 );
    newcoord.Y = GetRandom( 0, csbi.dwSize.Y - 1 );
    while( repeat )
    {
        /* Pause between loops. */
        Sleep( 100L );

        /* Blank out our old position on the screen, and draw new letter. */
        if( first )
            first = FALSE;
        else
         WriteConsoleOutputCharacter( hStdOut, &blankcell, 1, oldcoord, &result );
         WriteConsoleOutputCharacter( hStdOut, &blockcell, 1, newcoord, &result );

        /* Increment the coordinate for next placement of the block. */
        oldcoord.X = newcoord.X;
        oldcoord.Y = newcoord.Y;
        newcoord.X += GetRandom( -1, 1 );
        newcoord.Y += GetRandom( -1, 1 );

        /* Correct placement (and beep) if about to go off the screen. */
        if( newcoord.X < 0 )
            newcoord.X = 1;
        else if( newcoord.X == csbi.dwSize.X )
            newcoord.X = csbi.dwSize.X - 2;
        else if( newcoord.Y < 0 )
            newcoord.Y = 1;
        else if( newcoord.Y == csbi.dwSize.Y )
            newcoord.Y = csbi.dwSize.Y - 2;

        /* If not at a screen border, continue, otherwise beep. */
        else
            continue;
        Beep( ((char) ch - 'A') * 100, 175 );
    }
    /* _endthread given to terminate */
    _endthread();
}


mfg
umbrasaxum
 
Zuletzt bearbeitet:
Danke für dieses Beispiel. Ich hab es vollbracht.

Code:
_beginthread(set_ball,0,(void *)ball_pos);

und es geht.
 
ich habe so ziemlich genau dasselbe problem, nur das ich dem thread nicht nur einen, sondern mehrere parameter übergeben möchte!
mit einem übergabeparameter funktioniert dass ganz gut, aber mit mehreren bekomme ich das nicht hin!
könnt ihr mir da weiter helfen?
 
Hallo,

ich habe ebenfalls ein Problem mit _beginthread. Und zwar müsste ich an meine Funktion nachrichten_holen ein Formularfeld übergeben.
Befehl:
_beginthread(nachrichten_holen, 0, (void *)Alle_Nachrichten_textBox);

Gibt folgende Fehlermeldung:
error C2440: 'Typumwandlung': 'System::Windows::Forms::TextBox ^' kann nicht in 'void *' konvertiert werden

Was kann ich tun, bzw. wie muss ich mein Formularfeld konvertieren dass es klappt? Ziel ist es, in der Funktion in das Formularfeld etwas einzutragen.

Wäre für jede Hilfe sehr dankbar! Gruß Eva
 
Da wirst du sowieso Probleme bekommen. Verwaltete CLR-Komponenten dürfen nicht einfach so willkürlich im unverwalteten Code verwendet werden. Verwende verwaltete Threads über System::Threading und bedenke, dass du auf Controls (TextBox ist ein Control) nur in dem Thread zugreiffen kannst in dem sie erstellt wurde. Versuche ohne ein delegat und Invoke auf das Control zuzugreiffen werden eine Exception werfen.
 

Neue Beiträge

Zurück