2013-02-26 3 views
0

나는이 목적을 위해이 코드를 작성했다. event_handler()라는 루틴을 실행하는 스레드를 생성한다. event_handler 루틴은 클래스 객체 인 QApplication의 인스턴스를 인수로 가져 와서 호출한다. exec() 메소드. 나는이 코드 조각을 구축하려고 할 때마다pthread_create error :

#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

Qt는 고유 한 스레드 기능 (QThread 찾기)이 있습니다. 그리고 당신은'void *'포인터를'event_handler'에 전달하고 그 안에 포인터를 캐스팅하는 것이 좋습니다. –

답변

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(); 
}