有人可以告訴我如何創建一個線程在德爾福2010年將「待機」的數據進行計算(不要終止後,其計算任務)?背景工作線程德爾福2010
我創建了一個程序,通過Indy UDPServer從外部源獲取數據。 IdUDPServer1UDPRead事件收集數據並調用不同的線程(取決於數據的類型),但在調試程序時,我看到線程在計算後被終止,然後再次被創建(線程的創建正在進行時間)。 只要輸入數據的頻率大於CPU(或線程)可以處理的數據(線程完成計算之前數據即將到達),我是否可以創建同一線程的fork線程?
這是我嘗試寫代碼:
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AData: TBytes;
ABinding:TIdSocketHandle);
begin
form1.panel2.color:=clLime;
ParseDelimited(IdUDPServer1.ReceiveString,'&');
if (Parsedelimited=1) and (Jvthread1.Terminated=true) then
Jvthread1.Execute(self)
else if (Parsedelimited=2) and (Jvthread2.Terminated=true) then
Jvthread2.Execute(self);
Application.ProcessMessages;
// i know this command is not very good but by removing this line the
//gui is responding //after 2 or 3 sec
end;
的問題是,它需要的JVThread1或JVThread2做計算的時候是比輸入數據更大,它是我相信這個問題是由一次又一次創建線程所需要的時間造成的(也許這是一個錯誤的猜測)。儘管如此,通過將傳入的UDP數據緩存到Indy UDPServer可以部分解決這個問題,但是當我試圖關閉UDPServer時,沒有任何事情發生,直到它的緩衝區完全爲空,這大約需要3-4秒。
歡迎來到Stack Overflow。儘管您已經努力在您的問題中包含詳細信息,但如果您還可以包含代碼,那將是一件好事。以下是編寫好問題的指導原則。 http://stackoverflow.com/questions/how-to-ask –
當我輸入我的答案時,我注意到你添加了另一個答案,這真的是一個問題。 (**注意**如果問題的更多信息,請編輯您的問題,如果是不同的問題,請提出一個全新的問題。)關於您問到的問題:「線程安全性」是一個非常具體的話題,睡眠「是完全無關的。然而'睡眠'雖然不是非常糟糕,但通常被認爲是一個可行的解決方法,因爲你正在停止一個固定的時間。如果需要的話,你寧願能夠被觸發醒來。我的答案列出了更好的替代'睡眠'。 –
@TwentyGotoTen我個人對這樣的更高級別的問題沒有問題。 OP不確定哪些選項可用,並需要一般指導。實際計算的代碼僅用於確認已經清楚的內容:方法在計算完成後結束。 –