Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » _beginthreat: wie mache ich das??

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
30.03.2005, 10:36 Uhr
RedEagle



Ich hab eine Funktion, die die Zeit anzeigt (in einer schleife):

C++:
void Time::ShowTime(void* arg);



Diese Funktion soll Parallel zu dem "normalen" Programm laufen, deshalt soll die nen eigenen Thread bekommen:

C++:
void Time::Activate()
{
_beginthread(ShowTime, 0, reinterpret_cast<void*>(1));
// _beginthread(Time::ShowTime, 0, reinterpret_cast<void*>(1)); //Gleiches Problem wie ohne Time::
}



Aber beim compilieren kommen 2 Fehler:

Fehler:

no matches converting function `ShowTime' to type `void
candidates are: void Time::ShowTime(void*)




Was hab ich falsch??
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.03.2005, 11:21 Uhr
ao

(Operator)


Funktionen, die an _beginthread übergeben werden können, müssen entweder static-Klassenmethoden oder globale Funktionen außerhalb jeder Klasse sein. Non-static Klassenmethoden gehen nicht.

Hintergrund: Thread-Routinen müssen "kontextlose" Einsprungpunkte sein. Der Kontext wird über *arglist hineingereicht. Nicht-statische Methoden sind aber nicht kontextlos, sondern an ihre Klasseninstanz gebunden.

Die anderen gebräuchlichen Thread-APIs (CreateThread oder AfxBeginThread) verhalten sich da genauso.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.03.2005, 11:47 Uhr
RedEagle




Also muss ShowTime außerhalb der klassen sein??
aber wie bekomme ich dann Variablen, die in der Klasse definiert sind, in die Funktion??
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.03.2005, 12:01 Uhr
Tommix



Hallo,
Zitat von RedEagle:

Also muss ShowTime außerhalb der klassen sein??
aber wie bekomme ich dann Variablen, die in der Klasse definiert sind, in die Funktion??

Indem Du als Parameter einen Zeiger auf die Klasseninstanz nimmst (also this).

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.03.2005, 13:00 Uhr
ao

(Operator)


Funktionierendes Beispiel:

C++:
#include "stdafx.h"
#include <iostream>
#include <windows.h>

class CWithThread
{
private:
    void ThreadProc (void);

public:
    CWithThread () : m_nCounter (0) {};

    static DWORD WINAPI ThreadStarter (LPVOID pvArg);

private:
    long m_nCounter;
};

DWORD WINAPI CWithThread::ThreadStarter (LPVOID pvArg)
{
    CWithThread * pThis = static_cast<CWithThread*> (pvArg);
    pThis->ThreadProc ();

    return 0;
}

void CWithThread::ThreadProc (void)
{
    while (1)
    {
        std::cout << m_nCounter++;
        ::Sleep (500);
    }
}


int main(int argc, char* argv[])
{

    CWithThread wt;

    HANDLE hThread = ::CreateThread ( NULL
                                    , 0
                                    , wt.ThreadStarter
                                    , &wt
                                    , 0
                                    , NULL
                                    );

    printf("Hello World!\n");

    getchar ();
    return 0;
}



Ich habs mit CreateThread gemacht und nicht mit _beginthread, weil ich mich damit besser auskenne. Ist aber im Prinzip dasselbe.

Mit Visual Studio 6: Neue Konsolen-Applikation, Typ "Hello World-Application" ohne MFC, und den obigen Quelltext in das CPP-File reinkopieren. Das Programm macht ein Konsolenfenster auf, schreibt einmal "Hello World!" und danach im Halbsekundentakt aufsteigende Zahlen.

Vorsicht: Der Thread wird nicht geregelt runtergefahren, das wäre die nächste Übung. Wenn du das Programm beendest (durch irgendeinen Tastendruck) kann es abstürzen. Starte es sicherheitshalber nur im VC-Debugger.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
31.03.2005, 09:54 Uhr
RedEagle



ich hab mal ne andere Idee gehabt, leider gibts da auich nen kleines Problem:
Ich möchte die verwendete Klasse einfach an die Funktion übergeben, dann kann ich ja auch auf die Variablen zugreifen. (zumindest auf die, die ich brauche)


C++:
int Activate(Time klasse);
void ShowTime(void* arg);

int Activate(Time klasse)
{
_beginthread(ShowTime, 0, reinterpret_cast<void*>klasse); //HIER IST EIN FEHLER
// hier den threat starten
}




Fehler:

parse error before `)' token



warum?? bzw geht das überhaupt??
--
MFG RedEagle

Dieser Post wurde am 31.03.2005 um 09:55 Uhr von RedEagle editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
31.03.2005, 09:58 Uhr
Oliver
S2-Pixelgeneral



C++:
_beginthread(ShowTime, 0, reinterpret_cast<void*>&klasse);



Wenn du in einen Pointer castetst, musst du schon die Adresse übergeben.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
31.03.2005, 10:18 Uhr
ao

(Operator)


... und das zu castende Argument muss in Klammern, wenn ich mich nicht irre, also:

C++:
_beginthread (ShowTime, 0, reinterpret_cast<void*>(&klasse));


Und warum nicht einfach so:

C++:
_beginthread (ShowTime, 0, (void *) &klasse);


Kann an dieser Stelle auch nix kaputtmachen, oder?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
31.03.2005, 10:48 Uhr
RedEagle



Ok, das Funktioniert jetzt

Wie kann ich jetzt auf die Benötigten Funktionen der Klasse zugreifen??


C++:
void ShowTime(void* arg)
{
int RTi_bgcolor   = arg.GetBGColor();
int RTi_textcolor = arg.GetTCColor();
//...




Fehler:

request for member `GetBGColor' in `arg', which is of
request for member `GetTCColor' in `arg', which is of


--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
31.03.2005, 11:16 Uhr
ao

(Operator)


Du musst aus dem void* wieder ein Time* machen:

C++:
void ShowTime (void * arg)
{
    Time * pTi = (Time *) arg;
    int RTi_bgcolor = pTi->GetBGColor ();    
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: