«неверное преобразование из» с проблемой pthread_create - PullRequest
0 голосов
/ 20 июля 2011

Любой комментарий приветствуется за ошибку компиляции ниже. Хотя мой вопрос похож на другой поток: функция pthread из класса , я все еще не смог решить мою проблему. Я до сих пор не знаком с указателем, а программирую потоки на C & C ++.

Error

../src/Main.cpp: In function ‘int main(int, char**)’:
../src/Main.cpp:22: error: invalid conversion from ‘unsigned int* (*)(void*)’ to ‘void* (*)(void*)’
../src/Main.cpp:22: error:   initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
make: *** [src/Main.o] Error 1

main.cpp

#include <process.h>
#include "ThreadInstance.hpp"
#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char** argv)
{
    pthread_mutex_t mutex;
    int ht1;
    pthread_t threadId1;
    pthread_attr_t attr1;

    pthread_mutex_init(&mutex, NULL);
    pthread_attr_init(&attr1);
    pthread_attr_setdetachstate(&attr1, PTHREAD_CREATE_DETACHED);

    ht1 = pthread_create(&threadId1,
            &attr1,
            &ThreadInstance::ThreadEntryPoint,
            //(void *)readThread);
            NULL);

    unsigned long rc = 0;
    rc = pthread_join(ht1, NULL);

    return 0;
}

ThreadInstance.hpp

#ifndef _SCENE_CLASSIFY_THREAD_H
#define _SCENE_CLASSIFY_THREAD_H

#ifndef STDCALL
#define STDCALL __attribute__((stdcall))
#endif

using namespace std;

class ThreadInstance
{
    public:
        ThreadInstance();
        ThreadInstance(int camNum);

        void startUp();

        static unsigned STDCALL* ThreadEntryPoint(void* pThis)
        {
            //static unsigned __stdcall ThreadEntryPoint(void* pThis) {
            ThreadInstance *ptr = (ThreadInstance*) pThis;
            ptr->startUp();
            //return 1; // Returns error "invalid conversion from ‘int’ to ‘unsigned int*’" when the function is declared as pointer.
                            // Since returning either 1 or 0, 
                            // compile error still occurs. 
                            // So this return value should not be the cause.

            return 0; 
        }
        ~ThreadInstance();
};
#endif

Примечание: показана только необходимая часть

Ответы [ 2 ]

1 голос
/ 20 июля 2011

Ваш ThreadEntryPoint должен вернуть void*.

Ошибка указывает на ожидаемый тип и тип указателя функции, который вам необходимо использовать.

0 голосов
/ 20 июля 2011

Функция запуска возвращает void* и принимает void*. Ваш возвращается unsigned int*.

Измените метод, чтобы он возвращал указатель на void.

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