Mattias Gaertner ha scritto:
On Sun, 16 Dec 2007 13:29:18 +0100
Damien Gerard <[EMAIL PROTECTED]> wrote:

On Dec 16, 2007, at 12:58 AM, Giuliano Colla wrote:

Damien Gerard ha scritto:
On Dec 15, 2007, at 1:05 PM, Giuliano Colla wrote:

Calling Application.ProcessMessages under Linux/gtk2 freezes the application. (Linux-gtk2-fpc2.2.0)

Stepping through with debugger shows that it goes in an endless loop. Under gtk1 and qt works properly.

Is it a known problem? I didn't find any reference in Mantis.

Please provide a sample to test. It works fine with me (Ubuntu
7.10/ gtk2/fpc 2.2.0 and lastest rev for lazarus).

In a trivial case it works for me too. But in the real app, which works fine both with gtk1 and qt, the problem arises. The application is not so small, and requires the installation of an extra package to run. I'll try to create a more manageable test sample, which creates similar conditions.
Regards,

I use it in a closed source project and there are many of .ProcessMessages (grrr of Delphi habits ^^). And it works fine.
An infinite loop would have been reported from my users I think.

But there may be a special case. It is not impossible.

It depends on where you start Application.ProcessMessages. Not all
events are reentrant. Some stacktraces would help.


Here's a Stacktrace, a second one is attached (obtained stopping execution faster than in this case, where it's been running for several seconds).

#0 cairo_path_destroy at :0

#1 cairo_path_destroy at :0

#2 cairo_path_destroy at :0

#3 cairo_matrix_rotate at :0

#4 cairo_path_destroy at :0

#5 cairo_font_options_create at :0

#6 cairo_stroke_preserve at :0

#7 cairo_stroke at :0

#8 clearlooks_draw_button at :0

#9 clearlooks_style_register_type at :0

#10 gtk_paint_box at :0

#11 TGTKTHEMESERVICES__DRAWELEMENT(-1211166688, {ELEMENT = TEBUTTON, PART = 1, 
STATE = 1}, {LEFT = 0, TOP = 0, RIGHT = 49, BOTTOM = 41, TOPLEFT = {X = 0, Y = 
0}, BOTTOMRIGHT = {X = 49, Y = 41}}, (PRECT) 0x0, (TGTKTHEMESERVICES) 
0xb7f883a0) at gtkthemes.pas:374

#12 TCUSTOMSPEEDBUTTON__PAINTBACKGROUND({LEFT = 0, TOP = 0, RIGHT = 49, BOTTOM 
= 41, TOPLEFT = {X = 0, Y = 0}, BOTTOMRIGHT = {X = 49, Y = 41}}, 
(TCUSTOMSPEEDBUTTON) 0xb7b29020) at speedbutton.inc:629

#13 TCUSTOMSPEEDBUTTON__PAINT((TCUSTOMSPEEDBUTTON) 0xb7b29020) at 
speedbutton.inc:518

#14 TGRAPHICCONTROL__WMPAINT({MSG = 1056, DC = -1211166688, PAINTSTRUCT = 0x0, 
RESULT = 0}, (TGRAPHICCONTROL) 0xb7b29020) at graphiccontrol.inc:64

#15 SYSTEM_TOBJECT_$__DISPATCH$formal at :0

#16 TGRAPHICCONTROL__DESTROY((POINTER) 0xbfd31cec, (TGRAPHICCONTROL) 
0xb7b29020) at graphiccontrol.inc:46

#17 TCONTROL__PERFORM(1056, -1211166688, 0, (TCONTROL) 0xb7b29020) at 
control.inc:1015

#18 TWINCONTROL__PAINTCONTROLS(-1211166688, (TCONTROL) 0x0, (TWINCONTROL) 
0xb7b46930) at wincontrol.inc:4294

