2014-07-17 5 views
0

나는 threadpools로 "엉망이되어"이상한 예외를 발견했습니다. 그래서 저는 당신에게 물어볼 것입니다.이 물체를 올바르게 사용하고 있습니까? 아니면 그냥 버그 또는 가짜 경고라고 생각합니까? 여기 있습니다. 나는 QThreadPool을 사용하여 기본적인 예제를 구현했다. (이것은 문서에있는 것과 거의 동일하다 : http://qt-project.org/doc/qt-4.8/thread-basics.html#example-1-using-the-thread-pool).QThreadPool 이상한 예외

#include <QCoreApplication> 
#include <QTimer> 
#include <QRunnable> 
#include <QThreadPool> 
#include <QDebug> 
class Work : public QRunnable 
{ 
public: 
    void run() 
    { 
     qDebug() << "Hello from thread " << QThread::currentThread(); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication app(argc, argv); 
    Work work; 
    work.setAutoDelete(false); 
    QThreadPool *threadPool = QThreadPool::globalInstance(); 
    threadPool->start(&work); 
    qDebug() << "hello from GUI thread " << QThread::currentThread(); 
    threadPool->waitForDone(); 
    QTimer::singleShot(3000, &app, SLOT(quit())); 
    return app.exec(); 
} 

상태 표시 줄에 "실행 중"및 "디버거 완료"와 같은 메시지가 표시되는 디버거를 시작한 경우 그것은 나를 알려줍니다 :

Exception at 0x75f6812f, code: 0x406d1388: Startup complete, flags 0x0 (first chance) in KERNELBASE!RaiseException 

올바른 것을 쓰고 멈추지 않기 때문에 프로그램이 작동하지만 그 메시지는 저에게 이상합니다.

내가 잘못 했나요?

고맙습니다.

+0

Qt 4.8.6 및 5.3.1에서 예제를 시도해 보았습니다. 또한 4.8.6에서 예외가 발생했습니다 (5.3.1은 정상적으로 작동 중입니다). 그러나 지난 몇 년 동안 QT 제작자와 함께 개발을 해본 결과 때때로 이러한 종류의 이상한 예외가 발생했으며 왜 그런지 알지 못했습니다. (하지만 내 응용 프로그램에서는 아무 것도 깨지 못했습니다) – TWE

+0

' QThreadPool' 이벤트 루프가 시작된 후? – Nazar554

+0

이벤트 루프에서 스레드 풀을 사용하면 동일하게 동작합니다. "문제"는 ... Microsoft입니다. 그들은이 2 단계 예외 처리를 발명했으며, 예외가 발생할 때마다 "첫 번째 예외"가 발생합니다. 그것이 제대로 처리 되더라도. 그래서, 쿠바가 말했듯이 걱정하지 않아도됩니다.) @TWE : 두 개의 다른 디버거 (5.3.1의 경우 mv (msvc) 및 5.3.1의 mingw (gdb))를 사용하기 때문에 다르게 작동합니다. – frarugi87

답변

1

첫 번째 예외입니다. 그렇지 않으면 응용 프로그램이 손상되었을 것이므로 코드에 의해 분명히 잡히고 처리됩니다. 그래서 문제가되지 않습니다.

+0

잘 알고 있습니다. 나는이 "첫 번째 예외 예외"물건을 몰랐다. 이 "라인"은 코드가 올바르게 처리 될지라도 예외가 발생할 때마다 작성됩니다. 그래서 .. 고마워요! – frarugi87