0

我一直在为自己编写一个 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"));
            }

但是我写的代码似乎效率很低。移动文件需要很多时间,并且复制时窗口没有响应。请有人帮我重写它..!!!!

4

2 回答 2

2

要使应用程序窗口保持响应,但又不会在单独的线程中进行文件复制的额外麻烦,请尝试使用 Yield。需要照顾!

wxApp::产量

布尔收益率(布尔 onlyIfNeeded = false)

将控制权交给窗口系统中的待处理消息。例如,当一个耗时的进程写入文本窗口时,这可能很有用。如果没有偶然的收益,文本窗口将无法正确更新,并且在具有协作多任务处理的系统上,例如 Windows 3.1,其他进程将不会响应。

但是,应谨慎行事,因为让步可能允许用户执行与当前任务不兼容的操作。在处理过程中禁用菜单项或整个菜单可以避免不必要的代码重入:请参阅 ::wxSafeYield 以获得更好的功能。

请注意, Yield() 不会刷新消息日志。这是故意的,因为调用 Yield() 通常是为了快速更新屏幕,并且可能不希望弹出消息框对话框。如果您确实希望立即刷新日志消息(否则它将在下一次空闲循环迭代期间完成),请调用 wxLog::FlushActive。

递归调用 Yield() 通常是一个错误,如果检测到这种情况,则会在调试构建中引发断言失败。但是,如果 onlyIfNeeded 参数为 true,则该方法将默默地返回 false。

于 2012-11-10T17:01:35.210 回答
1

您有两种标准方法来实现长时间运行的任务。

First one, and by far the best, is to perform this task in a separate background thread. You can update the state of the GUI controls in the main thread by posting wxThreadEvent containing the progress data to the main window easily. The only complication -- but a pretty important one -- in this case is to handle closing the window/application termination/thread exit correctly.

Second one, which could do in a pinch, is to do the task in wxEVT_IDLE handler piece by piece and call wxIdleEvent::RequestMore() after each step. This is not as responsive as using a separate thread because you still block the event handling during the handler execution and the code needs to be rewritten in a different way to be able to resume from where it left off.

Using wxYield() is a pretty bad idea and should be avoided unless no other solution can be implemented.

于 2012-11-11T12:55:00.493 回答