«работает, пожалуйста, подождите» экран с резьбой? - PullRequest
4 голосов
/ 16 января 2010

Возможно, это очень просто для вас, но я усердно работаю над проектом (в образовательных целях), который запрашивает рекламу с компонентом TADSISearch в течение нескольких дней.Я пытаюсь показать заставку «Работает, пожалуйста, подождите ...» с анимированным gif-файлом с рабочим в Form2, пока TADSISearch выполняет поиск в Active Directory.Хотя я испробовал все возможности, согласно мне, но я не смог добиться успеха.Я пытался использовать TADSISearch в потоке, но поток завершается до завершения ADSIsearch.Я думаю, что TADSISearch не является потокобезопасным.Как вы думаете?Кроме того, еще один способ, которым я создал Form2 и использовал поток для его обновления, но анимированный GIF останавливается, в то время как основная форма перестала искать рекламу.Что вы можете сказать по этому поводу?Как сделать экран ожидания, пока работает ADSISearch, и отвечать основной форме.Application.ProcessMessages или таймер тоже не способ.Большое спасибо за чтение и ответы.

Ответы [ 4 ]

9 голосов
/ 16 января 2010

Графический интерфейс пользователя должен обновляться основным потоком. Вы должны поместить свой поисковый код в отдельный поток, и пока поток поисковика работает, ваш основной поток может показать анимацию вместе с сообщением «Please wait».

Ваш поисковый поток может уведомить основной поток, когда поиск выполняется любым из доступных методов синхронизации. Самый простой способ - определить метод в вашем классе потока, который останавливает анимацию в пользовательском интерфейсе, и передать этот метод для синхронизации в конце метода Execute вашего потока поисковика.

Код вашего поискового потока будет примерно таким:

type
  TMyThread = class(TThread)
  private
    procedure NotifyEndOfThread;
  protected
    procedure Execute; override;
  end;

implementation

uses MainFormUnit;

procedure TMyThread.NotifyEndOfThread;
begin
  MainForm.ShowAnimation := False;
end;

procedure TMyThread.Execute;
begin
  try
    {Add your search code here}
  finally
    Synchronize(NotifyEndOfThread);
  end;
end;

И код вашего основного потока будет выглядеть так:

TMainForm = class(TForm)
...
private 
  FShowAnimation : Boolean;
  procedure SetShowAnimation(Value: Boolean);
public
  property ShowAnimation : Boolean read FShowAnimation write SetShowAnimation;
end;

procedure TMainForm.SetShowAnimation(Value: Boolean);
begin
  FShowAnimation := Value;
  if FShowAnimation then
    {Add animation code here}
  else
    {Stop animation}
end;
3 голосов
/ 16 января 2010

Может быть, вы можете попробовать это:

Резьбовой Splashscreen для Delphi
http://cc.embarcadero.com/Item/20139

Я использую это в приложениях с сенсорным экраном / терминалом (тонкий клиент, Wifi, RemObjects и т. Д.), И это прекрасно работает! Также получил анимированный рабочий GIF.

1 голос
/ 16 января 2010

Как поток может быть прерван до окончания поиска? Если поиск выполняется в потоке, и у вас есть только один экземпляр потока, он должен работать.

0 голосов
/ 16 января 2010

Можете ли вы не просто сделать

f := TMyWaitForm.Create(self);
try
   f.Show();
   ...start the TADSISearch...
finally
   FreeAndNil(f);
end;

Поместить анимированный GIF в TMyWaitForm (который отображает себя)?

У меня есть форма прогресса при создании веб-сайтов в моей программе создания веб-сайтов, и это работает как шарм.

Вы даже можете рассмотреть возможность отображения некоторой информации о состоянии в форме ожидания (если компонент / программное обеспечение TADSISearch имеет функцию обратного вызова или событие, которое можно назначить).

Отображение запущенных часов, показывающих, сколько времени занимает процесс, также приятно.

...