2010-04-01 7 views
2

Qt를 사용하고 FTP/HTTP와 비슷한 일부 네트워크 유형 작업을 수행 할 클래스를 작성하려고합니다. 클래스는 많은 기계들과 연결해야하지만,이 과정에서 상대적인 반응을 보이기 위해 응용 프로그램 UI가 필요하므로 사용자는 작업을 취소하고 응용 프로그램을 종료 할 수 있습니다. 첫 번째 생각은 네트워크 스터디를위한 별도의 스레드이지만 내장 된 Qt FTP/HTTP (및 기타) 클래스는 스레드 사용을 피하고 대신 신호와 슬롯에 의존합니다. 그래서, 비슷한 일을하고 싶습니다 나는 이런 식으로 뭔가를 할 수 기대했다 :작업자 스레드 대신 Qt 신호/슬롯 사용

class Foo : public QObject 
{ 
    Q_OBJECT 
public: 
    void start(); 

signals: 
    void next(); 

private slots: 
    void nextJob(); 
}; 

void Foo::start() 
{ 
    ... 
    connect(this, SIGNAL(next()), this, SLOT(nextJob())); 
    emit next(); 
} 

void Foo::nextJob() 
{ 
    // Process next 'chunk' 

    if (workLeftToDo) 
    { 
    emit next(); 
    } 
} 


void Bar::StartOperation() 
{ 
    Foo* foo = new Foo; 
    foo->start(); 
} 

그러나이 작동하지 않고 모든 작업이 완료 될 때까지 UI가 정지. 나는 방출 신호가 실제로 슬롯을 즉시 호출하지는 않을 것이지만 어떻게 든 Qt가 큐에 대기시켜 메인 UI가 여전히 작동 할 수있게되기를 바랬다.

이 작업을하려면 무엇을해야합니까? Qt는 어떻게 하나의 스레드에서 오랜 작업을 수행하는 것처럼 보이는 많은 내장 클래스를 가지고 이것을 달성합니까?

+0

신호가 방출 될 때 슬롯이 대기하고 있는지 확인하려면 해당 슬롯을 연결 함수의 최종 매개 변수로 지정할 수 있습니다. –

답변

3

UI 스레드에서 길이 작업을 수행하는 중이면 UI가 정지됩니다. 이것을 피하는 한 가지 방법은 잠시 후 QCoreApplication::processEvents()으로 전화하는 것입니다.

그러나 결정하기 전에 무엇을하는지주의 깊게 알아야합니다. 이 함수를 호출하면 조작 중에 GUI 이벤트가 시작될 수 있습니다. 이 이벤트로 인해 더 많은 작업이 생성 될 수 있다면 이전 일을하면서 새로운 작업을 시작할 수 있습니다.

나는 작업자 스레드 접근법을 너무 빨리 무시하지 않을 것입니다. GUI에서 작업을 완전히 분리 할 수있는 이점이 있으므로 시작한 무언가가 끝날 것이라고 확신 할 수 있습니다.
또한 Windows에서 특히 GUI 루프에 간단한 지연이 발생할 수 있음을 고려해야합니다. 호스트가 다소 바쁘거나 메모리 스 래싱 상태에있는 경우 GUI 이벤트가 완료 될 때까지 몇 초가 걸릴 수 있으며 처리를 제어 할 수 있습니다. 이 같은 실행 방법

+0

난 그냥 QThread를 찾았는데 그것은 구현하기 쉽고 다른 어떤 QObject와 마찬가지로 신호/슬롯을 지원한다. 조언 해주셔서 감사합니다. – Rob

2

사용 QThread :

void run(){ exec(); } 

당신이 acutally UI를 동결하지 않고 "노력"을 할 수있는 또 다른 실행 루프를 제공 할 것입니다.

참고 : (사이먼이 그것에 대해 많은 말을하지 않음) 실제로 QThread 파생 Thread 클래스의 생성자의

moveToThread(this); 

을 추가하여 스레드의 실행 루프를 사용하십시오

확인
+0

http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/ – alisami

+0

내 의견을 남긴 후 artice가 게시 된 날짜까지 확인할 수 있습니다. 그 시점까지는 그것을 수행하는 방법에 대한 유일한 언급은 Qt 예제뿐 아니라 Qt 예제를 언급 한 Qt 의사였습니다. – drahnr

관련 문제