я написал этот кусок кода для моей собственной цели. он создаст поток, который выполняет подпрограмму с именем 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*)’
в чем проблема в моем коде (помните, что я новичок в этой области, это может быть очень глупой ошибкой :-))
Функция потока должна принять 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();
}
Других решений пока нет …