Ошибка pthread_create:

я написал этот кусок кода для моей собственной цели. он создаст поток, который выполняет подпрограмму с именем event_handler (). подпрограмма event_handler примет экземпляр объекта класса QApplication в качестве аргумента и вызовет его метод exec ().

#include <pthread.h>void event_handler(void * &obj)
{
QApplication* app = reinterpret_cast<QApplication*>(&obj);
app.exec();
}

int main(int argc, char **argv)
{
pthread_t p1;

QApplication a(argc, argv);

pthread_create(&p1, NULL, &event_handler,(void *) &a);

//do some computation which will be performed by main thread

pthread_join(*p1,NULL);}

Но всякий раз, когда я пытаюсь построить этот кусок кода, я получаю эту ошибку

main.cpp:10: error: request for member ‘exec’ in ‘app’, which is of non-class type ‘QApplication*’
main.cpp:34: error: invalid conversion from ‘void (*)(void*&)’ to ‘void* (*)(void*)’
main.cpp:34: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’

в чем проблема в моем коде (помните, что я новичок в этой области, это может быть очень глупой ошибкой :-))

0

Решение

Функция потока должна принять void указатель в качестве аргумента, а не ссылки на объект. Позже вы можете типизировать это к правильному типу указателя:

void event_handler(void* pointer)
{
QApplication* app = reinterpret_cast<QApplication*>(pointer);

app->exec();
}

Вы также неправильно передаете идентификатор потока pthread_join, Вы не должны использовать оператор разыменования там.


Я также рекомендую вам заглянуть в новый C ++ 11 функциональность потоков. С std::thread Вы можете просто сделать:

int main()
{
QApplication app;
std::thread app_thread([&app]() { app.exec(); });

// Other code

app_thread.join();
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]