Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 14.05.2012, 19:13
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Функции никуда не записываются. Они выполняются. В контексте какого-либо потока.
Если потоков несколько, то возможно параллельное/псевдопараллельное выполнение, что иногда может привести к плохим последствиям (например, одновременное добавление и удаление записи в ListView).
При вызове Synchronize или Queue, функция будет выполнена главным потоком приложения. Таким образом обеспечивается, что функции не будут выполняться параллельно.
Если база данных одна на все потоки, то желательно поставить.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #17  
Старый 14.05.2012, 20:27
EL190 EL190 вне форума
Новичок
 
Регистрация: 23.04.2012
Сообщения: 50
Репутация: 159
По умолчанию

не могу понять как при методе Queue становятся в очередь?
я сделал пример
Цитата:
procedure TMyThread.Execute;
var i:integer;
begin

for i:=1 to 10000 do
begin
n:=i;
Queue(UpdateCaption);

end;
showmessage('конец');
end;

Цитата:
procedure TMyThread.UpdateCaption;
begin
Form1.UpdateCaption(n);
end;

Цитата:
procedure TForm1.UpdateCaption(i:integer);
begin
showmessage('прогрессбар');
form1.ProgressBar1.Position:=i;
end;

выскакивает showmessage('прогрессбар') я на ОК не нажимаю

выскакивает showmessage('конец');

Вроде все правильно работает поток не ждет завершения TMyThread.UpdateCaption
но после того как поток завершился если нажать на ОК showmessage('прогрессбар')

то progressbar сразу становится в конец (position 10000)

По идее showmessage('прогрессбар') должен был выскачить 10000 раз и при каждом нажатии ОК position долна быть на 1 больше в чем проблема ???????????
Такое чувство что последний кто встал в очередь проходит первый, но даже при таком прогрессбар должен стать в 10000 а потом уменьшаться а он просто становится в посл позицию и стоит а showmessage('прогрессбар') выскакивает 10000 раз

Последний раз редактировалось EL190, 14.05.2012 в 20:50.
Ответить с цитированием
  #18  
Старый 14.05.2012, 20:57
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Думаю так:
Queue добавляет в очередь процедуру TMyThread.UpdateCaption. n для нее - глобальная переменная. Пока до этой процедуры в главном потоке дойдет выполнение, n протикает много значений.
Если в цикле поставить sleep(100) и убрать ShowMessage'ы, то тикать будет потихоньку.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 14.05.2012 в 21:02.
Ответить с цитированием
  #19  
Старый 14.05.2012, 20:59
EL190 EL190 вне форума
Новичок
 
Регистрация: 23.04.2012
Сообщения: 50
Репутация: 159
По умолчанию

кажется я понял каждый раз когда вызывается procedure TForm1.UpdateCaption(i:integer);
i перезписывается
И для всех в очереди оно уже имеет значение последнего перезаписавшего
и тогда при нажатии на ОК Showmessaga во всех 10000 раз i=10000
но я думал что в очереди хранится чтото типа TForm1.UpdateCaption(1),TForm1.UpdateCaption(2)... ...
Ответить с цитированием
  #20  
Старый 14.05.2012, 21:03
EL190 EL190 вне форума
Новичок
 
Регистрация: 23.04.2012
Сообщения: 50
Репутация: 159
По умолчанию

а как сделать чтоб выполнялся только последний в очереди а остальных убирать из нее
Просто интересно
Ответить с цитированием
  #21  
Старый 14.05.2012, 21:06
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Не ставить в очередь лишние.
Как это убрать? Что делать, если прямо сейчас убираемый элемент очереди выполняется?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 14.05.2012 в 21:08.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
EL190 (14.05.2012)
  #22  
Старый 14.05.2012, 21:17
EL190 EL190 вне форума
Новичок
 
Регистрация: 23.04.2012
Сообщения: 50
Репутация: 159
По умолчанию

Цитата:
Что делать, если прямо сейчас этот элемент очереди выполняется?
Чето об этом не подумал...
Они ж становятся в очередь главного потока типа: UpdateCaption, Createcaption ......
Еслиб можно было как нибудь убирать например if выполняется UpdateCaption потока 1 then убрать все за ним стоящие обращения к процедуре UpdateCaption потока 1----ну это я образно


Было бы очень хорошо так бы и sleep не пришлось бы ставить и лишних выполнений UpdateCaption не было бы.
Но без sleep всеравно будут лишние выполнения UpdateCaption

В моем примере их будет 9999 А это по моему очень плохо
Ответить с цитированием
  #23  
Старый 14.05.2012, 21:25
EL190 EL190 вне форума
Новичок
 
Регистрация: 23.04.2012
Сообщения: 50
Репутация: 159
По умолчанию

Да и со sleep не факт что не будет лишних обращений только если ну конечно чем больше его поставиш тем меньше будет лишних обр, но при этом например я принимаю файл он уже принялся а progressbar еще не дойдет до конца
Ответить с цитированием
  #24  
Старый 14.05.2012, 22:01
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Для этого и создан блокирующий режим c Synchronize.
На самом деле задержки передачи по сети измеряются в десятках и иногда даже сотнях миллисекунд, а перерисовка Progressbar - намного меньше. Можно её и подождать.
В крайнем случае, можно сделать массив глобальных переменных и писать каждому Progressbar его позицию, а из главной формы периодически его (массив) обходить и выставлять соответствующие значения в прогресс барах.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 14.05.2012 в 22:04.
Ответить с цитированием
  #25  
Старый 16.05.2012, 00:33
EL190 EL190 вне форума
Новичок
 
Регистрация: 23.04.2012
Сообщения: 50
Репутация: 159
По умолчанию

Не подскажите случаем..
как мне форму сворачивать в трей при OnShow
Пытаюсь так
Цитата:
FileServer.ShownOnce := False;
ShowWindow(FileServer.Handle,SW_HIDE);
CreateTrayIcon;// создает иконку в трее
но нельзя использовать в OnShow

еще пробовал
в OnShow WindowState:=wsMinimized;
Цитата:
procedure TFileServer.WMSYSCOMMAND(var msg: TMessage);
begin
inherited; //обработка минимизирвания окна, не сворачевается а скрывается
if (Msg.wParam=SC_MINIMIZE) then itHideClick(Self);
end;
тоже не получилось

Последний раз редактировалось EL190, 16.05.2012 в 00:37.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter