2014-01-29 52 views
0

我想爲程序編寫異步程序Delphi Borland 2006你知道嗎?在C#後臺工作者德爾福

application.ProcessMessages; 
    dm001.Proc.Close; 
    dm001.Proc.Parameters.Clear; 
    dm001.Proc.ProcedureName:='[dbo].[EXAMPLE]'; 
    dm001.Proc.Parameters.AddParameter.Name:='@idEXAMPLE'; 
    dm001.Proc.Parameters.ParamByName('@id').DataType:="example"; 
    dm001.Proc.Parameters.ParamByName('@id').Value:="example"; 
    dm001.Proc.Open; 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 

    for (int i = 1; (i <= 10); i++) 
    { 
     if ((worker.CancellationPending == true)) 
     { 
      e.Cancel = true; 
      break; 
     } 
     else 
     { 
      // Perform a time consuming operation and report progress. 
      System.Threading.Thread.Sleep(500); 
      worker.ReportProgress((i * 10)); 
     } 
    } 
} 

private void buttonStart_Click(object sender, RoutedEventArgs e) 
{ 
    if (bw.IsBusy != true) 
    { 
     bw.RunWorkerAsync(); 
    } 
} 
+0

'TThread'。它在幫助文件中。在Demos \ DelphiWin32 \ VCLWin32 \ Threads的Delphi Demos文件夾中有一個示例。 –

+1

在D2006中,您需要使用一個線程。創建一個從'TThread'派生的類。如果您使用的是現代Delphi,則可以使用OTL。 –

+0

感謝您的幫助我會檢查它。 –

回答

3

BackgroundWorker的不超過一個線程執行更多。但有一個組件在Delphi上模擬此行爲,如TBackgroundWorker

+0

在檢查此組件的源代碼後的30秒內,我發現它調用了TerminateThread:一個總是導致未定義行爲的BIG no-no。這結束了我的調查,因爲現在我不相信這個組件在沒有徹底的審查/修改的情況下做正確的事情。請參閱:https://blogs.msdn.microsoft.com/oldnewthing/20150814-00/?p=91811 –

+0

在檢查此組件的源代碼後的30秒內,我發現它調用TerminateThread:一個總是很大的否定導致未定義的行爲。這結束了我的調查,因爲現在我不相信這個組件在沒有徹底的審查/修改的情況下做正確的事情。請參閱:https://blogs.msdn.microsoft.com/oldnewthing/20150814-00/?p = 91811 –

2

測試與TADOQuery爲 「選擇」 的請求。

1)改變 「ExecuteOptions」 「eoAsyncExecute」 和 「asAsyncFetch」 爲True

2)使用事件 「OnFetchProgress」 爲確定的,並異步請求完成。如果「進度」=「MaxProgress」,則異步請求完成。

測試用Delphi 2007年和2009年