Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> прогресс выполнения операции, передать из функции/процедуры 
:(
    Опции темы
uwannadie
Дата 16.4.2011, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: 1
Всего: 1



собственно столкнулся с небольшой проблемкой:
есть функция, производящая некоторые действия, причем довольно долго.
как пример:
Код

function some_func(some_param:Some_type): some_type;
begin
//тут мы что-либо очень долго делаем.
end;

соответственно надо прикрутить прогрессбар.
лично я знаю 3 способа передачи:
  • в функции/процедуре напрямую изменять прогресс на компоненте (быдлокодинг, ибо выполняются вычисления в отдельном потоке, причем не всегда надо передавать прогресс на один и тот же компонент)
  • в параметрах функции делать указатель на компонент (не подходит по вышеописанным причинам)
  • использовать механизм сообщений винды. этот способ, по моему мнению, в данной ситуации самый оптимальный.

    но есть пара вопросов:
  • будет ли работать данный механизм в операционках выше хр с включенным UAC без прав админа?
  • есть ли альтернатива этому способу и, если есть, где можно почитать доки?


Это сообщение отредактировал(а) uwannadie - 16.4.2011, 00:55
--------------------
PM MAIL   Вверх
northener
Дата 16.4.2011, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(uwannadie @  16.4.2011,  00:54 Найти цитируемый пост)
будет ли работать данный механизм в операционках выше хр с включенным UAC без прав админа?

А почему бы и нет?

Цитата(uwannadie @  16.4.2011,  00:54 Найти цитируемый пост)
есть ли альтернатива этому способу 

Если я правильно понял вопрос, то имхо нет.


Цитата(uwannadie @  16.4.2011,  00:54 Найти цитируемый пост)
в функции/процедуре напрямую изменять прогресс на компоненте (быдлокодинг, ибо выполняются вычисления в отдельном потоке

Это даже не быдлокодинг. Это просто недопустимо в VCL.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 16.4.2011, 06:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



можно в потоке устанавливать переменную - счетчик процентов, а в основном потоке по таймеру считывать значение и отображать. 
Считывание и запись делать interlocked-функциями


--------------------
Обижено школьников: 8
PM MAIL   Вверх
uwannadie
Дата 16.4.2011, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: 1
Всего: 1



Цитата(bems @  16.4.2011,  06:47 Найти цитируемый пост)
можно в потоке устанавливать переменную - счетчик процентов, а в основном потоке по таймеру считывать значение и отображать. 
Считывание и запись делать interlocked-функциями 

прикольная штука, не знал о таком.
возник вопрос: а если основной потом - vcl?


--------------------
PM MAIL   Вверх
northener
Дата 17.4.2011, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(uwannadie @  16.4.2011,  13:52 Найти цитируемый пост)
прикольная штука, не знал о таком.
возник вопрос: 
Цитата

а если основной поток - vcl?


Прикольный вопрос - а об чем вы ещё не знали?
Вы сказали что знаете три "способа передачи". При том первые два способа никуда не годятся.
bems вам дал ещё один способ. Четвёртый. Только вот для его реализации требуются знания, которые трудно найти в Яндексе, Гугле и т.д.
И после всего этого вы спрашиваете "а если основной поток - vcl?" ???
Купите учебник!



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
uwannadie
Дата 17.4.2011, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: 1
Всего: 1



Цитата(northener @  17.4.2011,  01:27 Найти цитируемый пост)
Прикольный вопрос - а об чем вы ещё не знали?
Вы сказали что знаете три "способа передачи". При том первые два способа никуда не годятся.
bems вам дал ещё один способ. Четвёртый. Только вот для его реализации требуются знания, которые трудно найти в Яндексе, Гугле и т.д.
И после всего этого вы спрашиваете "а если основной поток - vcl?" ???
Купите учебник!

во-первых, знать все невозможно. но можно стремиться узнать как можно больше. и то, что я не знаю того или иного, совсем не означает что я не хочу ничего нового узнать.
во-вторых, примерную реализацию этого способа я прекрасно понял,  достаточно было глянуть страничку Gunsmoker-a и MSDN, а вопрос задал, желая уточнить нюансы, чтобы не изобретать велосипеды.
а в-третьих, не надо опускаться до уровня тыканья лицом в грязь, могу поспорить, что и у Вас запас знаний далеко не безграничен.



--------------------
PM MAIL   Вверх
bems
Дата 17.4.2011, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



То что это vcl не мешает, потому что обращение из разных потоков идет не к vcl-объекам, а к одной переменной размером в машинное слово.
Чтобы прочитать её нужно вызвать InterlockedExchangeAdd(), вторым паоаметром передв 0, чтобы записать - InterlockedExchange.
Тут важно помнить, что каждая такая операция атомарна, но последовательность из них уже нет. поэтому нельзя сначала вызвать InterlockedExchangeAdd, и если значение удовлетворяет каким-то требованиям, то изменить его с помощью InterlockedExchangeAdd - на момент изменения оно уже может быть другим.

Но в твоём сценарии ничего такого нет - в рабочем потоке устанавливай проценты, в vcl по таймеру считывай и отображай полученное число.

Добавлено через 2 минуты и 31 секунду
Конечно ты должен как-то гарантировать, что переменная существует всё время что к ней обращаются


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2305 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.