Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

1

28.01.2011, 17:06

sf::Thread Problem

Sehr geehrtes Forum,
ich habe schon wieder ein Problem, ich möchte gerne einen Thread benutzen, den der SFML.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Intro::drawIntro(void* UserData)
{
    // ....
}
void Intro::start()
{
    sf::Thread animation_thread(&Intro::drawIntro,NULL);

    animation_thread.Launch();
    
    // ...

    animation_thread.Terminate();
}


Fehlermeldung :

Quellcode

1
error: no matching function for call to 'sf::Thread::Thread(void (Intro::*)(void*), NULL)'|


Ich verstehe das aber nicht, in den Tutorials, wirds doch auch so erklärt, wo liegt denn der Fehler in der Methode start() ?

Danke
m.f.G.: Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

2

28.01.2011, 17:14

Sieht so aus als ob du deine

C-/C++-Quelltext

1
2
3
4
void Intro::drawIntro(void* UserData)
{
..
}


Methode, static deklarieren musst.

C-/C++-Quelltext

1
2
3
4
5
6
class Intro
{
...
static void drawIntro(void* UserData);
...
};



mfg Mark

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

3

28.01.2011, 17:24

Das ist aber nicht gerade sehr einfach bei mir, und zwar will ich dem in start mitteilen, dass wenn der Thread fertig ist, auch der Rest abgebrochen werden soll,
es sollen nämlich sachen gezeichnet werden, also die Intro in das Spiel, und dann noch einmal nebenbei die ganzen Mouseklicks zum überspringen gechekt werden, wenn ich die Methode jetzt als static deklariere, kann ich ja keine variablen, die nicht auch static sind ändern, und eine statische variable, ist ja statisch, also nicht änderbar, oder?
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

4

28.01.2011, 17:28

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Intro::start()
{
    sf::Thread animation_thread(&Intro::drawIntro,NULL);

    animation_thread.Launch();

    while(ready)
    {
        // ...
    }
    animation_thread.Terminate();
}
void Intro::drawIntro(void* UserData)
{
    ready = true;
    //...
    ready = false;
}


Soll ready jetzt static sein, dann ist sie für drawInto bekannt, für start aber nciht, und andernfalls ist es umgekehrt,
was soll ich machen?

M.f.G. Developer-X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

5

28.01.2011, 17:28

MAch die start Methode static und übergib ihr einfach ein objekt der klasse mit dem sie arbeiten kann ;)

EDIT:
Warum sollte ready nicht in start() bekannt sein, wenn sie statisch ist ?

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

6

28.01.2011, 17:34

Nagut, sagen wir, sie ist ihm nicht nicht bekannt, aber es kommt eine Meldung, dass sie falsch genutzt wird :

Quellcode

1
error: invalid use of member 'Intro::ready' in static member function|


PS: Wenn ich aber die start Methode static mache, dann heißt es von anderen seiten her, dass die Variablen falsch genutzt werden, usw....
Ein Teufelskreis ohne ende
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

7

28.01.2011, 17:34

EDIT: Ihr seid so schnell ;)

Zitat

wenn ich die Methode jetzt als static deklariere, kann ich ja keine variablen, die nicht auch static sind ändern, und eine statische variable, ist ja statisch, also nicht änderbar, oder?

Nein das stimmt so nicht. Eine Funktion oder Variable, die mit static deklariert wurde, ist nicht konstant, wie du sagst, denn dafür ist das Schlüsselwort const verantwortlich.
Static hat in verschiedenen Anwendungsformen verschiedene Bedeutungen. Näheres findest du beispielsweise hier: http://msdn.microsoft.com/en-us/library/…v=vs.80%29.aspx

In deinem Fall ist eine Funktion statisch. Damit existiert diese Funktion für alle Instanzen dieser Klasse. folglich heißt das, dass diese Funktion letztlich auch keinen Zugriff auf nicht-statische Member-Variablen hat. In sofern hast du Recht, dass es dir in deinem Fall wenig bringt und du nur statische Variablen verändern kannst.
Nun könnte man sagen, dass eine Lösung wäre, da letztlich die Intro-Klasse ja ohnehin nur ienmal existiert und somit nicht viel schiefgehen kann, einfahc alle Variablen static zu definieren. Dann könnte man sie auch verändern. Das wäre allerdings ganz schlechtes Design.

Ich denke, dass du in deinem Fall gar keine Threads brauchst. Du überprüfst doch auch im Spiel die Eingabe und zeichnest das Spiel. Das gleiche funktioniert doch auch im Intro, oder was hast du vor?

EDIT: Deine Fehlermeldung bezieht sich auf das ready, das du in der statischen Funktion nutzt und das darfst du, eben nicht.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Fred« (28.01.2011, 17:42)


Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

8

28.01.2011, 17:40

Fred, es ist nicht einfach in Worte zu fassen, bei Spielen geht das, bei der Intro eben nicht, aus dem einfachen Grund, dass ich einzelne Bilder, von irgendwelchen Mitwirkenden nach ein paar sekunden zeigen, also wie bei einer richtigen Intro, und da kann ich ja wohl schlecht sleep(5000) oder so machen, ich will außerdem auch mal threads benutzen, um ein bisschen erfahrung zu sammeln
versteht ihr?

Ich werde dann halt mal alles static machen,

m.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

28.01.2011, 17:41

Das meiste wurde schon gesagt. Von mir gibt es dazu noch eine kleine Checkliste:
1. brauchst du wirklich threads (die machen das Programm und vorallem das Debuggen sehr schnell sehr umständlich)?
2. soll es wirklich eine Klassenmethode sein?
3. muss dein Thread wirklich die Infos einer Klasse wissen?
Falls drei Mal "ja" die Antwort ist folgender "Kniff":


sf::Thread animation_thread(&Intro::drawIntro,this);

void Intro::drawIntro(void* UserData)
{
Intro* ptr = static_cast<Intro*>(UserData);
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

10

28.01.2011, 17:42

Och, ich mache das doch alles in einem abwasch, das mit static ist mir einfach zu hässlich,

m.f.G.: Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Werbeanzeige