views:

409

answers:

6

Dear Programmers,

Perhaps, it is very easy for you, but I am hard working on a project (for educational purposes) that is querying adsi with TADSISearch component, for several days. I'm trying to show a 'Working, Please wait..' splash screen with a man worker animated gif on Form2 while TADSISearch is searching the Active Directory. Although i tried every possibilities according to me, but i couldn't succeed. I tried to use TADSISearch in a thread, but thread is terminating before ADSIsearch finishes. I think TADSISearch is not thread safe. What do you think? Also, another way that I created Form2 and used a thread for updating it but the animated gif is stopping while main form gone adsi searching. What can you say about these? How can i make a please wait screen while ADSISearch is working and keep main form responding. Application.ProcessMessages or timer is not a way too. Thanks a lot for reading and answers.

+1  A: 

How can the thread terminate before the search is finished? If the search is executed in the thread and you have only one instance of the thread it should work.

birger
I don't know, i am asking that already. Perhaps, because of TADSISearch component's being not thread-safe.
Knn
A: 

Can you not just do a

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

Putting an animated GIF on the TMyWaitForm (which displays itself) ?

I have a progress form when building websites in my web creation program, and this works like a charm.

You even may consider showing some state information on the wait form (if the TADSISearch component/software has a call back function or event which can be assigned).

Displaying a running clock showing the amount of time the process is taking, is also a nice touch.

Edelcom
He can't. As the TADSISearch is performing the search in the main thread, the main message loop is not processing messages so the gif would not update (nor any other kind of user interface updates).
Jorge Córdoba
I also tried using TADSISearch component in a thread that's doing synchronize to update animated gif's form (Form2) as:TMyThread.Execute;var ADSISearch: TADSISearch;begin ADSISearch stuff... Synchronize(doUpdate);end;TMyThread.doUpdate;begin Form2.Update;end;
Knn
+7  A: 

The graphical user interface should be updated by the main thread. You should put your search code into a separate thread, and while the searcher thread is working, your main thread can show the animation along with "Please wait" message.

Your searcher thread can notify the main thread when search is done by any of the available synchronization techniques. The simplest one is to define a method in your thread class which stops the animation in user interface, and pass that method to Synchronize at the end of Execute method of your searcher thread.

Your searcher thread code will be something like this:

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

implementation

uses MainFormUnit;

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

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

And your main thread's code will be like this:

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;
vcldeveloper
where to use ADSISearch?
Knn
You can add your ADSISearch code in Execute method where I mentioned; "{Add your search code here}". Of course I haven't used TADSISearch component you mentioned in your post, and I don't know how exactly it works.
vcldeveloper
sorry, didn't see
Knn
+1  A: 

Maybe you can try this:

Threaded Splashscreen for Delphi
http://cc.embarcadero.com/Item/20139

I use this on a touchscreen/terminal application (thin client, Wifi, RemObjects, etc) and it works nice! Also got an animated gif working.

André
A: 

Can it be ADSISearch's bind error in thread? I want to ask if we create ADSISearch in main unit, it is executing normally but program doesn't respond until its finish. If we create ADSIsearch in a thread it is giving bind error. Why? Because of thread's not using current windows credentials?

Knn
A: 

Thanks a lot to everybody interested. I did it with adoquery in thread. That's the great way. No need to use component (because they are not thread-safe) Thanks.

Knn