采用多线程,正在用MoveFileEx(sdir,ddir,...)移动文件,如何确保别的线程不再移动?还要确保别的线程不再检索?

timke212004 2008-05-26 05:03:58
主要代码如下:
while(condition)
{
AfxBeginThread(myproc,(LPVOID)param);
}
UNINT myproc(LPVOID lparam)
{
CFindFile ff;
CString sdir=(mystruct)lparam->sdir;
CString ddir=(mystruct)lparam->ddir;
sdir+="*.*";
BOOL res=ff.findfile(sdir);
while(res)
{
MoveFileEx(ff.GetFilePath,ddir+ff.GetFileName(),
MOVEFILE_COPY_ALLOW|MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING));
}
}
在调试过程中,我发现一个文件剪切走了,但是另一个线程还有可能会去取一下,就有错误号2:"找不到文件";更有在一个线程剪切的过程中另一个线程也会取,显然应该是ff检索到了,报错32:"另一个程序正在使用...";那么我想问一下,如何保证我进行正确剪切操作呢?使得一个线程操作的时候就不要再检索了.先谢了!!
...全文
103 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
timke212004 2008-05-30
  • 打赏
  • 举报
回复
while(condition) //产生线程
{
//hMutex=CreateMutx(NULL,TUE,"MoveFiles");
AfxBeginThread(myproc,(LPVOID)param);
}

UNINT myproc(LPVOID lparam) //线程函数
{
CFindFile ff;
CString sdir=(mystruct)lparam->sdir;
CString ddir=(mystruct)lparam->ddir;
sdir+="*.*";

HANDLE hMutex;
hMutex=CreateMutx(NULL,TUE,"MoveFiles");


BOOL res=ff.findfile(sdir);
while(res)
{
WaitForSingleObject(hMutex,INFINITE);

res=ff.FindNestFile();
MoveFileEx(ff.GetFilePath,ddir+ff.GetFileName(),
MOVEFILE_COPY_ALLOW ¦MOVEFILE_WRITE_THROUGH ¦MOVEFILE_REPLACE_EXISTING));

}
ReleaseMutex(hMutex);
}
先这么处理了,已经不再出现问题了,谢谢大家!!
总结:这样扩大了互斥区域,保证了文件句柄对线程的独占,应该是这样的吧?再一次谢谢大家的支持!!
palmax 2008-05-27
  • 打赏
  • 举报
回复
加锁 Mutex或者CriticalSection
day572 2008-05-27
  • 打赏
  • 举报
回复
你这个程序里,应该有线程执行的先后问题,用到了资源的共享,你可以,在你现在的这个线程里,添加一个HANDLE hMutex,不过,这个handle是全局的,然后,让它无效在这个线程用完资源共享之后,再恢复它.

在另一个剪切的线程里,等待这个handle,也就是WaitForSingleObject(...)便可以了
palmax 2008-05-27
  • 打赏
  • 举报
回复
mutex 不是你那样用的

可以用MFC的CMutex代替

CMutex g_mutex; // 在cpp文件里定义一个全局变量


/************************************************************************
while(condition) //产生线程
{
AfxBeginThread(myproc,(LPVOID)param);
}

UNINT myproc(LPVOID lparam) //线程函数
{
CFindFile ff;
CString sdir=(mystruct)lparam->sdir;
CString ddir=(mystruct)lparam->ddir;
sdir+="*.*";

g_mutex.Lock();

BOOL res=ff.findfile(sdir);
while(res)
{
res=ff.FindNestFile();
MoveFileEx(ff.GetFilePath,ddir+ff.GetFileName(),
MOVEFILE_COPY_ALLOW ¦MOVEFILE_WRITE_THROUGH ¦MOVEFILE_REPLACE_EXISTING));
}

g_mutex.Unlock();
}
*************************************************************************/

如果要求不用MFC,用CriticalSection就是了
先InitializeCriticalSection,然后把lock和unlock的地方换成EnterCriticalSection和LeaveCriticalSection就可以了
timke212004 2008-05-27
  • 打赏
  • 举报
