DelphiTwain:如何知道进纸器的扫描已完成

DelphiTwain:如何知道进纸器的扫描已完成,delphi,twain,Delphi,Twain,我正在使用TDelphiTwain组件进行扫描。当我从进纸器开始扫描时,所有扫描都同步执行,当新图像可供处理时,会触发OnTwainAcquire事件。但我找不到如何检查所有冲洗液的扫描是否已经完成。当进纸盘为空时,扫描停止,如果我将新纸张放入进纸器,它将不处理。 所以我需要知道它已经完成,我可以处理接收到的图像。 我可以检查进纸器是否是空的,但我很容易(用我的检查)错过托盘是空的那一刻,所以应用程序会认为新图像即将出现,但它们不会。 我想应该有这样的任务的事件(StartSession/Sto

我正在使用TDelphiTwain组件进行扫描。当我从进纸器开始扫描时,所有扫描都同步执行,当新图像可供处理时,会触发OnTwainAcquire事件。但我找不到如何检查所有冲洗液的扫描是否已经完成。当进纸盘为空时,扫描停止,如果我将新纸张放入进纸器,它将不处理。 所以我需要知道它已经完成,我可以处理接收到的图像。 我可以检查进纸器是否是空的,但我很容易(用我的检查)错过托盘是空的那一刻,所以应用程序会认为新图像即将出现,但它们不会。 我想应该有这样的任务的事件(StartSession/StopSession),但我找不到它

在代码中,它如下所示:

procedure TFormDemo.FormShow(Sender: TObject);
begin
  Twain := TTwainScanner.Create;
  Twain.OnTwainAcquire := Acquire;
  Twain.Source[SelectedDevice].SetFeederEnabled(True);
  Twain.Source[SelectedDevice].Enabled := True; // start
end;

procedure TFormDemo.Acquire(Sender: TObject; const Index: Integer;
  Bitmap: TBitmap; var Cancel: Boolean);
begin
  // some processing
  Cancel := False;
end;
我也捕捉到了一个AcquireProgress事件,但这是当前图像扫描的进度,知道扫描何时停止并没有帮助


更新:我几乎找到了解决方案。当TTwainSource完成TWAIN事件的处理时,它会为TTwainSource设置ENABLED=false。不幸的是,在OnTwainAcquire内部,它仍然是真的,后来它变成了假的,并且没有我可以检查它的事件。就像解决方法一样,我可以通过定时器来检查。

我在这里使用了DelphiTwain
作者同意添加新事件,因此使用更新版本的库问题得以解决。

我发现了无法再测试的旧代码:Twain.Source[x].EnableSource(True,True);当Twain.Source[x]启用do Application.ProcessMessages时;当while循环结束时,您知道扫描已经完成。这不是一个最佳策略,但可以解决您的问题。您可以改为编写一个计时器来检查源是否仍然处于启用状态,或者将整个进程放入一个线程中,以避免使用Application.ProcessMessages。