我在我的應用程序上做了一個同步線程,我想知道是否有一種方法讓線程保持打開狀態,直到它完成同步過程,如果關閉應用程序窗體?讓線程在窗體上運行關閉
1
A
回答
1
在Rob的優秀回答的評論中,提出了在等待時顯示UI的問題。如果你需要在等待的時候顯示UI,那麼你需要更高級的等待TThread.WaitFor
。這是我使用的地方,依靠MsgWaitForMultipleObjects
。
procedure WaitUntilSignaled(Handle: THandle; ProcessMessages: Boolean);
begin
if ProcessMessages then begin
Application.ProcessMessages;//in case there are any messages are already waiting in the queue
while MsgWaitForMultipleObjects(1, Handle, False, INFINITE, QS_ALLEVENTS)=WAIT_OBJECT_0+1 do begin
Application.ProcessMessages;
end;
end else begin
WaitForSingleObject(Handle, INFINITE);
end;
end;
....
Form.Show;
WaitUntilSignaled(Thread.Handle, True);
Form.Close;
6
在您的DPR文件中調用線程的WaitFor
方法,在Application.Run
之後。如果線程已經完成運行,則WaitFor
將立即返回。否則,它會暫停主線程,直到另一個線程終止。 (您必須確保該變量仍然指的是有效的TThread
實例,因此不要設置其FreeOnTerminate
屬性。)
除了允許線程的簡單問題外,還有其他一些事情可能需要考慮繼續運行:
- 程序只有有限的時間停止運行,如果操作系統正在關閉或者用戶正在註銷的,所以你可能沒有時間等待同步完成OS殺死你的程序之前。
- 用戶可能想知道爲什麼程序仍然在運行,即使他們告訴它關閉,所以考慮在同步繼續時顯示一些用戶界面。
- 如果用戶匆忙併且需要程序立即停止運行,則用戶可能不關心同步,因此在該用戶界面中,您可能希望提供「中止同步」命令。
相關問題
- 1. 在窗口關閉時運行窗體窗體線程
- 2. 當窗體運行線程時關閉主應用程序
- 3. 關閉窗體時停止線程中的運行方法
- 4. 父窗體關閉時如何關閉在自己的線程中運行的子窗體? (非MDI)
- 5. 在主窗體關閉後讓線程運行並且不等待線程完成
- 6. 在關閉主窗體之前關閉邊線程
- 7. 線程完成時關閉窗體
- 8. 從子線程關閉父窗體
- 9. 關閉窗體後保持子運行
- 10. c#窗體關閉後運行
- 11. C#線程:如何在線程關閉後打開主窗體
- 12. PyQt線程在窗口關閉後仍然運行
- 13. Application.Exit() - 應用程序在關閉窗體後仍然運行
- 14. Python:關閉數字窗口並讓程序運行
- 15. 關閉線程Tkinter窗口
- 16. C#關閉從後臺線程的WPF窗體線程
- 17. 窗體關閉後,從特定的上下文運行代碼?
- 18. 上終止的JFrame關閉正在運行的線程
- 19. 如何從另一個線程中的窗體關閉新線程上的窗體?
- 20. c# - 如何關閉主窗體而不讓應用程序關閉?
- 21. Tkinter窗口在運行時關閉
- 22. .NET取消關閉窗體可防止在Windows上關閉它
- 23. XAML - 在WPF窗體關閉時運行代碼
- 24. 在另一個窗體上關閉窗體?
- 25. 在命令行上運行的線程安全Windows窗體應用程序
- 26. 確保所有線程都關閉或強行關閉線程?
- 27. C# - 如何關閉主窗體和子窗體(只有當主窗體關閉時子窗口才會關閉)
- 28. Windows窗體:接線,在運行時
- 29. 當另一個窗體關閉時關閉窗體
- 30. 關閉對話框窗體關閉父窗體
謝謝,我想我可以添加一些UI在那東西! – evilone 2011-02-02 07:18:59
但是如何在Thread.WaitFor中向用戶顯示一些UI。它正在返回紅衣主教類型,是否有可能對此做些什麼? – evilone 2011-02-02 07:38:17