![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
||||
|
||||
|
Функции никуда не записываются. Они выполняются. В контексте какого-либо потока.
Если потоков несколько, то возможно параллельное/псевдопараллельное выполнение, что иногда может привести к плохим последствиям (например, одновременное добавление и удаление записи в ListView). При вызове Synchronize или Queue, функция будет выполнена главным потоком приложения. Таким образом обеспечивается, что функции не будут выполняться параллельно. Если база данных одна на все потоки, то желательно поставить. |
|
#17
|
|||
|
|||
|
не могу понять как при методе Queue становятся в очередь?
я сделал пример Цитата:
Цитата:
Цитата:
выскакивает showmessage('прогрессбар') я на ОК не нажимаю выскакивает showmessage('конец'); Вроде все правильно работает поток не ждет завершения TMyThread.UpdateCaption но после того как поток завершился если нажать на ОК showmessage('прогрессбар') то progressbar сразу становится в конец (position 10000) По идее showmessage('прогрессбар') должен был выскачить 10000 раз и при каждом нажатии ОК position долна быть на 1 больше в чем проблема ??????????? Такое чувство что последний кто встал в очередь проходит первый, но даже при таком прогрессбар должен стать в 10000 а потом уменьшаться а он просто становится в посл позицию и стоит а showmessage('прогрессбар') выскакивает 10000 раз Последний раз редактировалось EL190, 14.05.2012 в 20:50. |
|
#18
|
||||
|
||||
|
Думаю так:
Queue добавляет в очередь процедуру TMyThread.UpdateCaption. n для нее - глобальная переменная. Пока до этой процедуры в главном потоке дойдет выполнение, n протикает много значений. Если в цикле поставить sleep(100) и убрать ShowMessage'ы, то тикать будет потихоньку. Последний раз редактировалось Bargest, 14.05.2012 в 21:02. |
|
#19
|
|||
|
|||
|
кажется я понял каждый раз когда вызывается procedure TForm1.UpdateCaption(i:integer);
i перезписывается И для всех в очереди оно уже имеет значение последнего перезаписавшего и тогда при нажатии на ОК Showmessaga во всех 10000 раз i=10000 но я думал что в очереди хранится чтото типа TForm1.UpdateCaption(1),TForm1.UpdateCaption(2)... ... |
|
#20
|
|||
|
|||
|
а как сделать чтоб выполнялся только последний в очереди а остальных убирать из нее
Просто интересно |
|
#21
|
||||
|
||||
|
Не ставить в очередь лишние.
![]() Как это убрать? Что делать, если прямо сейчас убираемый элемент очереди выполняется? Последний раз редактировалось Bargest, 14.05.2012 в 21:08. |
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
EL190 (14.05.2012)
| ||
|
#22
|
|||
|
|||
|
Цитата:
Они ж становятся в очередь главного потока типа: UpdateCaption, Createcaption ...... Еслиб можно было как нибудь убирать например if выполняется UpdateCaption потока 1 then убрать все за ним стоящие обращения к процедуре UpdateCaption потока 1----ну это я образно Было бы очень хорошо так бы и sleep не пришлось бы ставить и лишних выполнений UpdateCaption не было бы. Но без sleep всеравно будут лишние выполнения UpdateCaption В моем примере их будет 9999 А это по моему очень плохо |
|
#23
|
|||
|
|||
|
Да и со sleep не факт что не будет лишних обращений только если ну конечно чем больше его поставиш тем меньше будет лишних обр, но при этом например я принимаю файл он уже принялся а progressbar еще не дойдет до конца
|
|
#24
|
||||
|
||||
|
Для этого и создан блокирующий режим c Synchronize.
![]() На самом деле задержки передачи по сети измеряются в десятках и иногда даже сотнях миллисекунд, а перерисовка Progressbar - намного меньше. Можно её и подождать. В крайнем случае, можно сделать массив глобальных переменных и писать каждому Progressbar его позицию, а из главной формы периодически его (массив) обходить и выставлять соответствующие значения в прогресс барах. Последний раз редактировалось Bargest, 14.05.2012 в 22:04. |
|
#25
|
|||
|
|||
|
Не подскажите случаем..
как мне форму сворачивать в трей при OnShow Пытаюсь так Цитата:
еще пробовал в OnShow WindowState:=wsMinimized; Цитата:
Последний раз редактировалось EL190, 16.05.2012 в 00:37. |