Wątek poboczny obsługujący osobne okno z postępem danej operacji

0

Witam,

czy ktoś z Was dysponuje przykładem lub jest ogarnięty z wątków i potrafi napisać prosty przykład działającego wątku, który wyglądałby następująco:

Cały moduł składa się z 1 unitu i 1 okna:

WaitProgress.pas; frmWaitForm.pas, frmWaitForm.dfm;

Unit

WaitProgress.pas

posiadałby dwie globalne procedury:

ShowWaitProgress(Form: TForm = nil);
CloseWaitProgress(Form: TForm = nil)

A okno frmWaitForm jakiś element graficzny lub komponent typu WaitProgress, który ukazywałby przebieg procesu dopóki, dopóty nie wywołamy procedure CloseWaitProgress.

ShoWaitProgress - Wyświetla okno frmWaitForm i animuje coś... np ProgressBar w kółko (przykładowo)
CloseWaitProgress - Zamyka i zwalnia okno oraz zakańcza działanie wątku

Przykład:

Unit Main;

uses WaitProgress;

interface

procedure TForm1.Button1.OnClick(Sender: TObject);
begin
  Dataset1.SelectSQL.Text := 'select * from tabela';
  ShowWaitProgress(self); // Pokaż okno animacji
  DataSet1.Open;
  CloseWaitProgress(self); // Koniec animacji;
end;

Parametr

TForm 

w procedure Show/Close WaitProgress jest dodatkiem, aby w zależności od potrzeby np. przy starcie wątku wykonać Form.Enabled := False;


Z góry dziękuję za pomoc.
0

to tak nie zadziała (a dokładniej rzecz biorąc nie jest to takie łatwe - forma musiała by mieć swoją własną kolejkę komunikatów i wątek). Wątek główny służy do obsługi GUI i tak też jest skonstruowany. Do operacji długotrwałych służą właśnie wątki poboczne. W takiej postaci jak chcesz to zrobić będziesz miał jeden z dwóch efektów - albo błąd mówiący o próbie odwołania się do elementów GUI z wątku pobocznego albo "element animacji" nie będzie reagował aż do zakończenia DataSet1.Open;. Która to będzie opcja zależeć będzie od Twojego kodu, jedna wydaje mi się, że która by to nie była i tak nie będzie spełniać oczekiwań.

0

Ehh... w takim razie co mogę zrobić, aby w jakiś sposób zobrazować użytkownikowi zajętość programu, pomijając kursor crHourGlass czy sztywny napis "Proszę czekać"?

Musi być jakiś prosty sposób...

0

do wątku "wkłada się" to co trwa długo i może "zamrozić" program. Całą obsługę "proszę czekać" robi się w wątku głównym

0

No tak, w tym wypadku "Proszę czekać" w postaci ProgressBara zwiększającego Position będzie zamrażało program.
Przykład:

ProgressBar1.Position := ProgressBar1.Position + 1;
Sleep(10); // zamrożenie
Application.ProcessMessages;

Ktoś może inny zna sposób na stworzenie tzw. WaitProgress "latającego, lub kręcącego się - ala'windows 8' podczas, gdy wykonywane są inne operacje w programie np. otwieranie dataseta, czy długa pętla for?

0

Jedy ma w komplecie ThreadDialog (razem z przykładami).

0

Synchronize?

0

Przykład z jedi nie działa, wysypuje się wewnątrz biblioteki. Mam najnowszą wersję Jedi Delphi XE3/4.

Ktoś ma inny pomysł?

0

ja [CIACH!] - nie wiem jak ci inaczej (prościej) napisać - te "inne operacje w programie np. otwieranie dataseta, czy długa pętla for?" muszą być w osobnych wątkach!!!! Cokolwiek byś zrobił inaczej będzie to tylko proteza, nic więcej w dodatku nie zawsze działająca tak jakby miała działać.
Tu masz mój komponent - protezę Komunikaty w trakcie wykonywania innej operacji

1 użytkowników online, w tym zalogowanych: 0, gości: 1