是否有掛鉤到dbx用戶會話的WndProc的方法?掛鉤到dbx DataSnap用戶會話的消息循環
背景: dbx DataSnap使用Indy組件進行TCP通信。最簡單的形式是,DataSnap服務器是一個接受連接的Indy TCP服務器。建立連接時,Indy爲該連接創建一個線程,該線程處理該連接的所有請求。
這些用戶連接都消耗資源。對於具有幾百個同時連接的服務器,這些資源可能很昂貴。許多資源可以合併,但我不希望在每次需要時總是獲取和釋放資源。
相反,我想實現一個空閒計時器。線程完成資源後,計時器將啓動。如果線程在計時器過去之前訪問資源,資源仍然會被「分配」給該線程。但是如果定時器在下次訪問之前流逝,資源將被釋放回池中。線程下一次需要資源時,將從池中獲取另一個資源。
我還沒有找到辦法做到這一點。我試過使用SetTimer,但我的計時器回調從不會觸發。我認爲這是因爲Indy的線程WndProc沒有調度WM_TIMER。我無法控制此線程的「執行循環」,因此無法輕鬆檢查是否發生了事件。實際上,除非線程處理用戶請求,否則我的代碼不會執行此線程。事實上,我想讓代碼在任何用戶請求之外執行。
同樣讚賞解決原始問題或替代方法的建議。
雷米勒博別處指出,Indy的線程沒有消息循環。我以前曾嘗試創建一個消息循環並在用戶線程中實現我自己的WndProc,但是我的WndProc從未收到過信息。 SetTimer和傳統的TTimer都不支持我的消息循環。 (不考慮線程安全問題,已經解決了這些問題。)我在很多其他應用程序的許多線程中創建了消息循環。但絕不會在DataSnap或Indy TCP服務器中。 –
我應該提到我正在使用Delphi XE和DSTCP傳輸。在另一個論壇上,Mat DeLong建議使用TDSSessionManager.Instance.AddSessionEvent。不幸的是,對於Delphi XE中的TCP連接,TDSSessionManager效果不佳。 XE2中已經解決了一些嚴重問題。 –
我相信你在這裏做任何事情的機會都需要XE2,它有一些新的功能,可能會減少你的需要,甚至擔心像這個閒置計時器這樣的低級別攻擊。 –