Portál AbcLinuxu, 6. listopadu 2025 10:35
Glib::signal_timeout. Pak chci novou zpravu zobrazit v novem okne. A tady je problem, protoze timeout nepokracuje dokud mu funkce nevrati true, Gtk::Window::run ale zablokuje funkci dokud se okno nezavre. Takze prijde jen jedna zprava a pak se timeout zablokuje dokud neni okno zavreno. Chtel jsem to vyresit pres vlakna. Udelal jsem si funkci, ktera by jen zavolala Gtk::Window::run a tu bych pouzil v Glib::Thread. Funguje to hezky dokud ono okno nezavru, potom vypisi Xka: Xlib: unexpected async reply (sequence 0x4921)!a hlavni okno se prestane vykreslovat. Zjistil jsem, ze Xka nepodporuji vicevlaknove aplikace. Nevite nekdo jak mam kazdych x sekund v gtkmm provest nejakou funkci, ktera muze vytvorit nove okno a tim se zablokovat?
#include <gtkmm.h>
class Okno : public Gtk::Window {
public:
Okno() {
Glib::thread_init();
show();
Glib::signal_timeout().connect(sigc::mem_fun(*this, &Okno::on_timer), 5000);
}
bool on_timer () {
Glib::Thread::create(sigc::mem_fun(*this, &Okno::thread), false);
return true;
}
void thread() {
Gtk::Window w;
w.show();
Gtk::Main::run(w);
}
};
int main (int argc, char* argv[]) {
Gtk::Main kit(argc, argv);
Okno okno;
Gtk::Main::run(okno);
}Jak to vidim tak timhle zpusobem to asi nepujde, je to skoda, protoze nemuzu uzivatele nutit aby kazdou minutu zmackl tlacitko, pokud vytvorim okno v handlu na button_clicked, tak samozrejme vse funguje.
Asi se inspiruji xchatem a udelam jen jedno okno a v nem vice zalozek.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.