2013-10-06 4 views
1

Я хочу создать новую тему в классе. Проблема в том, что мне нужно передать указатель на функцию, которая будет использоваться в новом потоке. Я не могу передать указатель на функцию. В принципе, это функция класса под капотом?Создать новую тему в классе (windows)

void foo (this); 

Тогда почему этот код отказывается компилировать?

class TimeClass 
{ 
private: 
    DWORD dwThreadId; 
    HANDLE hThread; 

    LPTHREAD_START_ROUTINE Timer(); 
public: 
    TimeClass(); 
}; 

TimeClass::TimeClass() 
{ 
    dwThreadId = CreateThread (NULL, 0, Timer, this, 0, &dwThreadId); 
} 

ответ

2

Сигнатура функции потока должна быть

DWORD WINAPI ThreadProc(LPVOID param); 

обыкновенный (т.е. нестатическая). Функция члена C++ не имеет соглашения о вызове WINAPI, поэтому ее нельзя использовать как функцию потока. Если вы заявляете функцию-член как статическую, то ее можно использовать как функцию потока:

static DWORD WINAPI ThreadProc(LPVOID param); 
+0

И поскольку 'this' передается' CreateThread() ', вы можете придать параметру' param' обратного вызова ' 'TimeClass * 'и использовать это для доступа к нестационарным элементам и методам. –

0

ThreadProc() прототип

DWORD WINAPI ThreadProc(
    _In_ LPVOID lpParameter 
); 

Таким образом, вы должны изменить Timer() декларацию как:

DWORD WINAPI Timer() 
2

функция класса под капотом, в основном это право?

void foo (this);

Как правило, нет. Это то, что решает компилятор, и могут быть всевозможные «не виртуальные трюки», встроенные линии и т. Д. Компилятору разрешено оптимизировать программу любым способом, который не изменяет поведение программы, и такой детали реализации не определены стандартом. Вот почему то, что вы пытаетесь сделать, это UB, и ваш лучший выбор здесь (ИМХО) будет что-то вроде:

extern "C" wrapper(void * p) 
{ 
    static_cast<TimeClass*>(p)->whatever(); 
} 
+0

Имеет ли extern C подразумевать stdcall? – usr

+0

Ой, нет, нет. Я забыл об этом WINAPI, и ScottMcP-MVP указывает на это правильно. Я больше сфокусировался на ложном предположении 'void foo (this)', которое все еще кажется более важным здесь :) – vines

Смежные вопросы