如何在delphi中延迟shell命令?

如何在delphi中延迟shell命令?,delphi,shell,Delphi,Shell,我正在使用Delphi2010和ShellAPI。随着我正在建设的项目的发展,我需要一些帮助。以下是应用程序的笑话: 检查是否存在某种情况 如果上述条件存在,它将开始执行两个shell命令,这两个shell命令依赖于前一个执行的shell命令 uses ShellApi; procedure RenameDir(DirFrom, DirTo: string); var shellinfo: TSHFileOpStruct; begin with shellinfo do

我正在使用Delphi2010和ShellAPI。随着我正在建设的项目的发展,我需要一些帮助。以下是应用程序的笑话:

检查是否存在某种情况 如果上述条件存在,它将开始执行两个shell命令,这两个shell命令依赖于前一个执行的shell命令

   uses
  ShellApi;

procedure RenameDir(DirFrom, DirTo: string);
var
  shellinfo: TSHFileOpStruct;
begin
  with shellinfo do
  begin
    Wnd    := 0;
    wFunc  := FO_RENAME;
    pFrom  := PChar(DirFrom);
    pTo    := PChar(DirTo);
    fFlags := FOF_FILESONLY or FOF_ALLOWUNDO or
              FOF_SILENT or FOF_NOCONFIRMATION;
  end;
  SHFileOperation(shellinfo);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  RenameDir('C:\Dir1', 'C:\Dir2');

  RenameDir('C:\Dir3', 'C:\Dir');


end;
我是Delphi的新手,但我可以看到问题,第二个命令在前一个命令完成之前执行。如何解决这个问题,以便在调用第二个命令之前执行并完成第一个命令


更新:我添加了完整的伪代码,以便它显示我尝试执行的操作

有两种简单的方法:

  • 插入睡眠(X);命令,并在x中填入5或10(应该是您所需要的所有ms)
  • 在两者之间插入Application.ProcessMessages命令,以允许完成包括重命名在内的其他事件

  • 如果您使用的命令是外部命令/程序,请考虑使用<代码> CREATEPATION()/代码>,并将其传递给<代码> WAITFRONGUNLIONEXTER()/<代码>。请看

    ExecAndWait()
    示例。

    也许您可以使用SHChangeNotifyRegister()在目录名实际更改时收到通知。

    Delphi默认库中没有可用的RenameDir过程。。。我建议您查看正在使用的库的文档,以了解它是如何工作的(可能是异步的),以及如何知道第一个操作何时完成以成功执行第二个操作。想知道在哪个版本的Delphi中,ShellAPI.pas中有一个RenameDir例程?不是D2009/D2010…很抱歉,RenameDir是使用SHFileOperation的过程。我没有提供足够的细节来获得我所需要的帮助。如果重命名是异步进行的,这两种方法都不一定有效,这似乎是事实。知道如何修复它吗?我已经尝试了application.processmessages命令,但它仍然具有相同的功能issue@JamesW,我猜,您当前正在使用
    SHFileOperation()
    重命名目录,对吗?为什么不改用
    MoveFile()
    MoveFile()
    已经可以异步工作,速度更快,而且您不必为当前的问题而烦恼。是的,我使用的是SHFileOperation。我将尝试MoveFile选项vantomex MoveFile选项正是我所需要的。我已经测试过了,现在有一个100%工作的应用程序。谢谢你能破译我非常模糊的描述,并帮助我解决这个问题。