Итак, у меня есть приложение 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 ()?