分類  >  編程>Delphi >

一百分求解.可累加.對某個線程池的不解以及到失望.

tags:    時間:2014-05-04 19:37:30
一百分求解.可追加.對某個線程池的不解以及到失望....
這些天在看了幾個線程池,最後敲定了uThreadPool.pas....到最後調試的時候才發現,他並不是併發線程,而是排隊模式執行任務的....這樣的效率只能算是多線程...而且網下DOWN的幾個樣本回來.有的發現創建線程后,就一直不釋放.有的人說是等待免得再重新創建線程.我則不以為然,而且初始化的和結束線程也有問題...未能執行..最終的一塊判斷線程池是否為空時.出現更大的錯誤.軟體直接卡死半個小時不動


procedure TCustomWorkTask.TQueueEmpty(Sender: TThreadsPool;
  EmptyKind: TEmptyKind);
begin
  {try
    ACs.Enter;
    form1.Memo2.Lines.Add(Sender.ClassName+'現在池內任務為空!'+#13);
  finally
    ACs.Leave;
  end;        }
end;

完整代碼:http://blog.csdn.net/jian704/article/details/1834122
我上面的問題有哪位朋友遇到過的沒....
------解決方案--------------------
併發線程,而是排隊模式 啟動它們(這個用時很短)的,但是具體的 執行(這個才是長時間的任務),應該是 多線程併發進行了 
------解決方案--------------------
  不知道樓主想實現什麼樣的線程池?線程池就是創建幾個線程,來了任務喚醒,執行完休眠。
簡單任務可以用匿名線程,很方便
------解決方案--------------------
大概看了下樓主的代碼,這個是cnVCL中的線程池代碼,10年前的代碼啦,本身就有些問題
------解決方案--------------------
在線程里直接操作vcl,是有問題的
需要加 同步,但是 加了同步,又失去了併發的意義

所以,不用多個線程同時操作界面控制項
------解決方案--------------------
線程池 應該比較簡單的吧

一個list,每項對應一個線程對象
有新任務,找個掛起的線程對象,由它運行
運行完畢,掛起
都在運行,新增一項,對應新創建的線程對象,由它運行
------解決方案--------------------
引用:
我測試了很多次..我把一個線程的執行時間從一分鐘調到十分鐘.按照他上面的是每隔三十秒喚醒一個線程來執行任務..那麼應該同時就有二個線程執行.可是最後我還是看到那個線程一直在執行.第二個線程並未同時執行....所以感覺很雞肋..

樓上的哥哥不知道有沒有測試過.


看你的工作線程是怎麼寫的?這個線程池實現很簡單,要看怎麼用。

特別需要注意的是TProcessorThread(FThreads[i]).Terminate;如果子類的實現未遵守「規則」,即使關閉了應用,線程也還是在跑(進程還在,通常會倒置進程無法退出)  

目前比較好的第三方線程管理庫是OmniThreadLibrary,比較大,需要看他的UML圖。
------解決方案--------------------
樓主要搞清楚所有的線程都是在系統時鐘控制下運行的。所謂的併發,也只是系統在極短的時間內切換的
------解決方案--------------------
引用:
樓主要搞清楚所有的線程都是在系統時鐘控制下運行的。所謂的併發,也只是系統在極短的時間內切換的


多核的電腦,應該可以在不同的核同時運行多個線程
但實際上似乎不是這樣
------解決方案--------------------
線程池就是用過了以後不銷毀,下次接著用,不這麼乾的就不是線程池。你要對此不以為然就乾脆不要用線程池。

推薦閱讀文章

Bookmark the permalink ,來源:互聯網