C ++ Gtkmm кнопки onclick метод блокирует изменение текста - PullRequest
0 голосов
/ 12 декабря 2018

Итак, у меня есть приложение Gtkmm, которое должно прослушивать следующие запросы на подключение и изменять текст другого виджета Gtk status на «Listening ...», как только пользователь нажимает кнопку.

Метод onclick кнопок выглядит следующим образом:

status.set_text("Listening...");

if(nh.listen()<0){
      status.set_text("Not connected.");
      return;
}
status.set_text("Connected");

Где nh.listen() - это метод блокировки, который сначала привязывает сокет, затем прослушивает и принимает входящее соединение:

soc = socket(AF_INET, SOCK_STREAM, 0);


struct sockaddr_in local_addr;

memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = INADDR_ANY;
local_addr.sin_port = htons(6666);

if(bind(soc, (struct sockaddr*) &local_addr, sizeof(local_addr))<0){
    return -1;
}

if(::listen( soc , 1) == -1){
    return -1;
}

struct sockaddr_in client;
socklen_t size = sizeof(client);
int socket_accept = ::accept(soc, (struct sockaddr*) &client, &size);

soc = socket_accept;
return 0;

Поведение, которое я ожидаю, заключается в том, что текст виджета status изменяется до вызова nh.listen() и блокирования потока, но вместо этого поток просто блокируется.

Теперь я предполагаю, что метод onclick каким-то образом блокирует все другие вызовы / изменения виджетов Gtk, и мне интересно, как я смогу добиться желаемого поведения.

---- Правка ------

Учитывая комментарий @Ted Lyngmo, я перестроил код следующим образом:

 void frame::onclick_listen(){
     std::thread listening_thread(&frame::listening_thread_fun, this);
     status.set_text("Listening...");
     listening_thread.join();
  }




 void frame::listening_thread_fun(){
      if(nh.listen()<0){
            //Error   
            status.set_text("Not connected.");
            return;
      }
      status.set_text("Connected");
 }

Но на самом деле ничего не меняется.Поскольку соединение необходимо для продолжения, я вызвал поток join () сразу после изменения текста.Это означает, что метод onclick все еще находится в области видимости, когда я пытаюсь изменить текст и, таким образом, возможно, заблокировать его.Итак, что было бы лучшим методом для вызова join ()?

...