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 | 962 (830) | krneki0001 |
| » | [JAVA] zaustavitev niti (threadov)Oddelek: Programiranje | 3379 (3379) | morbo |
| » | [C++]Instanca razredaOddelek: Programiranje | 1682 (1573) | Senitel |
| » | [c++] standardni c++ in dogodki(events)Oddelek: Programiranje | 1882 (1707) | yeti |
| » | [c++] stil kodiranja, informativnoOddelek: Programiranje | 2114 (1930) | CCfly |