#19 TWINCONTROL__PAINTHANDLER({MSG = 1056, DC = -1211166688, PAINTSTRUCT = 
0xb7f84160, RESULT = 0}, (TWINCONTROL) 0xb7b46930) at wincontrol.inc:4233

#20 TWINCONTROL__WMPAINT({MSG = 1056, DC = -1211166688, PAINTSTRUCT = 
0xb7f84160, RESULT = 0}, (TWINCONTROL) 0xb7b46930) at wincontrol.inc:5976

#21 SYSTEM_TOBJECT_$__DISPATCH$formal at :0

#22 TWINCONTROL__WMKILLFOCUS({MSG = 1056, FOCUSEDWND = -1211166688, UNUSED = 
-1208467104, RESULT = 0}, (TWINCONTROL) 0xb7b46930) at wincontrol.inc:5936

#23 TWINCONTROL__WNDPROC({MSG = 1056, WPARAM = -1211166688, LPARAM = 
-1208467104, RESULT = 0, WPARAMLO = 4128, WPARAMHI = 47055, LPARAMLO = 16736, 
LPARAMHI = 47096, RESULTLO = 0, RESULTHI = 0}, (TWINCONTROL) 0xb7b46930) at 
wincontrol.inc:4700

#24 DELIVERMESSAGE((POINTER) 0xb7b46930, void) at gtkproc.inc:3594

#25 DELIVERGTKPAINTMESSAGE((POINTER) 0xb7b46930, (PGTKWIDGET) 0xa0f1a88, 
(PGDKRECTANGLE) 0xa0e7734, true, true) at gtkcallback.inc:104

#26 GTKEXPOSEEVENTAFTER((PGTKWIDGET) 0xa0f1a88, (PGDKEVENTEXPOSE) 0xa0e7728, 
(POINTER) 0xb7b46930) at gtkcallback.inc:566

#27 gtk_marshal_BOOLEAN__VOID at :0

#28 g_closure_invoke at :0

#29 g_signal_override_class_closure at :0

#30 g_signal_emit_valist at :0

#31 g_signal_emit at :0

#32 gtk_widget_get_default_style at :0

#33 gtk_container_propagate_expose at :0

#34 gtk_container_propagate_expose at :0

#35 gtk_button_box_set_child_size at :0

#36 gtk_container_forall at :0

#37 gtk_container_forall at :0

#38 gtk_event_box_new at :0

#39 gtk_marshal_BOOLEAN__VOID at :0

#40 g_value_set_static_boxed at :0

#41 g_closure_invoke at :0

#42 g_signal_override_class_closure at :0

#43 g_signal_emit_valist at :0

#44 g_signal_emit at :0

#45 gtk_widget_get_default_style at :0

#46 gtk_container_propagate_expose at :0

#47 gtk_container_propagate_expose at :0

#48 gtk_font_selection_new at :0

#49 gtk_container_forall at :0

#50 gtk_container_forall at :0

#51 gtk_frame_new at :0

#52 gtk_marshal_BOOLEAN__VOID at :0

#53 g_value_set_static_boxed at :0

#54 g_closure_invoke at :0

#55 g_signal_override_class_closure at :0

#56 g_signal_emit_valist at :0

#57 g_signal_emit at :0

#58 gtk_widget_get_default_style at :0

#59 gtk_container_propagate_expose at :0

#60 gtk_container_propagate_expose at :0

#61 gtk_layout_get_type at :0

#62 gtk_container_forall at :0

#63 gtk_container_forall at :0

#64 gtk_layout_get_type at :0

#65 gtk_marshal_BOOLEAN__VOID at :0

#66 g_value_set_static_boxed at :0

#67 g_closure_invoke at :0

#68 g_signal_override_class_closure at :0

#69 g_signal_emit_valist at :0

#70 g_signal_emit at :0

#71 gtk_widget_get_default_style at :0

#72 gtk_main_do_event at :0

#73 gdk_window_is_viewable at :0

#74 gdk_window_process_all_updates at :0

#75 gdk_window_process_all_updates at :0

