【问题标题】:Background Worker Delphi后台工作者 Delphi
【发布时间】:2014-01-29 12:13:43
【问题描述】:

我想为Delphi Borland 2006中的程序准备异步进程,你知道怎么做吗?

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();
    }
}

【问题讨论】:

  • TThread。它在帮助文件中。在您的 Delphi Demos 文件夹中有一个示例,在 Demos\DelphiWin32\VCLWin32\Threads 中。
  • 在 D2006 中您需要使用线程。创建一个从TThread 派生的类。如果您使用的是现代 Delphi,则可以使用 OTL。
  • 感谢帮助我会检查它。
  • 另一个很好的例子:stackoverflow.com/a/18236774/327083
  • 我的大多数用例都是从 tthread 派生并使用一个线程在后台执行某些操作,偶尔会有反馈,所以我想知道为什么一开始没有将其制成组件。

标签: multithreading delphi asynchronous delphi-2006


【解决方案1】:

BackgroundWorker 只不过是一个线程实现。但是Delphi上有一个组件可以模拟这种行为,比如TBackgroundWorker

【讨论】:

  • 在检查这个组件的源代码的 30 秒内,我发现它调用了 TerminateThread:一个大禁忌,总是导致未定义的行为。这结束了我的调查,因为现在我不相信这个组件在没有彻底审查/修订的情况下做正确的事情。见:blogs.msdn.microsoft.com/oldnewthing/20150814-00/?p=91811
【解决方案2】:

使用 TADOQuery 测试“选择”请求。

1) 将“ExecuteOptions”“eoAsyncExecute”和“asAsyncFetch”改为True

2) 使用事件“OnFetchProgress”确定异步请求是否完成。如果 "Progress" = "MaxProgress" 则异步请求完成。

使用 Delphi 2007 和 2009 进行测试。

【讨论】:

    【解决方案3】:

    您可以试试备受推崇的AsyncCalls 单元。在Delphi 2009 发布之后,它并没有得到更多的发展,但无论如何你都不会使用它。

    【讨论】:

      猜你喜欢
      • 2011-07-29
      • 1970-01-01
      • 2011-10-30
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多