Portál AbcLinuxu, 14. května 2024 12:18


Dotaz: Vytvareni oken v urcitem intervalu - gtkmm

12.8.2006 12:04 H4wk | skóre: 9 | blog: H4wkuv_blog
Vytvareni oken v urcitem intervalu - gtkmm
Přečteno: 41×
Odpovědět | Admin
Ahoj, mam problem s mym programem v gtkmm. Je to client-server aplikace, kazdych x sekund se pripoji k serveru a stahne si zpravy. Toto delam pomoci 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?
Korespondenční Seminář z Programování - Pro každého středoškoláka, který to s programováním myslí vážně.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

12.8.2006 19:45 0
Rozbalit Rozbalit vše Re: Vytvareni oken v urcitem intervalu - gtkmm
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nebylo by nejlepsi odchytit signal pri zavirani toho okna a pri te prilezitosti ukoncit handler toho vstupu?
13.8.2006 13:25 H4wk | skóre: 9 | blog: H4wkuv_blog
Rozbalit Rozbalit vše Re: Vytvareni oken v urcitem intervalu - gtkmm
Nejsem si jisty, jak je to mysleno, zjednoduseny kod:
#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.
Korespondenční Seminář z Programování - Pro každého středoškoláka, který to s programováním myslí vážně.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.