2008-10-07 44 views
3

这件事一直困扰着我一段时间,那里只是一个解决方案。每次我调用ShellExecute打开一个外部文件(无论是文档,可执行文件还是URL)时,在ShellExecute产生新进程并返回之前,这会在我的程序中导致很长的锁定时间。有谁知道如何解决或解决此问题?摆脱由ShellExecute引起的邪恶延迟

编辑:而且标签可能表明,这是在Win32上使用C++。

回答

3

你是多线程的吗?

我看到用ShellExecute打开文件的问题。不是可执行文件,而是与应用程序相关的文件 - 通常是MS Office。使用DDE打开文件的应用程序会将消息广播到所有线程(好吧,我不知道它是否为全部 ...)程序。由于我没有在应用程序中的工作线程中抽取消息,因此我会挂起shell(以及文件的打开)一段时间。它最终超时等待我处理消息,应用程序将启动并打开文件。

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


更新 它必须没有刚被这是这样做,但一个服务窗口的任何线索。 Raymond (link 1)知道全部(link 2)。我敢打赌,CoInitialize(单线程公寓)或MFC中的某些内容为该线程创建了一个隐藏窗口。

+0

因此,意味着在线程不抽取消息的客户机上运行的潜在_any_应用程序可能会导致这样的延迟?谈论一个无用的API。 :( – korona 2008-10-08 11:28:15

9

我不知道是什么造成的,但Mark Russinovich(sysinternal的声誉)有一个非常棒的博客,他解释了如何调试这些类型的东西。一个好的选择是The Case of the Delayed Windows Vista File Open Dialogs,在那里他只使用进程资源管理器调试类似的问题(事实证明,这是访问该域的问题)。您当然可以使用常规的Windows调试器来做类似的事情。

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

The Case of the Process Startup Delays可能更适合您。