代码之家  ›  专栏  ›  技术社区  ›  korona

摆脱ShellExecute造成的邪恶延迟

  •  3
  • korona  · 技术社区  · 17 年前

    这是困扰我一段时间的事情,只有一个解决办法。每次调用shellexecute打开外部文件(无论是文档、可执行文件还是URL)时,这都会在shellexecute生成新进程并返回之前在程序中造成很长的锁定。有人知道如何解决或解决这个问题吗?

    编辑:正如标签可能指出的,这是使用C++的Win32。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Aardvark    17 年前

    你是多线程的吗?

    我看到了使用shellexecute打开文件的问题。不是可执行文件,而是与应用程序关联的文件-通常是MS Office。使用DDE打开文件的应用程序向所有线程广播了一条消息(我不知道是不是 全部的 ……程序。由于我没有在我的应用程序的工作线程中注入消息,我将挂起shell(和打开文件)一段时间。它最终超时等待我处理消息,应用程序将启动并打开文件。

    我记得在一个循环中使用peekmessage只是删除该工作线程队列中的消息。我一直认为有一种方法可以避免这种情况,也许创建线程的方式不同,以避免成为消息的目标?


    更新 它一定不仅仅是执行此操作的任何线程,而是为窗口提供服务的线程。 雷蒙德 (link 1) 知道一切 (link 2) . 我打赌CoInitialize(单线程单元)或者MFC中的某个东西为线程创建了一个隐藏窗口。

        2
  •  9
  •   1800 INFORMATION    17 年前

    我不知道是什么导致了这种情况,但SysInternal著名的MarkRussinovich有一个非常棒的博客,他解释了如何调试这些东西。一个很好的给你看 The Case of the Delayed Windows Vista File Open Dialogs 在那里,他只使用ProcessExplorer调试了一个类似的问题(结果是访问域时出现了问题)。当然,可以使用常规的Windows调试器执行类似的操作。

    你的问题可能与他的不一样,但是使用这些技术可以帮助你更接近问题的根源。我建议调用 CreateProcess 调用,然后捕获一些堆栈跟踪并查看它挂起的位置。

    The Case of the Process Startup Delays 可能对你更重要。