2014-01-29 2 views
0

Я хотел бы подготовить асинхронный процесс для процедуры в Delphi Borland 2006 Знаете ли вы, как?Фоновый работник Delphi

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; 

Пример на C#

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'. Он находится в файле справки. В папке Delphi Demos есть образец в Demos \ DelphiWin32 \ VCLWin32 \ Threads. –

+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: BIG no-no, который всегда приводит к неопределенному поведению. Это закончило мое расследование, так как теперь я не доверяю этому компоненту, чтобы делать правильные вещи без тщательного пересмотра/пересмотра. См. Https://blogs.msdn.microsoft.com/oldnewthing/20150814-00/?p=91811. –

2

Испытано с TADOQuery для "Select" запроса.

1) Изменить "ExecuteOptions" "eoAsyncExecute" и "asAsyncFetch" Истинный

2) Использование событий "OnFetchProgress" для детерминированного, это был завершен запрос асинхронного. Если «Прогресс» = «МаксПрогресс», то асинхронный запрос завершен.

Испытано с Delphi 2007 и 2009.

Смежные вопросы