我一直在为自己写一个c++代码,它在一个目录中迭代并将文件移动到与文件同名的目录中
\\\\
void foldersFrame::OnButton2Click(wxCommandEvent& event)
{
wxFileName mkr;
StaticText1->SetLabel(_("0"));
wxString fn;
wxString newf;
wxDir *dir=new wxDir(TextCtrl1->GetLabel());
bool cont = dir->GetFirst(&fn);
while (cont)
{
int mm=fn.Find('.',true);
newf=fn.Mid(0,mm);
if(! mkr.DirExists(dir->GetName()+_("\\")+fn)){
StaticText2->SetLabel(_("copying ")+fn);
if (! mkr.DirExists(dir->GetName()+_("\\")+newf)){
mkr.Mkdir(dir->GetName()+_("\\")+newf);
if (wxCopyFile(dir->GetName()+_("\\")+fn,dir->GetName()+_("\\")+newf+_("\\")+fn)){
wxRemoveFile(dir->GetName()+_("\\")+fn);
}
newf=StaticText1->GetLabel();
long d1;
if(!newf.ToLong(&d1));
d1+=1;
StaticText1->SetLabel(wxString::Format(wxT("%i"),d1));
}
}
cont = dir->GetNext(&fn);
}
wxSafeShowMessage(_("Message"),_("Finished"));
}
但是我写的代码好像效率很低,移动文件很费时间,复制的时候窗口没有反应,谁帮我重写一下..!!!!
最佳答案
要使应用程序窗口保持响应,但又不想在单独的线程中进行文件复制带来额外的麻烦,请尝试使用 Yield。需要照顾!
wxApp::产量
bool Yield(bool onlyIfNeeded = false)
让出对窗口系统中未决消息的控制。这可能很有用,例如,当耗时的进程写入文本窗口时。如果没有偶尔的让步,文本窗口将不会正确更新,并且在具有协作多任务处理的系统上,例如 Windows 3.1,其他进程将不会响应。
然而,应该谨慎行事,因为屈服可能允许用户执行与当前任务不兼容的操作。在处理过程中禁用菜单项或整个菜单可以避免不必要的代码重入:请参阅::wxSafeYield 以获得更好的功能。
请注意 Yield() 不会刷新消息日志。这是有意为之的,因为调用 Yield() 通常是为了快速更新屏幕,弹出消息框对话框可能是不受欢迎的。如果您确实希望立即刷新日志消息(否则它将在下一个空闲循环迭代期间完成),请调用 wxLog::FlushActive。
递归调用 Yield() 通常是一个错误,如果检测到这种情况,则会在调试构建中引发断言失败。但是,如果 onlyIfNeeded 参数为 true,该方法将只返回 false。
关于c++ - 使用 wxwidget 在 while 循环下移动多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13322261/