#76 g_list_remove_link at :0

#77 g_main_context_dispatch at :0

#78 g_main_context_check at :0

#79 g_main_context_iteration at :0

#80 gtk_main_iteration_do at :0

#81 TGTKWIDGETSET__APPPROCESSMESSAGES((TGTKWIDGETSET) 0xb7d2c020) at 
gtkwidgetset.inc:1314

#82 TAPPLICATION__PROCESSMESSAGES((TAPPLICATION) 0xb7f57020) at 
application.inc:280

#83 WAITANSWER at Uinterf.pas:90

#84 MASK_BOX(0) at Uinterf.pas:102

#85 TFORM1__SPEEDBUTTON1CLICK((^TOBJECT) 0xb7b46c80, (TFORM1) 0xb7fb8650) at 
UTBox.pas:191

#86 TCONTROL__CLICK((TCONTROL) 0xb7b46c80) at control.inc:2043

#87 TCUSTOMSPEEDBUTTON__CLICK((TCUSTOMSPEEDBUTTON) 0xb7b46c80) at 
speedbutton.inc:114

#88 TCUSTOMSPEEDBUTTON__WMLBUTTONUP({MSG = 514, KEYS = 1, XPOS = 28, YPOS = 14, 
POS = {X = 28, Y = 14}, DUMMY = 917532, RESULT = 0}, (TCUSTOMSPEEDBUTTON) 
0xb7b46c80) at speedbutton.inc:794

#89 SYSTEM_TOBJECT_$__DISPATCH$formal at :0

#90 TCUSTOMSPEEDBUTTON__WMLBUTTONDBLCLK({MSG = 514, KEYS = 1, XPOS = 28, YPOS = 
14, POS = {X = 28, Y = 14}, DUMMY = 917532, RESULT = 0}, (TCUSTOMSPEEDBUTTON) 
0xb7b46c80) at speedbutton.inc:745

#91 TCONTROL__PERFORM(514, 1, 917532, (TCONTROL) 0xb7b46c80) at control.inc:1015

#92 TWINCONTROL__ISCONTROLMOUSEMSG({MSG = 514, KEYS = 1, XPOS = 51, YPOS = 53, 
POS = {X = 51, Y = 53}, DUMMY = 3473459, RESULT = 0}, (TWINCONTROL) 0xb7b46930) 
at wincontrol.inc:4138

#93 TWINCONTROL__WNDPROC({MSG = 514, WPARAM = 1, LPARAM = 3473459, RESULT = 0, 
WPARAMLO = 1, WPARAMHI = 0, LPARAMLO = 51, LPARAMHI = 53, RESULTLO = 0, 
RESULTHI = 0}, (TWINCONTROL) 0xb7b46930) at wincontrol.inc:4681

#94 DELIVERMESSAGE((POINTER) 0xb7b46930, void) at gtkproc.inc:3594

#95 DELIVERMOUSEUPMESSAGE((PGTKWIDGET) 0xa0e7778, (PGDKEVENTBUTTON) 0xa0e7688, 
(^TWINCONTROL) 0xb7b46930) at gtkcallback.inc:1724

#96 GTKMOUSEBTNRELEASE((PGTKWIDGET) 0xa0e7778, (PGDKEVENTBUTTON) 0xa0e7688, 
(POINTER) 0xb7b46930) at gtkcallback.inc:1780

#97 gtk_marshal_BOOLEAN__VOID at :0

#98 g_closure_invoke at :0

#99 g_signal_override_class_closure at :0

#100 g_signal_emit_valist at :0

#101 g_signal_emit at :0

#102 gtk_widget_get_default_style at :0

#103 gtk_propagate_event at :0

#104 gtk_main_do_event at :0

#105 gdk_add_client_message_filter at :0

#106 g_main_context_dispatch at :0

#107 g_main_context_check at :0

#108 g_main_context_iteration at :0

#109 gtk_main_iteration_do at :0

