GTK+ widget frissítése

 ( nzmark | 2006. április 9., vasárnap - 18:59 )

Sziasztok!

Egy textview -be írok egy szöveget, majd elvégzek egy CPU -t igen komolyan terhelő műveletet. a gondom az, hogy nem frissíti a textviewet miután beleírok, csak később és ez zavaró. lehet valahogy kényszeríteni, hogy még a következő művelet előtt frissítse?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

while (gtk_events_pending())
gtk_main_iteration();

köszi!

lehetséges, hogy nem minden esetben váltja ki az általam elvárt hatást? a fönti példánál pl teljesen jól működik, viszont egy másiknál meg nem. van egy gomb ami lenyomásakor rsa kulcsot generál a program, ez 4096bites kulcsnál elég sok idő. gondoltam a gomb lenyomására kiteszek egy dialog ablakot, hogy lehessen tudni, hogy dolgozik. meg is csináltam, a dialog megjelenik, de a tartalma csak akkor, amikor az rsa kulcsot legenerálta. biztos bennem van a hiba és a tudatlanságomban, de ha egy utasítás, ami egy gtk_widget_show akkor ennek a hatása miért csak percekkel később jelenkezik? hiába rakom bárhova ezt a
while (gtk_events_pending())
gtk_main_iteration();
részt, nincs hatása. nem értem, hogy egy utasítás miért nem akkor váltja ki a hatását amikor lefut? hogyan tudnám mégis elérni azt, hogy a dialog tartalma is megjelenjen, amikor szeretném, sőt! amikor meg kellene, hogy jelenjen, nem pedig fél órával később, amikor kedve szottyan.

és hogyan lehet megcsinálni azt, hogy függetlenül mindentől, ha egy animált gif-et rakok ebbe a dialogba, akkor azt folyamatosan frissítse és megjelenítse? bár azt hiszem ez már túl nagy kérés lenne a GTK-tól :-)

"és hogyan lehet megcsinálni azt, hogy függetlenül mindentől, ha egy animált gif-et rakok ebbe a dialogba, akkor azt folyamatosan frissítse és megjelenítse? bár azt hiszem ez már túl nagy kérés lenne a GTK-tól :-)"

Nem hinném. :)

Nézd meg a gtk-demo proggit, ott találsz megvalósításokat forrásokkal mellékelve animált gif-re is.

nem az a bajom, hogy nem tudok animált gif-et megjeleníteni, hanem ha a cpu mással ügyködik, akkor nem frissíti a képernyőt, így a gif-et sem. nekem meg ez kéne. de megkeresem ezt a gtk-demo -t és megnézem.

A dologra két megoldás van. Az általános az, hogy csinálsz egy külön frissítő thread-et, ami nem csinál mást, mint a fent már leírt ciklust futtatgatja. Ezt lehet úgy, hogy az egész program alatt fut, de lehet úgy is, hogy csak a hosszabb számítási funkciók alatt indítod el.

A másik az, hogy minden számítási művelet közben időnként meghívod a fenti frissítést. Én ezt alkalmazom plldául akkor, amikor nem igazi számítás van, hanem pl. adatbázis műveletre várok. Amennyiben tényleg számolgatás van, akkor már nem minden esetben egyszerű közben frissítéseket hívogatni, főleg akkor, ha külső libben lévő rutint hívsz. Ilyenkor csak a thread marad. Attól sem kell egyébként megijedni, bár sokan megijednek, ezért merevedik le olyan sok program ilyenkor :)

A gtk_widget_show () akkor váltja ki a hatást, amikor lefut. Csak az a hatás, hogy beütemezi egy sorba az ablak kirakását. :) A sor feldolgozása pedig akkor történik meg, amikor a GTK megkapja a vezérlést. Amíg Te kulcsot generálsz, addig természetesen nem kapja meg.

A while (gtk_events_pending()) gtk_main_iteration(); természetesen föl kéne, hogy dolgozza... nem tudom, miért nem teszi. Közvetlenül a show() után írtad?

Egyébként nekem is voltak problémáim... konkrétan abban az esetben, ha dinamikusan raktam elemeket egy ablakra, majd beállítottam egy treeview-nak a kurzorpozícióját. Ezek után előfordult, hogy pár gombot nem rakott ki, még a main_iteration() után sem. Csak akkor, ha az adott gombok fölé mentem az egérrel. :) Ja, és ez gtkmm volt. Hasonló jelenséget tapasztaltam egy perl programnál is egyszer.

Esetleg gtk_widget_show_all a dialógus ablakra. A show egy widgetre vonatkozik. Ha az ablakra rakod és a labelnek nem adod meg akkor így helyes a működése ahogy leírtad.

köszi, ez mindenképp jól jön nekem.

Be is lehet szállni az írásba, mert mint látod, ritkán jutok érdemben a közelébe... igaz akkor nagyon. :)

Szia!

Beszállnék én, de elég basic a tudásom.

Erre a legkönnyebb hivatkozni... :(