我正在处理一个旧的Motif应用程序,需要加载并显示一长串条目(大约1500)。它通过xmFormWidgetClass
创建和管理XtVaCreateManagedWidget()
的一个实例,然后它用一堆线性层次结构xmFrameWidgetClass->xmFormWidgetClass->xmFormWidgetClass->xmPushButtonWidgetClass
填充它。每个PushButton
都包含一个多行标签。当这个东西被填充时,它需要大量的CPU,它花费在X / Motif库中进行一些几何计算。添加新按钮的速度会非常快地降低。看起来在XtVaCreateManagedWidget()
中使用了O(N)算法。
如果我在XtUnrealizeWidget()
的原始实例上做xmFormWidgetClass
,事情会好得多。条目以几乎恒定的速度添加,但后来我无法找到显示我构建的整个事物的方法。 XtRealizeWidget()
为xmFormWidgetClass
的原始实例不会在窗口中呈现它。
我究竟做错了什么?有没有办法填充层次结构然后计算几何并立即将其渲染到屏幕?
重新设计应用程序是一个选项,但它是一个选项的最后手段类型。
任何让我进入Motif图书馆的建议都将受到高度赞赏!
问候,/谢尔盖
尝试在XtManageChild
之后调用XtRealizeWidget
。
尝试创建所有不受管理的小部件并将它们放在WidgetList上,然后调用XtManageChildren()。请参阅以下参考资料
http://www.s-and-b.su/syshlp/motif_guide/MotifProgGuide/Making_Widgets_Visible.html
每次管理单个窗口小部件时,都会调用父change_managed过程。 XtManageChildren只调用一次changed_manage过程。这可能有所帮助。