Форум: "Прочее";
Текущий архив: 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