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

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

1

01.09.2007, 16:28

Thread findet FUnktion nicht warum ?

Hallo alle zusammen ,

also ich hab folgendes Problem .. habe einen Thread definiert in in diesem wird eine Funktion aufgerufen aber der Thread findet die Funktion nicht.
Das ganze sieht so aus :

Prototypen :

C-/C++-Quelltext

1
2
3
DWORD WINAPI ThreadProc(LPVOID voidPtr)
int pPlayer_Angriffsstaerkung_ranks(int rank,int counter);
void pPlayer_Angriffsstaerkung(sPlayer *wPlayer);


so wird der Thread aufgerufen :

C-/C++-Quelltext

1
2
3
4
                DWORD    threadId;
                HANDLE    threadHandle;

                threadHandle =CreateThread(NULL, 0,  ThreadProc,(void*)wPlayer, 0, &threadId);


so sieht der Thread aus :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
DWORD WINAPI ThreadProc(LPVOID voidPtr)
{

    sPlayer* wPlayer = (sPlayer*) voidPtr;

    int rank=pPlayer_Angriffsstaerkung_ranks();

    Sleep(60000);
    


}



So nun mekkert er aber daran :



Quellcode

1
 int rank=pPlayer_Angriffsstaerkung_ranks();


das er die FUnktion nicht findet also :

Funktion undecleard first use this function

Hoffe mir kann jemand helfen

MFG Toa

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

2

01.09.2007, 17:00

Fragt er zufällig auch noch nach dem Rückgabewert der ThreadProc?

Zu deinem Problem: die Funktion pPlayer_Angriffsstaerkung_ranks hat 2 Parameter! du übergibst aber garnix.

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

3

01.09.2007, 17:26

pPlayer_Angriffsstaerkung_ranks() wird vorher aufgerufen durch eine andere Funktion und dort wird dann ein Wert hinterlegt. zb rank1

nun soll im thread einfach diese funktion aufgerufen werden und in einer Variable rank gespeichert werden :

Also pPlayer_Angriffsstaerkung_ranks() wird aufgerufen und return rank1 an
rank

Quellcode

1
int rank=pPlayer_Angriffsstaerkung_ranks();


es soll lediglich im Thread pPlayer_Angriffsstaerkung_ranks() aufgerufen werden das durch ein Return der wert rank1 in rank gespeichert wird


Ich mache das ganze so umständlich weil ich nicht weiß wie ich dem thread zusätzlich noch einen Int wert übergeben kann :(

also dem hier DWORD WINAPI ThreadProk(LPVOID voidPtr);

wie baue ich dort ein int ein und wie rufe ich den thread dann auf .. ?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

01.09.2007, 20:49

z.b. Könntest du eine struktur übergeben, die den Zeiger und einen Int enthält. Oder du speicherst den Int in der Klasse sPlayer.

So gehts:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class BasicServer : public Netzwerk
{   
#ifdef _WIN32
    HANDLE ThreadID1, ThreadID2;
#else
    pthread_t thread1, thread2;
#endif
    static DWORD WINAPI empfangenClients(LPVOID);
    static DWORD WINAPI empfangenServer(LPVOID);


So kann man die Methode auch als Threadcallback nutzen. Spricht empfangenClients kann ganz normal auf alle Attribute zugreifen.

Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
DWORD BasicServer::empfangenServer(LPVOID p)
{ 
    BasicServer* server = static_cast<BasicServer*>(p);
    
    if(0 != listen(server->Socket, SOMAXCONN))
    {
        server->geterror();
        server->status = FAILED;
        return 0;
    }
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.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

02.09.2007, 12:33

BasicServer erbst öffentlich von Netzwerk? Irgendwie hört sich das nach sehr fragwürdigem Design an! :-]
@D13_Dreinig

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

02.09.2007, 13:01

Du mir ist es egal, wie das Design ist oder ob es goodstyle oder badstyle ist. Hauptsache man kommt damit klar(sprich verständlich) und es funktioniert. Außerdem geht es hier um die Threads. Man kann den Rest also getrost vergessen ;)
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.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

02.09.2007, 14:21

Zitat von »"Nox"«

Du mir ist es egal, wie das Design ist oder ob es goodstyle oder badstyle ist. Hauptsache man kommt damit klar(sprich verständlich) und es funktioniert. Außerdem geht es hier um die Threads. Man kann den Rest also getrost vergessen ;)


Genau hier gehts um Threads. Ist mir trotzdem aufgefallen. Ich finds aber traurig das du so eine Einstellung über Codedesign hast. Die wiederspricht der OOP Idee und ich finde ein gutes Codedesign macht einen guten Entwickler aus. Naja...
@D13_Dreinig

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

8

02.09.2007, 21:32

mh... back to topic , würde gern wissen wie ich dem DWORD WINAPI ThreadProc(LPVOID voidPtr) thread einen int wert übergeben kann ? hoffe mir kann jemand helfen .. dann wäre mein ganzes problem gelöst und ich müsste inerhalbs des threads keine extra funktion aufrufen

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

02.09.2007, 21:56

@Toa ja, wie oben erwähnt. Entweder ist dein int Bestandteil der Klasse sPlayer oder du machst folgendes:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
struct ThreadParam
{
    sPlayer* wPlayer;
    int Rank;

    ThreadParam(sPlayer* p, int r) : wPlayer(p), Rank(r) {}
};

ThreadParam* p = new ThreadParam(wPlayer, rank);
CreateThread(NULL, 0,  ThreadProc,(void*)p, 0, &threadId);


Zu beachten ist, dass ThreadParam natürlich nach Gebrauch deallociert werden muss. Dies sollte dann im Thread passieren.

Nur noch ein allg. Hinweis:
Versuch möglichst wenig mit Threads zu arbeiten, weil das kann ganz hässliche Fehler geben. Z.B. beim Zugriff auf wPlayer muss sichergestellt sein, dass die Instanz noch existiert und dass sich die Zugriff nicht gegenseitig reinpfuschen. Threads sind im Grundprinzip echt easy, aber der Teufel steckt da im Detail ;)
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.

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

10

03.09.2007, 13:43

Danke erst mal , nur seltsam ist es das der Thread keine FUnktionen findet

ich habe eine normale Funktion im Thread aufgerufen :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DWORD WINAPI ThreadProk(LPVOID voidPtr)  // Thread 

{
    sPlayer* wPlayer = (sPlayer*) voidPtr;

    
    clean_bonus();

}

void cCreature::clean_bonus() // FUnktion 

{
     m_CursorCon(40, 15);
     cout <<"          ";
}

 void clean_bonus(); // Prototyp


Und der Fehler :

Quellcode

1
Clean_bonus undecleard ... 


ABer warum ???

Werbeanzeige