#110 TGTKWIDGETSET__APPPROCESSMESSAGES((TGTKWIDGETSET) 0xb7d2c020) at 
gtkwidgetset.inc:1314

#111 TAPPLICATION__HANDLEMESSAGE((TAPPLICATION) 0xb7f57020) at 
application.inc:943

#112 RUNMESSAGE((POINTER) 0xbfd34550) at application.inc:1057

#113 TAPPLICATION__RUNLOOP((TAPPLICATION) 0xb7f57020) at application.inc:1067

#114 TWIDGETSET__APPRUN((TAPPLICATIONMAINLOOP) 0x80807d0 
<TAPPLICATION__RUNLOOP>, (TWIDGETSET) 0xb7d2c020) at interfacebase.inc:49

#115 TAPPLICATION__RUN((TAPPLICATION) 0xb7f57020) at application.inc:1046

#116 main at tbox.lpr:26


I hope that it helps.
The event which triggers the sequence is the Speed Button click (around line 80 in both traces), which activates the procedure WaitAnswer.
The procedure WaitAnswer has just to lines:
Application.ProcessMessages, to make sure that the display is updated before the subsequent line which is a GotAnswer.WaitFor. With Gtk2 It never reaches the WaitFor.

Thanks,

Giuliano


#0 memcpy at :0
#1 _int_realloc at :0
#2 realloc at :0
#3 g_realloc at :0
#4 gdk_region_rectangle at :0
#5 gdk_region_rectangle at :0
#6 gdk_region_subtract at :0
#7 GDK_REGION_SUBTRACT((PGDKREGION) 0x8ed7480, (PGDKREGION) 0x8f1c858) at 
gtkproc.inc:204
#8 TGTKWIDGETSET__COMBINERGN(-1282936544, -1282935968, -1282935680, 4, 
(TGTKWIDGETSET) 0xb7c3f020) at gtkwinapi.inc:2133
#9 TWIDGETSET__EXTSELECTCLIPRGN(-1212137440, -1282935680, 4, (TWIDGETSET) 
0xb7c3f020) at intfbasewinapi.inc:783
#10 TGTKWIDGETSET__EXTSELECTCLIPRGN(-1212137440, -1282935680, 4, 
(TGTKWIDGETSET) 0xb7c3f020) at gtkwinapi.inc:3938
#11 TWIDGETSET__EXCLUDECLIPRECT(-1212137440, 23, 399, 72, 440, (TWIDGETSET) 
0xb7c3f020) at intfbasewinapi.inc:761
#12 TGTKWIDGETSET__EXCLUDECLIPRECT(-1212137440, 23, 399, 72, 440, 
(TGTKWIDGETSET) 0xb7c3f020) at gtkwinapi.inc:3860
#13 EXCLUDECLIPRECT(-1212137440, 23, 399, 72, 440) at winapi.inc:253
#14 TWINCONTROL__PAINTHANDLER({MSG = 1056, DC = -1212137440, PAINTSTRUCT = 
0xb7e97160, RESULT = 0}, (TWINCONTROL) 0xb7a59930) at wincontrol.inc:4222
#15 TWINCONTROL__WMPAINT({MSG = 1056, DC = -1212137440, PAINTSTRUCT = 
0xb7e97160, RESULT = 0}, (TWINCONTROL) 0xb7a59930) at wincontrol.inc:5976
#16 SYSTEM_TOBJECT_$__DISPATCH$formal at :0
#17 TWINCONTROL__WMKILLFOCUS({MSG = 1056, FOCUSEDWND = -1212137440, UNUSED = 
-1209437856, RESULT = 0}, (TWINCONTROL) 0xb7a59930) at wincontrol.inc:5936
#18 TWINCONTROL__WNDPROC({MSG = 1056, WPARAM = -1212137440, LPARAM = 
-1209437856, RESULT = 0, WPARAMLO = 16416, WPARAMHI = 47040, LPARAMLO = 29024, 
LPARAMHI = 47081, RESULTLO = 0, RESULTHI = 0}, (TWINCONTROL) 0xb7a59930) at 
wincontrol.inc:4700
#19 DELIVERMESSAGE((POINTER) 0xb7a59930, void) at gtkproc.inc:3594
#20 DELIVERGTKPAINTMESSAGE((POINTER) 0xb7a59930, (PGTKWIDGET) 0x8ddea88, 
(PGDKRECTANGLE) 0x8dd486c, true, true) at gtkcallback.inc:104
#21 GTKEXPOSEEVENTAFTER((PGTKWIDGET) 0x8ddea88, (PGDKEVENTEXPOSE) 0x8dd4860, 
(POINTER) 0xb7a59930) at gtkcallback.inc:566
#22 gtk_marshal_BOOLEAN__VOID at :0
#23 g_closure_invoke at :0
#24 g_signal_override_class_closure at :0
#25 g_signal_emit_valist at :0
#26 g_signal_emit at :0
#27 gtk_widget_get_default_style at :0
#28 gtk_container_propagate_expose at :0
#29 gtk_container_propagate_expose at :0
#30 gtk_button_box_set_child_size at :0
#31 gtk_container_forall at :0
#32 gtk_container_forall at :0
#33 gtk_event_box_new at :0
#34 gtk_marshal_BOOLEAN__VOID at :0
#35 g_value_set_static_boxed at :0
#36 g_closure_invoke at :0
#37 g_signal_override_class_closure at :0
#38 g_signal_emit_valist at :0
#39 g_signal_emit at :0
#40 gtk_widget_get_default_style at :0
#41 gtk_container_propagate_expose at :0
#42 gtk_container_propagate_expose at :0
#43 gtk_font_selection_new at :0
#44 gtk_container_forall at :0
#45 gtk_container_forall at :0
#46 gtk_frame_new at :0
#47 gtk_marshal_BOOLEAN__VOID at :0
#48 g_value_set_static_boxed at :0
#49 g_closure_invoke at :0
#50 g_signal_override_class_closure at :0
#51 g_signal_emit_valist at :0
#52 g_signal_emit at :0
#53 gtk_widget_get_default_style at :0
#54 gtk_container_propagate_expose at :0
#55 gtk_container_propagate_expose at :0
#56 gtk_layout_get_type at :0
#57 gtk_container_forall at :0
#58 gtk_container_forall at :0
#59 gtk_layout_get_type at :0
#60 gtk_marshal_BOOLEAN__VOID at :0
#61 g_value_set_static_boxed at :0
#62 g_closure_invoke at :0
#63 g_signal_override_class_closure at :0
#64 g_signal_emit_valist at :0
#65 g_signal_emit at :0
#66 gtk_widget_get_default_style at :0
#67 gtk_main_do_event at :0
#68 gdk_window_is_viewable at :0
#69 gdk_window_process_all_updates at :0
#70 gdk_window_process_all_updates at :0
#71 g_list_remove_link at :0
#72 g_main_context_dispatch at :0
#73 g_main_context_check at :0
#74 g_main_context_iteration at :0
#75 gtk_main_iteration_do at :0
#76 TGTKWIDGETSET__APPPROCESSMESSAGES((TGTKWIDGETSET) 0xb7c3f020) at 
gtkwidgetset.inc:1314
#77 TAPPLICATION__PROCESSMESSAGES((TAPPLICATION) 0xb7e6a020) at 
application.inc:280
#78 WAITANSWER at Uinterf.pas:90
#79 MASK_BOX(0) at Uinterf.pas:102
#80 TFORM1__SPEEDBUTTON1CLICK((^TOBJECT) 0xb7a59c80, (TFORM1) 0xb7ecb650) at 
UTBox.pas:191
#81 TCONTROL__CLICK((TCONTROL) 0xb7a59c80) at control.inc:2043
#82 TCUSTOMSPEEDBUTTON__CLICK((TCUSTOMSPEEDBUTTON) 0xb7a59c80) at 
speedbutton.inc:114
#83 TCUSTOMSPEEDBUTTON__WMLBUTTONUP({MSG = 514, KEYS = 1, XPOS = 31, YPOS = 13, 
POS = {X = 31, Y = 13}, DUMMY = 851999, RESULT = 0}, (TCUSTOMSPEEDBUTTON) 
0xb7a59c80) at speedbutton.inc:794
#84 SYSTEM_TOBJECT_$__DISPATCH$formal at :0
#85 TCUSTOMSPEEDBUTTON__WMLBUTTONDBLCLK({MSG = 514, KEYS = 1, XPOS = 31, YPOS = 
13, POS = {X = 31, Y = 13}, DUMMY = 851999, RESULT = 0}, (TCUSTOMSPEEDBUTTON) 
0xb7a59c80) at speedbutton.inc:745
#86 TCONTROL__PERFORM(514, 1, 851999, (TCONTROL) 0xb7a59c80) at control.inc:1015
#87 TWINCONTROL__ISCONTROLMOUSEMSG({MSG = 514, KEYS = 1, XPOS = 54, YPOS = 52, 
POS = {X = 54, Y = 52}, DUMMY = 3407926, RESULT = 0}, (TWINCONTROL) 0xb7a59930) 
at wincontrol.inc:4138
#88 TWINCONTROL__WNDPROC({MSG = 514, WPARAM = 1, LPARAM = 3407926, RESULT = 0, 
WPARAMLO = 1, WPARAMHI = 0, LPARAMLO = 54, LPARAMHI = 52, RESULTLO = 0, 
RESULTHI = 0}, (TWINCONTROL) 0xb7a59930) at wincontrol.inc:4681
#89 DELIVERMESSAGE((POINTER) 0xb7a59930, void) at gtkproc.inc:3594
#90 DELIVERMOUSEUPMESSAGE((PGTKWIDGET) 0x8dd46d8, (PGDKEVENTBUTTON) 0x8dd4638, 
(^TWINCONTROL) 0xb7a59930) at gtkcallback.inc:1724
#91 GTKMOUSEBTNRELEASE((PGTKWIDGET) 0x8dd46d8, (PGDKEVENTBUTTON) 0x8dd4638, 
(POINTER) 0xb7a59930) at gtkcallback.inc:1780
#92 gtk_marshal_BOOLEAN__VOID at :0
#93 g_closure_invoke at :0
#94 g_signal_override_class_closure at :0
#95 g_signal_emit_valist at :0
#96 g_signal_emit at :0
#97 gtk_widget_get_default_style at :0
#98 gtk_propagate_event at :0
#99 gtk_main_do_event at :0
#100 gdk_add_client_message_filter at :0
#101 g_main_context_dispatch at :0
#102 g_main_context_check at :0
#103 g_main_context_iteration at :0
#104 gtk_main_iteration_do at :0
#105 TGTKWIDGETSET__APPPROCESSMESSAGES((TGTKWIDGETSET) 0xb7c3f020) at 
gtkwidgetset.inc:1314
#106 TAPPLICATION__HANDLEMESSAGE((TAPPLICATION) 0xb7e6a020) at 
application.inc:943
#107 RUNMESSAGE((POINTER) 0xbfcc84e0) at application.inc:1057
#108 TAPPLICATION__RUNLOOP((TAPPLICATION) 0xb7e6a020) at application.inc:1067
#109 TWIDGETSET__APPRUN((TAPPLICATIONMAINLOOP) 0x80807d0 
<TAPPLICATION__RUNLOOP>, (TWIDGETSET) 0xb7c3f020) at interfacebase.inc:49
#110 TAPPLICATION__RUN((TAPPLICATION) 0xb7e6a020) at application.inc:1046
#111 main at tbox.lpr:26
 

Reply via email to