Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.03.16;
Скачать: [xml.tar.bz2];

Вниз

длительный процесс (риторический вопрос)   Найти похожие ветки 

 
tButton ©   (2008-02-07 01:06) [40]


> Anatoly Podgoretsky ©   (06.02.08 12:58) [31]

не спорю. я сам не понимаю зачем меня спрашивают "зачем ты делишь код на модули"
про процессМесаджес мы уже давно разобрались


> ANB   (06.02.08 18:04) [36]

читайте
> tButton ©   (06.02.08 02:10) [13]


 
_Mike_   (2008-02-07 02:00) [41]

Блин. Как много рассуждений про Synchnize. А что, PostMessage/SendMessage и WM_COPY_DATA уже забанили? (ну ладно SendMessage - она в принципе аналогично Synchronize получится)


 
tButton ©   (2008-02-07 02:10) [42]

итак выдалось чуть-чуть побольше свободного времени
немного разъясню

есть объект myData: tMyData;
который отвечает за загрузку ресурсов
в определенный момент в приложении происходит вызов одного из методов этого объекта
myData.Load("index.lst");
этот метод читает список файлов и последовательно загружает ресурсы выбирая для каждого отдельного файла загрузчик основываясь на его заголовке
(загружаем все что надо вызовом одного метода, вместо того чтоб грузить все вручную поштучно)
файлов может быть много и загрузка может занять некоторое время.
разобрались. понятно. вот он длительный процесс.

в то же время в приложении есть еще один объект - myGraph: tMyGraph.
который отвечает за прорисовку окна.
еще у нас есть таймер
обработчик события которого вызывает нужные методы объекта myGraph

 ...
 if myData.state = dsLoading then  // идет загрузка
 begin
   myGraph.DrawLoadScreen(myData.progress);
 end;
 ...
 myGraphRender(Canvas.Handle);  // вывод изображения на форму
 ...

здесь тоже все предельно просто
но есть нюанс, когда будет вызван метод myData.Load("index.lst"); выполнение всего прочего когда, в том числе - обработка событий, в том числе - событий таймера, будет приостановлено. т.е. отрисовка прекратится.

ВНИМАНИЕ дальше раскрывается тайный смысл дискуссии

воизбежание остановки отрисовки окна
достаточно подключить к модулю в котором описан метод tMyData.Load(file_list: string); модуль Forms,  и в самом методе переодически вызывать Application.ProcessMessages (предварительно изменив значение свойства progress, основываясь на общем количестве файлов и количестве уже обработаных)

ПыСы
автор, не глупый человек, и знает различия между модулем и процессом.
ПыПыСы
если вы дочитали до этой строчки - спасибо вам за потраченое время и уделенное внимание.


 
Сергей М. ©   (2008-02-07 08:46) [43]


> когда будет вызван метод myData.Load("index.lst"); выполнение
> всего прочего когда, в том числе - обработка событий, в
> том числе - событий таймера, будет приостановлено. т.е.
> отрисовка прекратится


Что же мешает доработать сам метод Load для устранения этой "проблемы", вместо того чтобы городить огород с доп.тредами и синхронизацией ?


 
Dennis I. Komarov ©   (2008-02-07 09:32) [44]

dpr
...
Application.Initialize;
......
AnyForm:=TAnyForm.Create(Application)
AnyForm.Show;
...
while not myData.Loaded do
 Application.ProcessMessage;
...
Application.CreateForm(...........
...


 
oxffff ©   (2008-02-07 09:44) [45]


> Dennis I. Komarov ©   (07.02.08 09:32) [44]


То есть ты предлагаешь сделать myData.Loaded аля Yield в C#.
Таким образом получается что Loaded должна быть функцией и должна быть реализовано с сохранением предыдущего состояния.
Как то не кузяво.


 
oxffff ©   (2008-02-07 09:46) [46]


> oxffff ©   (07.02.08 09:44) [45]


Имееется ввиду Loaded -> аля Enumerator по итерациям Big Task.


 
oxffff ©   (2008-02-07 09:50) [47]

To автор.

Если хочещь сделать параллельно и чтобы твое приложение хорошо масштабировалось

>этот метод читает список файлов и последовательно загружает ресурсы >выбирая для каждого отдельного файла загрузчик основываясь на его >заголовке

то см. в сторону IocompletionPort или QueueUserWorkItem.


 
Dennis I. Komarov ©   (2008-02-07 09:56) [48]

> [45] oxffff ©   (07.02.08 09:44)

myData - это его класс???

procedure TmyData.Load.....
begin
 FLoaded:=false;
 try
   ...
 finally
   FLoaded:=true;
 end;
end;


 
ANB   (2008-02-07 10:03) [49]


> Что же мешает доработать сам метод Load для устранения этой
> "проблемы", вместо того чтобы городить огород с доп.тредами
> и синхронизацией ?

Он уже передумал.


> автор, не глупый человек, и знает различия между модулем
> и процессом.

А так же между процессом и потоком ? :)


 
tButton ©   (2008-02-07 10:06) [50]

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


 
oxffff ©   (2008-02-07 10:22) [51]


