2013-05-13 2 views
2

백그라운드에서 일부 작업을 처리하는 작업자 스레드 (pthread)가 있습니다. 그런 다음 화면에 결과를 표시하고 싶습니다. 그래서 UI 스레드 또는 메인 스레드에서 일부 코드를 실행해야합니다.UI 스레드에서 일부 코드를 실행하는 방법

iOS에서 dispatch_async(dispatch_get_main_queue(), ^{ /* My code */ });을 사용할 수 있습니다. Android에서는 View.queueEvent()을 사용할 수 있습니다. BB 10 네이티브 SDK를 사용하면 누구나 똑같은 것을 보여줄 수 있습니까?

감사합니다, 업데이트

솔루션.

마침내 2 가지 방법을 알아 냈습니다. 첫 번째 방법은 간단하지만 작동하지 않았습니다. 왜 그런지 모르겠습니다. 누구든지보고 싶으면 여기에 넣으십시오.

방법 1.

사용 bps_channel_exec 채널을 소유하고있는 스레드에서 일부 코드를 실행합니다. UI 스레드에서 채널을 만든 다음 활성 상태로 설정합니다. 그리고 작업자 스레드에서 bps_channel_get_active을 호출하여 활성 채널을 가져온 다음 bps_channel_exec을 사용하십시오. 그러나 그것은 나를 위해 일하지 않았고, 이유를 찾기를 계속합니다.

방법 2

이 방법은 더 복잡하지만, 생각에 간단하다. 작업자 스레드에서 이벤트를 UI 스레드로 푸시하십시오. UI 스레드 메인 루프에서 이벤트 종류를 처리 할 이벤트 처리기를 추가하십시오.

작업자 스레드에서 : bps_register_domain을 호출하여 도메인을 등록한 다음 도메인을 사용하여 bps_event_create을 호출하여 이벤트를 만듭니다. 그런 다음 bps_channel_push_event을 호출하여 UI 스레드의 활성 채널로 이벤트를 푸시합니다. UI 스레드 메인 루프에

:

for (;;) { 
    bps_event_t *event = NULL; 
    bps_get_event(&event, -1); 

    if (event) { 
     if (bps_event_get_domain(event) == the_domain_that_is_mentioned_above) { 
     // Handle the event 
     } 
    } 

    ... 
} 

좋은 샘플 here 있습니다.

답변

3

신호와 슬롯을 사용해야합니다. 객체로 보내진 이벤트는 이벤트 루프에서 실행되고 UI 객체로 전송 된 에르고 신호는 대기열에 넣어 UI 스레드에서 실행됩니다.

또한 Qt's thread API (that one 참조)을 사용하면 나머지 앱과 쉽게 통합 할 수 있습니다.

내 경험에 따르면, 작업자 스레드가 주로 단방향 (스레드 -> 나머지 응용 프로그램) 통신이 필요한 경우 QtConcurrent::run을 사용하십시오. 작업자가 복잡한 개체 인 경우 스레드를 생성하여 신호/슬롯에 대한 이벤트 루프)를 생성 한 다음 개체를 인스턴스화하고이를 작업자 스레드로 푸시합니다. 그러면 그들에게 보내진 신호는 새로운 스레드에서 대기열에 넣어 실행됩니다.

내가 그 조언을 어디에서 보았는지 기억이 나지 않지만, connect statementslast argument을 지정하면 대개 내가 잘못한 것입니다. 기본 동작은 실제로 사례의 99.9 %를 차지합니다. 신호가 UI 스레드를 차단하면 객체 - 계층/스레드 유사성의 항목이 잘못되었습니다. 그리고 그것을 잘못 이해하는 것은 매우 쉽습니다.당신은 QML에서 UI를 한 경우

, C++ SIGNAL to QML SLOT in Qt

+0

내가 그래서 QT 관련 API를 사용할 수 없습니다 캐스케이드를 사용하지 않는 참조하십시오. 마지막으로, 나는 해결책을 찾았다. – TienDC

+0

UI에 무엇을 사용합니까? – Jean

관련 문제