有没有办法执行一个只被调用数千次的函数?我有一个在排序容器中添加项目的函数,其中有代码,可以更新列表和其他窗口(GUI 人员)。所以,如果我必须添加一百万个项目(其中的数量无法确定,任何人都可以从任何地方调用该函数),GUI更新机制将被调用多次......有没有办法告诉appart从不连续的连续函数执行(并忽略它)?是否有一种安全的方法可以仅在最后一次调用add-item函数时执行更新机制,在时间间隔内?
谢谢你。
Roesone,你的密码坏了。它拒绝你写它的尝试,因为它知道它是错误的。你可能会找到一些邋遢的 hack,它们会发出你想要的行为——现在。但这个解决方案将是一个黑客;易碎,容易出错且难以维护。并且特别容易受到连锁反应的影响。只要您在代码的某个地方对远程触及此功能的某处进行了小幅更改,那么邋遢的黑客就会崩溃,您的处境将比现在更糟。
不,这里的解决方案不是找到可行的破解方法。解决方案是修复您的代码。从根本上说,这意味着编写两个函数。一个将数据插入到容器中,另一个完全独立的函数将数据呈现到屏幕上。然后,您可以专门为这些方法设计机制。例如,您可以每秒更新屏幕十次,同时允许无限制地插入。
帮您自己、您的同事和自由世界一个忙,并修复您损坏的代码。
static bool
如果为真,你可以把它从函数中退出。
如果您有办法在要添加许多项目的情况下关闭“重绘”(GUI 更新)怎么办?
// add one item:
window.add_item()
// add many items:
window.set_redraw(false)
window.add_many_items()
window.set_redraw(true)
然后您的 add_item 函数只需在更新 GUI 之前检查标志。添加一项的简单情况保持不变。
手动触发更新可能会更好。
最好的解决方案(恕我直言)是 .NET 用于其大部分控件的解决方案:
创建某种设置布尔值的“SuspendLayout”方法,如果未设置则仅更新 GUI。添加一个“ResumeLayout”,然后更新 GUI。
这样,如果您班级的用户只更新一个项目,他不必更改任何内容,并且如果他更新了多次,他可以这么说,而您的班级不必担心。
这也允许您在必要时优化批量更新,即在列表中预先分配更多空间。您还可以向 SuspendLayout 添加一个覆盖,指示将添加的项目数 (SuspendLayout(int forNumberOfItems)),以便您可以使用正确的空间量初始化列表。
这取决于您用于 GUI 的框架。
基本上,它归结为具有以下伪代码:
bool g_isValueModified = false ;
Value g_value ;
void setValue(Value value)
{
g_value = value ;
g_isValueModified = true ;
}
void updateValueOnGUI()
{
if(g_isValueModified)
{
g_isValueModified = false ;
// put here the code to set the value in the GUI widget
}
}
setValue
应该尽可能多地调用该方法,而该方法应该被调用updateValueOnGUI
,例如,每 10 或 100 毫秒调用一次。
要实现这种异步行为,可以:
如果您可以使用计时器并使用 Win32 API,则可以使用 SetTimer 方法启动计时器,以便在将来每次调用该函数时触发。SetTimer 的行为是,如果您在第一次调用结束之前使用相同的 TimerID 再次调用它,则计时器将被重置。因此,您可以在每次调用函数时调用 SetTimer,并且可以保证计时器只会在最后一次调用后触发“n”毫秒。
UINT_PTR timerID = SetTimer(NULL, someUniqueID, 1000, yourCallback);
记得在之后调用 KillTimer 进行清理。
您需要在一段时间内聚合对容器的更新,然后在此时间段之后执行更新操作(说起来容易做起来难!)。重要的是要清楚哪些操作适合聚合在一起,哪些不适合。
真正的一点是,如果您担心某个区域的性能,那么您应该集中精力处理该区域,例如,如果您执行 UI 更新操作的频率远高于您的 UI 显示更新频率(或高于您实际上需要)那么这就是应该在时间间隔内聚合它的更新的代码。
您还需要确保不会使数据结构过时,以便及时处理最后的通知,即使下一次更新很长时间没有发生。