如何提高我这个功能的效率呢?

mfcdeclare 2003-12-12 11:17:14
我做了一个类似windows管理器的窗口(左边是tree,右边是listview),功能与windows管理器相同。

对于tree而言(确切的说是对每一个结点而言),每次点击这个结点前的"+"号,我都会调用一个函数(这个函数是自己写的,就是用循环,不断的向该结点下添加子结点,其中会有文件查找、插入结点、设置结点等操作),如果结点的子结点数量较少,没什么问题。可是,如果该结点下有很多的子结点(比如winnt\system32这个目录下,就有很多个结点).这种方法的执行效率就特别差,有时甚至会导致系统崩溃。

我尝试过用多线程(在这个新线程中调用我的那个函数),但是终因一些困难没有能够实现,而且,好像效果也不太好。那是不是我的算法的问题呢?有没有别的更好的算法或解决办法?谢谢。请各位给点意见。
...全文
34 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mfcdeclare 2003-12-13
  • 打赏
  • 举报
回复
我还是不太明白。能不能讲的详细一些呢?谢谢
mfcdeclare 2003-12-12
  • 打赏
  • 举报
回复
我这个程序根本没用到递归。
checkyvc6 2003-12-12
  • 打赏
  • 举报
回复
1
你可以再启动的时候先找好放到缓存里面以后调用
2
你可以提示让用户等待的对话框,自己再后台添加
3
改进算法,最好不要用递规查找文件改用堆栈
mfcdeclare 2003-12-12
  • 打赏
  • 举报
回复
我先把本地硬盘的盘符(A:、C:、D:、E:)全部先插入tree中,然后用myTree.SetItem()设置这些盘符均有子结点(这时,它们前面都有+号,尽管此时盘符下面没有子结点)。然后,设置tree的OnLButtonDown事件。假设,我现在点击了C:前面的+号。此时,我就调用我的那个函数SnatchHostDir(),用来向C:下添加子结点,SnatchHostDir()内部主要是循环,查找文件,并判断是否为文件夹、设置图标、并向C:这个结点插入子结点等操作。这是我的算法。大致的代码如下:
void CMyTree::OnLButtonDown(..)
{
...
SnatchHostDir()
CTreeView::OnLButtonDown()//因为上面的SnatchHostDir()是向某一结点添加子结点。但并不会展开该结点。而调用基类的OnLButtonDown()会展开该结点。
}
但是上面这样,在子结点非常多的情况下,tree界面的显示会非常慢,而且经常会导致系统崩溃。

运用多线程大致如下:
UINT WINAPI
用多线程时,我开辟了一个新线程,假设为NewThreads()
UINT WINAPI NewThreads(LPVOID lParam)
{
//some transfer
SnatchHostDir();
....//这里很关键,主要是得展开该结点,可是CTreeView::OnLButtondow()是一个protected成员,在我的这个新线程中是不能直接调用的。所以,我做了一些工作,使程序可以在这个新线程内调用基类的CTreeView::OnLButtonDown(),但是,奇怪的是,即使这样,该结点并不会展开,这就是用多线程遇到的困难(不知道为什么不会展开??)。应该是展开的呀,因为执行完SnatchHostDir()后,该结点下的子结点应该已经插入完毕了,在这时,调用CTreeView::OnLButtonDown()应该是可以展开该结点。不是吗?但事实上,它并不展开。何故??
carbon107 2003-12-12
  • 打赏
  • 举报
回复
我尝试过用多线程(在这个新线程中调用我的那个函数),但是终因一些困难没有能够实现,而且,好像效果也不太好。那是不是我的算法的问题呢?有没有别的更好的算法或解决办法?

应用多线程当然是可以的,算法也非常的重,二者结合起来效率一定会提高的.
不知你在线程的什么地方碰到了困难,应用什么样的算法了呢??
carbon107 2003-12-12
  • 打赏
  • 举报
回复
1。初始化程序时最好把结点存在一个数据结构(提高效率)比如链表。展开时从链表中找。
hz张三 2003-12-12
  • 打赏
  • 举报
回复
很喜欢用递归,很少会出现你说的这种情况。
hz张三 2003-12-12
  • 打赏
  • 举报
回复
1.动态加载,点击在加载;
比方c:\a\b\c这样的目录
第一次加载2层目录c:\,c:\a,而不是单单加载C:\.这样a前面的+、-就可以确定。
在点击c:\的目录的时候,在加载C:\a\b下面的目录,就可以确定b的+、-号。

2.内存加载,全部加载到一个树型结构类中,
再在程序显示的时候,将结构类中的数据显示在树型控件中。
这种方法可以分离加载时读入的耗时,和树型控件显示耗时累加的速度瓶颈。

以前做数据库方面,习惯中一般用1。
2涉及到数据变化的无法同步。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