2008-10-07 49 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可能更適合您。