回复
我知道书上说的,对于一个全局变量进行同步很好理解,这里,感觉我这里思想可能不对头.应该是先取得被操作文件的句柄,然后锁定它,使得别的线程不能操作,即便是文件夹读取列表也不应该包括.这样就不会报错"找不到文件"或者"别的程序在用...".
timke212004 2008-05-27
  • 打赏
  • 举报
回复
while(condition) //产生线程
{
hMutex=CreateMutx(NULL,TUE,"MoveFiles");
AfxBeginThread(myproc,(LPVOID)param);
}

UNINT myproc(LPVOID lparam) //线程函数
{
CFindFile ff;
CString sdir=(mystruct)lparam->sdir;
CString ddir=(mystruct)lparam->ddir;
sdir+="*.*";

HANDLE hMutex;

BOOL res=ff.findfile(sdir);
while(res)
{
WaitForSingleObject(hMutex,INFINITE);

res=ff.FindNestFile();
MoveFileEx(ff.GetFilePath,ddir+ff.GetFileName(),
MOVEFILE_COPY_ALLOW ¦MOVEFILE_WRITE_THROUGH ¦MOVEFILE_REPLACE_EXISTING));
ReleaseMutex(hMutex);
}
}
添加了线程同步,但是还是有一些错误2提示:文件找不到.我可以想象的到:应该是文件已经在一个线程中被操作了,但是另一个线程在move还没有完成时候读到了文件句柄,因此它会继续move,但显然文件已经不在了.那么是不是该如何同步列表呢?
palmax 2008-05-27
  • 打赏
  • 举报
回复
“锁”应该是个全局变量,以便所有线程都能访问,楼主那样的代码和没加锁一样的
执行MoveFileEx操作前获取“锁”的所有权,MoveFileEx调用完后,释放锁的所有权
每个线程在执行MoveFileEx之前都应等待获取“锁”的所有权,若获取不到,则一直等下去,这样才是线程同步

建议楼主去看看多线程的书
timke212004 2008-05-27
  • 打赏
  • 举报
回复
while(condition) //产生线程
{
AfxBeginThread(myproc,(LPVOID)param);
}

UNINT myproc(LPVOID lparam) //线程函数
{
CFindFile ff;
CString sdir=(mystruct)lparam->sdir;
CString ddir=(mystruct)lparam->ddir;
sdir+="*.*";

HANDLE hMutex;

BOOL res=ff.findfile(sdir);
while(res)
{
hMutex=CreateMutx(NULL,TUE,"MoveFiles"); WaitForSingleObject(hMutex,INFINITE);

res=ff.FindNestFile();
MoveFileEx(ff.GetFilePath,ddir+ff.GetFileName(),
MOVEFILE_COPY_ALLOW ¦MOVEFILE_WRITE_THROUGH ¦MOVEFILE_REPLACE_EXISTING));
ReleaseMutex(hMutex);
}
}
添加了线程同步,但是还是有一些错误2提示:文件找不到.我可以想象的到:应该是文件已经在一个线程中被操作了,但是另一个线程在move还没有完成时候读到了文件句柄,因此它会继续move,但显然文件已经不在了.那么是不是该如何同步列表呢?
timke212004 2008-05-27
  • 打赏
  • 举报
回复
while(condition) //产生线程
{
AfxBeginThread(myproc,(LPVOID)param);
}

UNINT myproc(LPVOID lparam) //线程函数
{
CFindFile ff;
CString sdir=(mystruct)lparam->sdir;
CString ddir=(mystruct)lparam->ddir;
sdir+="*.*";

HANDLE hMutex;

BOOL res=ff.findfile(sdir);
while(res)
{
hMutex=CreateMutx(NULL,TUE,"MoveFiles");
WaitForSingleObject(hMutex,INFINITE);

res=ff.FindNestFile();
MoveFileEx(ff.GetFilePath,ddir+ff.GetFileName(),
MOVEFILE_COPY_ALLOW ¦MOVEFILE_WRITE_THROUGH ¦MOVEFILE_REPLACE_EXISTING));
ReleaseMutex(hMutex);
}
}
添加了线程同步,但是还是有一些错误2提示:文件找不到.我可以想象的到:应该是文件已经在一个线程中被操作了,但是另一个线程在move还没有完成时候读到了文件句柄,因此它会继续move,但显然文件已经不在了.那么是不是该如何同步列表呢?

15,466

社区成员

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

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