pthread_create错误:

时间:2013-02-26 06:55:04

标签: c++ linux qt qtembedded

我已经为自己的目的编写了这段代码。它将创建一个运行名为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*)’

我的代码中有什么问题。(请记住,我是这个领域的新手,这可能是一个非常愚蠢的错误:-))

1 个答案:

答案 0 :(得分:4)

线程函数必须以void 指针作为参数,而不是对象的引用。您可以稍后将其强制转换为正确的指针类型:

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

    app->exec();
}

您还将错误的线程标识符传递给pthread_join。你不应该在那里使用解除引用操作符。


我还建议你研究一下新的C ++ 11 threading functionality。使用std::thread,您只需执行以下操作:

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

    // Other code

    app_thread.join();
}