> Dennis I. Komarov ©   (07.02.08 09:56) [48]
> > [45] oxffff ©   (07.02.08 09:44)
>
> myData - это его класс???
>
> procedure TmyData.Load.....
> begin
>  FLoaded:=false;
>  try
>    ...
>  finally
>    FLoaded:=true;
>  end;
> end;


Пока эта процедура не отработает до ProcessMessage не дойдет, хоть ставь ты  FLoaded, хоть не ставь.
Понял?


 
tButton ©   (2008-02-07 10:22) [52]

Он уже передумал.
да выж всю душу вытрясете =)
1) треды это новое. это надо вкуривать.
2) для моих целей вполне хватит процееМессаджес

А так же между процессом и потоком
А так же между процессом и потоком

Dennis I. Komarov ©   (07.02.08 09:32) [44]
спасибо, сплэшскрин не нужен. вышея сказал что метод вызывается в определенный момент (ну не очень определенный, но не обязательно при запуске)


 
oxffff ©   (2008-02-07 10:25) [53]


> спасибо, сплэшскрин не нужен.


А где он?


 
tButton ©   (2008-02-07 10:27) [54]

Он уже передумал.
да выж всю душу вытрясете =)
1) треды это новое. это надо вкуривать.
2) для моих целей вполне хватит процееМессаджес

А так же между процессом и потоком
А так же между процессом и потоком

Dennis I. Komarov ©   (07.02.08 09:32) [44]
спасибо, сплэшскрин не нужен. вышея сказал что метод вызывается в определенный момент (ну не очень определенный, но не обязательно при запуске)


 
tButton ©   (2008-02-07 10:35) [55]

oxffff ©   (07.02.08 10:25) [53]
в 44м посте
"...
создается форма
отображается

начинается загрузка
идет загрузка
завершается загрузка

создается основная форма
рисуется
..."
это называется сплэшскрин. картинка выскакивающая на экран когда вы запускаете дельфи, фотошоп, 3д макс, четвертую сивилизацию... splash screen


 
oxffff ©   (2008-02-07 10:40) [56]


> tButton ©   (07.02.08 10:35) [55]


Такое там тоже есть?

while проверяем флаг do Application.ProcessMessage;

А зачем?


 
oxffff ©   (2008-02-07 10:42) [57]


> Dennis I. Komarov ©   (07.02.08 09:56) [48]


А ты в отдельном потоке загрузку хочешь сделать?
То даже, если так то в основном потоке у тебя будет огромный
overhead, по причине постоянной проверки очереди сообщений.
в ProcessMessage увы нет WaitMessage.
Так что тоже не кузяво.


 
Anatoly Podgoretsky ©   (2008-02-07 11:39) [58]


> зыж
> вопрос риторический)

Риторический вопрос - это вопрос на который отвечать не надо.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2008.03.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.163 c
2-1203435055
WestNik
2008-02-19 18:30
2008.03.16
Печать текста развернутого на 90 градусов


2-1203060480
SkyN
2008-02-15 10:28
2008.03.16
Глобальный $DEFINE для всех модулей


15-1202490749
Пробегал...
2008-02-08 20:12
2008.03.16
Компилятор выбрасывает условие


15-1201798852
NiGGa
2008-01-31 20:00
2008.03.16
Компонент отображающий графики


11-1185758323
Dr. Andrew
2007-07-30 05:18
2008.03.16
Как установить стиль XP для кнопок и ползунка ScrollBar?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский