Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
stanilar Member Откуда: Спб Сообщений: 850 |
TTestThread = class(TThread) public Value : Longint; procedure Execute; override; end; TThreadForm = class(TForm) ProgressBar1: TProgressBar; Timer1: TTimer; procedure FormShow(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } Thread : TTestThread; end; procedure TTestThread.Execute; begin while not Terminated do Value := Value + 1; end; procedure TThreadForm.FormShow(Sender: TObject); begin ProgressBar1.Max := High(Longint) div 2; Thread := TTestThread.Create(False); end; procedure TThreadForm.Timer1Timer(Sender: TObject); begin if Thread.Value > ProgressBar1.Max then begin Thread.suspend; Thread.Value := 0; Thread.Resume; end; ProgressBar1.Position := Thread.Value; end; При этом ProgressBar1 только информирует пользователя о том, что поток работает, а не повис. |
30 сен 13, 14:01 [14901512] Ответить | Цитировать Сообщить модератору |
Марат Сафин Member Откуда: Сообщений: 619 |
stanilar, Чтение не требует блокировки. |
30 сен 13, 14:06 [14901560] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 48796 |
Синхронизация не нужна, нужно код переписать. Проверку на переполнение и сброс счётчика перенести в поток, suspend-resume из таймера убрать. Posted via ActualForum NNTP Server 1.5 |
30 сен 13, 14:06 [14901565] Ответить | Цитировать Сообщить модератору |
stanilar Member Откуда: Спб Сообщений: 850 |
Переделал:
|
|||
30 сен 13, 14:31 [14901781] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 26223 |
Хоть бы Sleep(1) в цикл добавил. |
||
30 сен 13, 14:33 [14901799] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 48796 |
Как там в пословице про бога и лоб?.. procedure TTestThread.Execute; begin while not Terminated do begin Inc(Value); end; end; procedure TThreadForm.Timer1Timer(Sender: TObject); begin ProgressBar1.Position := Thread.Value mod ProgressBar1.Max; end; Posted via ActualForum NNTP Server 1.5 |
||
30 сен 13, 14:37 [14901839] Ответить | Цитировать Сообщить модератору |
stanilar Member Откуда: Спб Сообщений: 850 |
|
||
30 сен 13, 14:40 [14901867] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 48796 |
Но не таким же способом, который грубо нарушает инкапсуляцию. Posted via ActualForum NNTP Server 1.5 |
30 сен 13, 14:56 [14901999] Ответить | Цитировать Сообщить модератору |
stanilar Member Откуда: Спб Сообщений: 850 |
Вам сложно угодить. |
30 сен 13, 15:04 [14902059] Ответить | Цитировать Сообщить модератору |
Все форумы / Delphi | ![]() |