2017-11-10 13 views
0

편집 버튼을 클릭 한 후 unclickable 창을 함수 호출하는 WPushButton 클릭 : 어떻게 하나 동결중량 C++는

button->clicked(boost::bind(&Service::burn, this)); 

을 화면 (또는 모든 버튼)은 그런 식으로 기능을 실행하는 동안 아무 것도 클릭 할 수 없다는 것입니다 (꽤 오랜 시간 실행됩니다). 현재 Service :: burn() 함수가 실행될 때 Service :: burn() 함수가 완료된 후 대기열에있는 다른 버튼을 클릭하여 실행할 수 있습니다.

동결 후 모든 버튼/화면을 복원해야합니다.

솔루션 :

Wt::WPushButton* spec_button; 

void testclass::test_only() 
{ 
    spec_button = new Wt::WPushButton("slow func"); 

    auto some_long_func = [&](){ 
     cout << "#######start \n"; 
     std::this_thread::sleep_for(std::chrono::seconds(1)); 
     cout << "#######end \n"; 
     spec_button->setDisabled(false); 
    }; 
    content()->addWidget(spec_button); 
    spec_button->clicked().connect(spec_button, &WPushButton::disable); 
    spec_button->clicked().connect(boost::bind<void>(some_long_func)); 
} 

답변

1

이 작동합니다 : 또한 기능이있다 그래서

button->clicked(button, &WPushButton::disable); 
button->clicked(boost::bind(&Service::burn, this)); 

는, 첫 번째 핸들러를 사용하여 UI를 해제 한 다음 두 번째 하나를 사용하여 무거운 긴 과정을 시작 .

두 개의 처리기를 한 번 호출하면 UI 변경 내용이 해당 호출이 완료 될 때까지 브라우저에 전파되지 않기 때문에 작동하지 않습니다.

+0

감사합니다 그것은 아무튼 호출 및 WPushButton :: 후 및 서비스 :: 화상 통화를 가능하게하지만 일 그것을 가능하게하는 것처럼 보이고 장애인이 머무를 수 있습니까? – Levi

+0

'Service :: burn'은 단일 스레드 내에서 실행됩니까? 그 안에'WPushButton :: Enable'을 호출합니까? – hank

+0

예, 단일 스레드 내에서 실행됩니다. 함수와 외부 모두에서 WPushButton :: enable을 호출 해 보았습니다.하지만 아무런 효과가 없습니다. – Levi

0

이벤트 처리가 완료 될 때까지는 Wit에서 브라우저로 위젯 트리 수정을 보내지 않으므로 some_long_func가 완료 될 때까지 효과 pf 단추 비활성화가 표시되지 않습니다.

이 문제를 해결하는 방법 중 하나는 버튼을 비활성화 한 후 some_long_func를 호출하기 전에 wApp-> processEvents()를 호출하는 것입니다. 이렇게하면 위젯 트리의 중간 업데이트가 즉시 브라우저로 전송됩니다. 버튼은 핸들러 따라서 (신호 투수의 실행 순서를 보장하기 위해 하나 개의 함수로)과 같이 할 수 있습니다) (클릭 :

{ 
    spec_button->disable(); 
    wApp->processEvents(); 
    some_long_func(); 
}