界面停止响应的问题,恳请高手指点???

songric 2006-04-26 08:50:29
各位好!我用MFC做了个基于对话框的小程序,在界面上有个按钮,点击它,则程序开始每过10秒钟就去遍历一下指定文件夹下的文件(SetTimer),并执行相应的操作。现在的问题是,如果文件夹下的文件很多时,(如超过40个),则程序的界面就停止响应,具体表现为,拖动对话框和最小化,关闭对话框等都没有响应,要等过了一会程序执行完遍历以后才有响应。如果程序去执行“....执行响应操作1...”,程序同样会出现上面的问题,并且界面也不再刷新。我百思不得其解,刚接触MFC才半年,解决起来很吃力,恳请大家帮帮忙。遍历文件夹下文件的代码如下,我已加了注释:

CString m_FolderPath ="I:\\NC" ; //文件夹的路径

char szFile[MAX_PATH],Hint[256];
WIN32_FIND_DATA FindFileData;
strcpy(szFile,m_FolderPath);
strcat(szFile,"\\*.*");

HANDLE hFind=::FindFirstFile(szFile,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind) return;

while(TRUE)
{
if((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)==0) //遍历到一个文件
{
char FileName[256];
strcpy(FileName,m_FolderPath);
strcat(FileName,"\\\\");
strcat(FileName,FindFileData.cFileName); //得到文件的完整路径

SYSTEMTIME LastModifyTime;
SYSTEMTIME CreationTime;
GetDirTime(FileName,LastModifyTime,CreationTime);//得到文件最后被修改的时间
if(LastModifyTime.wYear!=1989) //如果被修改时间不是特定的1989年,就执行响应1
{
.....执行响应的操作 1.....//这个操作所需的时间和占用的CPU资源比较多

}
else
{
//如果这个文件的最后修改时间和系统时间相差2天,就删除这个文件。
CTime tNow=CTime::GetCurrentTime();
CTime tOld(CreationTime);
CTimeSpan span = tNow - tOld ;
float span1= float(span.GetTotalSeconds());
if(span1/86400 >= 2) DeleteFile(FileName);
}
}
if(!FindNextFile(hFind,&FindFileData)) break; //遍历完,则挑出循环
}
FindClose(hFind);
...全文
187 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
songric 2006-04-27
  • 打赏
  • 举报
回复
非常感谢大家的帮助,分数有限,分配不均,请见谅。
特别要感谢lixiaosan(小三)给我的详尽答复,问题得到顺利解决,谢谢
lixiaosan 2006-04-26
  • 打赏
  • 举报
回复
//xxxdlg.h
static UINT MyThread(LPVOID pParam);
CWinThread* pMyThread;

//xxxdlg.cpp
CXXXDlg::onbutton1()
{
pMyThread = AfxBeginThread(MyThread, this);
pMyThread = NULL;
}

UINT CXXXDlg::MyThread(LPVOID pParam)
{
CXXXDlg *pDlg = (CXXXDlg *)pParam;
//你的实现。。
return 0;
}
lixiaosan 2006-04-26
  • 打赏
  • 举报
回复
由于搜索耗费了大量的时间,并且该操作是在界面线程中,由此引发了界面线程的消息阻塞,
所以你需要重新开一个工作线程来处理搜索,

以下是开线程的简单实现

//xxxdlg.h
static UINT MyThread(LPVOID pParam);
CWinThread* pMyThread;

//xxxdlg.cpp
CXXXDlg::onbutton1()
{
pMyThread = AfxBeginThread(MyThread, this);

pMyThread = NULL;

}

UINT CXXXDlg::TransformThread(LPVOID pParam)

{

CXXXDlg *pDlg = (CXXXDlg *)pParam;



//你的实现。。



return 0;

}
lqm1003 2006-04-26
  • 打赏
  • 举报
回复
线程处理遍历操作
yjgx007 2006-04-26
  • 打赏
  • 举报
回复
如果Worker运行时间很长,可以采用另开一个工作线程的方法,当然,如果不想另开一个工作线程,也可以用线程等待的方法,详见:
http://www.geekclaw.com/blog/post/56.html
rageliu 2006-04-26
  • 打赏
  • 举报
回复
up,消耗时间的用子线程处理,如果一定要在主线程中处理长时间循环就加入消息处理
wangk 2006-04-26
  • 打赏
  • 举报
回复
1.把会阻赛的代码放到一个线程中单独处理
2.在循环中加入PeekMessage
yuliangpei 2006-04-26
  • 打赏
  • 举报
回复
线程处理.
Qiushen 2006-04-26
  • 打赏
  • 举报
回复
把这段代码放到一个线程中单独处理
striking 2006-04-26
  • 打赏
  • 举报
回复
可以将查找的代码放到一个静态成员函数或全局函数中,

然后启动工作者线程。

你在baidu搜索一下 vc 工作者线程

可以了解一下多线程编程
lynx090 2006-04-26
  • 打赏
  • 举报
回复
可以不用多线程,可以试试重载消息循环,但效率要低些,不过起码比较简单不会出错.

15,975

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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