关于C#:虚拟Listview控件的(主)缓冲区中应该有几行?

关于C#:虚拟Listview控件的(主)缓冲区中应该有几行?

How many rows should be in the (main) buffer of a virtual Listview control?

虚拟Listview控件的(主)缓冲区中应有多少行?

我正在用Win32 API的纯" c"样式显示一个应用程序。到数据库的ODBC连接将检索项目(实际上是行)。

MSDN示例代码暗含一个30的固定大小的缓冲区,用于端缓存(几乎肯定不是最佳选择)。我认为末端缓存和主缓存应具有相同的大小。

我的想法是缓冲区应该大于列表视图一次可以显示的最大项目数。我想每次调整Listivew的大小时都可以重新计算?

或者,采用较大的固定值是否更好?如果是这样,那是什么值?


LVN_ODCACHEHINT通知消息将使您知道它要询问多少个项目。这可以帮助您确定缓存的大小。


使用ListView_roximateViewRect(或LVM_APPROXIMATEVIEWRECT消息)获取视图的矩形高度。

使用ListView_GetItemRect(或LVM_GETITEMRECT消息)获取项目的高度。

将视图区域的高度除以项目的高度,以获取可以容纳在视图中的项目数。
对每个大小事件进行此计算。

然后相应地创建缓冲区。


答案似乎是:(或者我随便摆弄想法的随机笔记集)

作为缓冲区的一般答案:
从一定数量开始,在这种情况下,屏幕已满(我添加了一个额外的行,以防部分隐藏下一个),然后每次滚动屏幕时,将缓冲区大小加倍(直到内存不足之前的大小) )。

这似乎是错误的。事实证明,大多数加载数据的方式都已准备好进行缓冲。文件I / O的ODBC调用。我几乎无法想到的所有东西要么都在内存中,要么是即时重新计算的。这意味着答案确实是:采用LVN_ODCACHEHINT中提供的值(并在每侧加1-如果您没有整数的高度,这似乎工作得更快)。


@Brian R. Bondy感谢您对如何获得物品数量的明确帮助。实际上,我已经准备好以自己的方式了解可以使用ListView_GetCountPerPage来完成此操作(对于列表视图还是报表视图),并且我将使用您的方式将其用于其他对象,尽管自从我不需要ListView_近似ViewRect以来,所有人都将知道ListView的新大小。

@Lars Truijens我已经在使用LVN_ODCACHEHINT了,尽管已经使用它来设置缓冲区大小,但是我需要读到SQL数据的末尾以找到最后一项,以获取从ODBC返回的行数。由于那是填充"结束缓存"的最佳时间,我想我必须先设置项目数量(并因此填充缓冲区),然后才能调用LVN_ODCACHEHIN。

我想我的真正问题是优化,我认为Brian暗示了答案。浪费缓冲区和重新分配内存的开销小于进入网络并进行ODBC读取的开销,有些会使缓冲区很小,并且经常更改它。

这是对的吗?

我已经做了很多工作,似乎认为LVN_ODCACHEHINT通常可以正确填充主缓冲区,并且仅当部分行(在报告模式下)可见时才会丢失。

因此,我认为缓存大小的答案是:显示项的总数,加上一行显示项(因为在图标视图中,每行有多个项)。

然后,如果每个WM_SIZE和LVN_ODCACHEHINT具有不同的开始和结束项目编号,则将重新读取该缓存。


推荐阅读

    linux命令实时显示?

    linux命令实时显示?,系统,实时,时间,信息,情况,命令,对比,电脑,名称,一致,lin

    虚拟机linux系统命令?

    虚拟机linux系统命令?,系统,工具,软件,名字,时间,命令,工作,首次,环境,名称,L

    linux编译时显示命令?

    linux编译时显示命令?,系统,基础,工具,代码,百度,下来,网上,命令,内核,文件,L

    linux命令连接ip?

    linux命令连接ip?,地址,系统,网络,工作,信息,命令,密码,名称,设备,服务,linux

    linux显示运行命令?

    linux显示运行命令?,系统,服务,状态,信息,工具,数据,电脑,标准,管理,时间,如

    显示linux网卡命令行?

    显示linux网卡命令行?,系统,信息,工具,网络,服务,电脑,网卡,技术指标,地址,

    linux命令显示内容?

    linux命令显示内容?,标准,系统,数据,命令,百度,实时,时间,信息,文件,内容,lin

    linux命令连接网址?

    linux命令连接网址?,网址,系统,地址,服务,传播,数据,命令,名字,环境,网站,如

    linux常用显示命令?

    linux常用显示命令?,工作,地址,系统,信息,管理,命令,目录,标准,功能,常用命

    linux用命令显示账号?

    linux用命令显示账号?,密码,系统,信息,地址,电脑,名字,用户,命令,用户名,用

    linux命令行同步显示?

    linux命令行同步显示?,地址,工具,系统,数据,工作,时间,命令,综合,网址,信息,L

    linux数据库查找命令?

    linux数据库查找命令?,位置,名称,状态,服务,软件,信息,系统,命令,名字,密码,

    linux命令显示窗口?

    linux命令显示窗口?,系统,工具,首页,终端,密码,命令,窗口,界面,桌面,选项,lin

    linux分页显示命令?

    linux分页显示命令?,工具,通信,命令,数据,信息,管道,标准,位置,一致,系统,lin

    linux数据库同步命令?

    linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,D

    linux中ps命令显示?

    linux中ps命令显示?,系统,信息,状态,进程,命令,多地,软件,工作,基础,报告,lin

    linux命令逐页显示?

    linux命令逐页显示?,系统,工作,地址,命令,网上,信息,百度,基础,标准,内容,在l

    linux显示内核命令?

    linux显示内核命令?,地址,发行,信息,工具,电脑,系统,名称,内核,版本,状态,如

    显示等号linux命令?

    显示等号linux命令?,工作,地址,信息,系统,命令,目录,标准,管理,基础,常用命

    linux连接多条命令?

    linux连接多条命令?,工具,情况,命令,分行,服务,地址,连续,终端,窗口,主机,lin