» »

[c++] kazalec na funkcijo v razredu

[c++] kazalec na funkcijo v razredu

Tutankhamun ::

Ma ne gre mi pa pika. :8)

class razred
{
public:
        void start()
        {
	   m_tThread = CreateThread(NULL, 
                                    NULL,
                                    &razred::funkcija,	// tale vrstica me matra [:)]
				    NULL,
				    NULL,
				    &m_tID
				    ); 
        }

protected:
	int funkcija(void*)
        {
            ... // ena koda pac
            return 0;
        }

};


javla mi napako pri prevajanju
error C2664: 'CreateThread' : cannot convert parameter 3 from 'int (__thiscall razred::* )(void *)' to 'LPTHREAD_START_ROUTINE'

Kaj mi je storiti, da se bo prevedl? Mam pa VS2005.
AMD Phenom QUAD 9950 Black Edition, 8GB

Vesoljc ::

kaksen tip hoce funkcija CreateThread? kaksen tip ji ti dajes?
Abnormal behavior of abnormal brain makes me normal...

BlueRunner ::

Imam dva preloga:
- Če ne uporabljaš čisti Win32 API (brez MSVCRT knjižnice), potem se izogibaj direktnim klicom metode CreateThread. Uporabi raje _beginthreadex, ki opravi še nekaj poslovodenja okoli pravilne inicializacije TLS. Ker uporabljaš razrede, to (skoraj vedno) avtomatično pomeni uporabo CRT knjižnice, kar pomeni, da je CreateThread zate zagotovo napačna metoda.
- Povratne klice (callback functions) se v Win32 in C++ implementira po vzorcu statične metode, ki za parameter vzame kazalec na instanco razreda, če je instanca potrebna.

Za tvoj konkreten primer to pomeni, da bi koda izgledala nekako tako:

// Tole gre v Razred.h
#pragma once

class Razred
{
public:
    Razred(void);
    ~Razred(void);

public:
    void start(void);

private:
    static unsigned __stdcall threadStartFunction(void* object);

protected:
    int workerMethod();
};
--------------------------------------------------------------------------------------------------------------------------------------------------------
// Tole gre v Razred.cpp
#include "StdAfx.h"
#include "Razred.h"

Razred::Razred(void) { }

Razred::~Razred(void) { }

void Razred::start(void) {
    ::_beginthreadex(NULL, 0, Razred::threadStartFunction, this, 0, NULL);
}

unsigned __stdcall Razred::threadStartFunction(void* object) {
    return ((Razred*)object)->workerMethod();
}

int Razred::workerMethod() {
    return 0;
}


Aha... pa ne pozabi v StdAfx.h dodati še process.h.

Zgodovina sprememb…

Tutankhamun ::

Hvala BlueRunner, bom uporabu _beginThreadex, pa če nau šlo se spet javm
AMD Phenom QUAD 9950 Black Edition, 8GB


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Iščem program c++

Oddelek: Programiranje
6864 (732) krneki0001
»

[JAVA] zaustavitev niti (threadov)

Oddelek: Programiranje
223187 (3187) morbo
»

[C++]Instanca razreda

Oddelek: Programiranje
81554 (1445) Senitel
»

[c++] standardni c++ in dogodki(events)

Oddelek: Programiranje
121759 (1584) yeti
»

[c++] stil kodiranja, informativno

Oddelek: Programiranje
171943 (1759) CCfly

Več podobnih tem