2009-10-02 230 views
4

允許對象在線程上執行方法的最佳解決方案是什麼?該對象是TThread的所有者,該線程僅包含一個TidHTTP(阻塞套接字)來發布請求並解析響應。如何在單獨的線程上執行某些命令?

實施例:

  • 對象>的線程
  • 線程中執行請求>經由idHTTP發送請求,等待應答,將結果發送到對象
  • 螺紋>等待另一個請求
  • 對象>根據請求的結果更新UI

回答

4

一個相對安全的方式與第讀取使用命令隊列。

  • 對象在隊列中發出請求(使用信號量)。
  • 胎面檢查(使用信號燈)隊列,如果它充滿執行最久遠的請求(如果你願意,你可以 介紹的優先級)。
  • 如果任務完成,則會通知對象(例如,使用回調函數)。

線程通常睡,只有醒來以檢查隊列。如果什麼都沒有做,它會「按下貪睡按鈕」並再次睡覺。

一定要警惕利用信號量對隊列的訪問。否則會有數據損壞的可能性,並且您有難以發現的錯誤。

+0

感謝您的回答:) – Ariel32 2009-10-02 11:09:23

0

我不知道「最好」 - 取決於你的標準是什麼。如果您對自己的要求稍作擴展,我們可能會提供更具體的幫助。與此同時...

最簡單的方法是讓所屬對象寫請求的線程,無論是到一個或多個屬性或通過一個公共的方法。屬性/方法後面的數據字段不能直接通過主執行例程訪問:使用由Synchronize()調用的方法將這些數據字段複製到可由Execute()例程使用的變量中。當速度不是主要目標時,我使用這種方法,並且擁有的對象不需要排隊多個請求。

很多人貶損使用同步,但它取決於你正在努力實現的功能。我試圖讓事情變得簡單,直到需求需求爲止。

如果吞吐量更是一個問題,或者如果你需要有重疊的請求,你可以使用一個隊列來存儲請求,以獲得由TCriticalSection控制的隊列。你也可以直接使用TThreadList,或者作爲你自己的類型化存儲的基礎 - 我不知道TThreadList的通用等價物,雖然可能有一個。

+0

感謝您的幫助!我需要使用隊列來存儲請求,並且線程只能同時執行一個請求。我不能生成更多的線程使用相同的idHTTP,因此即使所有的請求都是獨立的,它們也必須一一執行。我正在處理的應用程序在這篇文章中有更多解釋:http://stackoverflow.com/questions/1506212/complex-software-architecture – Ariel32 2009-10-02 11:32:00

1

的另一種方法,值得一提的是由Andreas Hausladen使用Async Calls。這是一個簡單易用且寫得很好的線程包裝器,它在功能性環境中運行良好。

相關問題