2017-11-01 29 views
0

Wt C++ 프레임 워크를 사용하고 있으며 클래스 함수로 푸시 버튼을 연결해야합니다. 아래의 코드는 잘 작동하지만 동시에 다른 액션을 사용할 수 있도록 스레드의 doors_open_all 함수를 실행해야합니다. 라인을 따라boost :: bind with std :: thread (Wt C++에서)

Wt::WPushButton *open_doors_button = new Wt::WPushButton("open all"); 
container_box->addWidget(open_doors_button); 
open_doors_button->clicked().connect(boost::bind(&Servicemode::doors_open_all, this)); 

뭔가가 필요합니다 :

open_doors_button->clicked().connect(boost::threaded_bind(&Servicemode::doors_open_all, this)); 
+1

'Servicemode :: doors_open_all()'함수 내에서 새 스레드를 시작할 수 없습니까? – Galik

+0

분명히 그런 식으로 비 정적 멤버 함수의 사용을 허용하지 않습니다. – Levi

+1

'Servicemode :: doors_open_all()'안에는 필요한 경우 람다 함수를 제공하는 스레드를 실행하여 작업을 수행 할 수 있습니다. 그러나 실제로는 스레드에서 비 정적 멤버 함수를 실행할 수도 있습니다. – Galik

답변

0

나는 새 스레드에서 doors_open_all 기능을 실행하는 데 필요한 corrently 질문을 이해합니다.

boost::thread 생성자가 내부 사용 boost::bind 명시적일 필요는 없습니다.

그래서 open_doors_button->clicked().connect(boost:: thread(&Servicemode::doors_open_all, this));이 작업을 수행해야합니다. boost::threadboost::bind

버전 : open_doors_button->clicked().connect(boost::thread(boost::bind(&Servicemode::doors_open_all, this)));

편집 : 또한 너무이 purpouse에 대한 std::async를 사용하여 시도 할 수 있습니다.

+0

제안 주셔서 고마워하지만 boost :: thread (또한 bind)는 삭제 된 함수 오류를 제공합니다 : '오류 : 삭제 된 함수 사용'boost :: thread :: thread (const boost :: thread &) ' – Levi

0

Servicemode::doors_open_all()의 기능은 무엇입니까?

오랜 시간이 걸리는 것이 단지 모든 백엔드 일 뿐이므로 어떤 위젯도 생성, 삭제 또는 수정되지 않는다고 가정하면 Servicemode::doors_open_all() 안에 스레드를 생성하여 모든 백엔드 작업을 수행 할 수 있습니다. 삭제 및 수정, 그것의 UI를 업데이트해야하는 응용 프로그램을 알리기 위해, 당신의 WApplication과 기능의 그것에게 세션 ID를 전달 사용 WServer::post()

  1. 하고 만드는 모든 작업을 수행합니다 당신이 일을 끝낼 때 당신은 두 가지 가능성을 가지고 그 콜백에있는 위젯들.
  2. 잡고 WApplication의 업데이트 잠금

  3. : 업데이트 잠금이있을 때

    // Assuming that app is a Wt::WApplication* 
    Wt::WApplication::UpdateLock lock(app); // lock is released when it goes out of scope 
    

    , 당신이 가서 위젯 트리를 수정할 수 있습니다. 이 일을 할 때 어떤 경우

는, 당신은 또한이 두 가지를 할 필요가 :

  1. app->enableUpdates(true)를 호출하여 사전에 서버 푸시를 사용합니다. 스레드가 완료되면 app->enableUpdates(false)을 사용하여 서버 밀어 넣기를 다시 비활성화 할 수 있습니다.
  2. 위젯 트리를 수정 한 경우 클라이언트에 변경 사항을 푸시해야한다고 Wt에게 알립니다. app->triggerUpdate(). 얼마나 시간이 오래 걸리는 것은 UI 관련 인 경우 중량 당신이있을 경우에만, 즉 한 번에 하나의 스레드에서 WApplication하고 위젯을 수정하는 것이 가정하기 때문에

, 다음, 당신이 할 수있는 정도가 아니다 업데이트 잠금. WPushButton::clicked()과 같이 클라이언트에서 오는 이벤트를 처리 할 때 항상 업데이트 잠금이 자동으로 부여됩니다.

서버 푸시는 serverpush 예제에서 설명됩니다. Wt 소스 트리에서 examples/feature/serverpush 아래에 있습니다.