|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Функции никуда не записываются. Они выполняются. В контексте какого-либо потока.
Если потоков несколько, то возможно параллельное/псевдопараллельное выполнение, что иногда может привести к плохим последствиям (например, одновременное добавление и удаление записи в ListView). При вызове Synchronize или Queue, функция будет выполнена главным потоком приложения. Таким образом обеспечивается, что функции не будут выполняться параллельно. Если база данных одна на все потоки, то желательно поставить. jmp $ ; Happy End! The Cake Is A Lie. |
#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'ы, то тикать будет потихоньку. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось 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
|
||||
|
||||
Не ставить в очередь лишние.
Как это убрать? Что делать, если прямо сейчас убираемый элемент очереди выполняется? jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось 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 его позицию, а из главной формы периодически его (массив) обходить и выставлять соответствующие значения в прогресс барах. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 14.05.2012 в 22:04. |
#25
|
|||
|
|||
Не подскажите случаем..
как мне форму сворачивать в трей при OnShow Пытаюсь так Цитата:
еще пробовал в OnShow WindowState:=wsMinimized; Цитата:
Последний раз редактировалось EL190, 16.05.2012 в 00:37. |