Класс C ++: объект, который создает поток + указатель на функцию = нарушение прав доступа - PullRequest
0 голосов
/ 20 сентября 2011

Я очень удивлен странным исключением, которое я получил.

class Threads { 
    public:
        Threads() {}
        ~Threads() {}
        void StartThread(int (*p)()); //pointer to a function 
    private: 
        HANDLE hThread; 
        DWORD dwThreadID; 
    }; 

Метод StartThread должен получить указатель на мою функцию (которая будет выполняться в другом потоке).
Эта функция проста.(как вы можете видеть, он находится вне класса Threads):

int MyThread() 
{
return 0; 
}

И это метод создания потока:

inline void Threads::StartThread(int (*p)()) 
{
    hThread = CreateThread(NULL, 
            0, 
            (LPTHREAD_START_ROUTINE)(*p)(), 
            NULL,  
            0, 
            &dwThreadID); 

   if (hThread == NULL) 
        {
            return;
        }
}

Здесь компилятор получает ошибку: не может преобразовать параметр 3 изот int до LPTHREAD_START_ROUTINE.Вот почему я сделал кастинг.

В основной функции я создаю объект типа Threads и пытаюсь вызвать метод StartThread.В качестве параметра я отправляю указатель на функцию MyThread.

Threads *thread1; 
thread1 = new Threads(); 
thread1->StartThread(MyThread);

Я думал, что MyThread должен начинаться в другом потоке.Но функция MyTread всегда запускается в Main Thread !!!И только после того, как MyThread заканчивается, запускается другой поток, и затем я получаю это исключение: необработанное исключение в 0x00000000 в ThreadClass.exe: 0xC0000005: нарушение доступа.

Мне нужен умный совет!

Ответы [ 2 ]

2 голосов
/ 20 сентября 2011

Соглашение о вызовах неверно:

LPTHREAD_START_ROUTINE - это метод __stdcall, а не метод __cdecl, см. Документацию здесь: http://msdn.microsoft.com/en-us/library/aa964928.aspx.

0 голосов
/ 20 сентября 2011

Похоже, что вы на самом деле вызываете функцию в этой строке ...

(LPTHREAD_START_ROUTINE)(*p)()

... и она возвращает int, который вы используете.Это просто не может работать.Как насчет:

(LPTHREAD_START_ROUTINE)p 

... вместо?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...