0

私は自分の目的のためにこのコードを書きました。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*)’

私のコードの問題は何ですか(私はこの分野の初心者であることを覚えておいてください、それは非常にばかげた間違いかもしれません:-))

4

1 に答える 1

4

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();
}
于 2013-02-26T06:58:27.623 に答える