Forum » Programiranje » [c++] kazalec na funkcijo v razredu
[c++] kazalec na funkcijo v razredu
Tutankhamun ::
Ma ne gre mi pa pika.
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.
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:
Aha... pa ne pozabi v StdAfx.h dodati še process.h.
- Č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…
- spremenilo: BlueRunner ()
Tutankhamun ::
Hvala BlueRunner, bom uporabu _beginThreadex, pa če nau šlo se spet javm
AMD Phenom QUAD 9950 Black Edition, 8GB
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Iščem program c++Oddelek: Programiranje | 864 (732) | krneki0001 |
» | [JAVA] zaustavitev niti (threadov)Oddelek: Programiranje | 3187 (3187) | morbo |
» | [C++]Instanca razredaOddelek: Programiranje | 1554 (1445) | Senitel |
» | [c++] standardni c++ in dogodki(events)Oddelek: Programiranje | 1759 (1584) | yeti |
» | [c++] stil kodiranja, informativnoOddelek: Programiranje | 1943 (1759) | CCfly |