![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про
Спрашивающий © (2002-12-16 09:00:00)У меня в прграмме работает цикл выполняющий определенные вычисления для большого колличества данных при этом компьютер не виснит а как можно выразиться "подвисает" на время выполнения данного цикла, т.е. не воспринимает команды: от клавиатуры, мыши,невозможна работа с другими программами и т.д.). Я хочу чтобы при выполнении данной операции можно было работать с другими приложениями пока идет цикл. Как это сделать .
Digitman (2002-12-18 09:01:00) [1]
> KSergey
Ок. Сойдемся таки на понятии "сообщение" как на более точно отражающем первопричинную суть.
Хотя смысловой контекст обоих терминов весьма схож - сообщение, поставленное системой в целевую очередь, для целевого код.потока в некотором роде является событием, реагировать или не реагировать на которое он может по своему усмотрению.
В той же VCL во многих случаях событие (точнее - факт его возбуждения) является практически прямым следствием реакции на сообщение
Song (2002-12-18 08:36:00) [2]2Интересно (18.12.02 03:21)
Просто не переключился и написал ответ автоматически. Имя же запоминается и его вводить не надо.
Интересно (2002-12-18 03:21:00) [3]2 Song © (17.12.02 08:31)
Усёк. Но я и не сомневался в том.
Но был бы не прочь именовать уважаемого (без иронии) Анатолия по отчеству, почему и спросил о "первой Р".
И все таки не пойму - зачем отвечать на вопросы как "арр", а не как Anatoly Podgoretsky?
KSergey (2002-12-17 09:27:00) [4]
> Digitman © (16.12.02 11:54)
> >KSergey
>
> >>События приложению как минимум не адресуются
>
> Ничего подобного. ну и т.д...
Чтобы не нагнетать обстановку, просто уочню еще раз, что я хотел придрался только к словам, а не к смыслу. Как вы и сами знаете, в виндовсе нет понятия "событие" (во всяком случае в том смысле, в каком оно есть в дельфи), следоватеьно событя адресовать (т.е. рассылать) никто не может. ;) Извините, что не по смыслу придрался, а по глупости.
app (2002-12-17 08:58:00) [5]Digitman © (16.12.02 11:54)
Вот видишь достаточно было спросить, что бы поняли, что так поступать некрасиво.
Song (2002-12-17 08:31:00) [6]app - модератор
Интересно (2002-12-17 03:08:00) [7]2 app
Анатолий, а что означает первое "p" в данном нике?
И почему Вы в последнее время "едины в двух лицах"?
Спрашивающий (2002-12-17 01:56:00) [8]Мастера всем спасибо Application.ProcessMessages вполне устроил.
Отдельно приношу извинения Digitman © за не корректное обращение.
Danlicha (2002-12-16 12:22:00) [9]А вот по-моему, если стоит DMA, то подобное обращение к диску наоборот должно "успокаивать" систему, т.к. в то время, как с винта читаются данные, остальные процессы прекрасно могут таботать. Многие люди не включают DMA, а потом удивляются, что это так комп виснет. Но это ен совсем по теме, пардон. А так, конечно, поток нужно делать. Если очень критично, можно читать из файла не по строчке, а по кластерам, ну хоть по 16 кб. А если уж совсем критично, то нужно делать два потока - один дитает новюу порцию данных, другой обрабатывает предыдущую. Хотя "наглость" программы от этого не уменьшится.
Digitman (2002-12-16 11:57:00) [10]
> Цифровая строка из файла
Вот это и наводит на подозрение, что в цикле таки происходит вызов файловых ф-ций ядра. Здесь, возможно, и есть "узкое" место, из-за которого твой процесс "тормозит" все прочие процессы системы.
Подробней ...
Digitman (2002-12-16 11:54:00) [11]>app
Никак не отношусь. До тех пор, пока нет откровенного хамства.
>KSergey
>>События приложению как минимум не адресуются
Ничего подобного. Сообщения, адресованные окнам и потокам процесса, успешно ставятся в соответствующие очереди, но вот за выборку из этих очередей нужных сообщений отвечают циклы каждого из заинтересованных код.потоков процесса. И если код.поток процесса длительное время занят какими-то своими "делами" и не выбирает (хотя бы эпизодически) сообщения из "своих" очередей, то и реагировать на них оперетивно код.поток будет не в состоянии. Ибо реакция на сообщение - это его обработка ПОСЛЕ выборки из очереди.
>Спрашивающий
> компьютер действительно подвисает.Пробовал и на Пне 166
и на 900.
Такое впечатление действительно может создаваться, если в "тяжелом" цикле твоего приложения происходит интенсивное обращение к приоритетным системным операциям или неразделяемым сист.ресурсам.
Если твой "тяжелый" цикл не делает ничего мудреней, чем инкремент какой-нибудь лок.переменной, то такой цикл в принципе не может "подвесить" другие процессы системы !
Спрашивающий (2002-12-16 11:01:00) [12]Цикл элементарный но значений много
procedure TForm1.Button1Click(Sender: TObject);
var
J:Integer;
E:Extended;
begin
E:=0;
For J:=1 To 200000 или больше Do
E:=E+Sqrt(StrToFloat(Trim(Цифровая строка из файла)));
end;
KSergey (2002-12-16 10:45:00) [13]> Спрашивающий (16.12.02 10:07)
> ЦифрМэн знаете компьютер действительно подвисает.Пробовал
> и на Пне 166 и на 900.
Тогда цикл в студию! Что-то действительно странно... Возможно, затормаживает другие приложения, работать они начинают медленее, но не до полной же их заморозки,а?
> Digitman © (16.12.02 09:53)
> Application.ProcessMessages в цикле ... позволяет приложению реагировать на адресованные
> ему сообщения/события...
Простите, придерусь к словам (сам не знаю зачем): позволяет реагировать на адресованные сообщения. И все! События приложению как минимум не адресуются ;)
NailS (2002-12-16 10:39:00) [14]
> Спрашивающий (16.12.02 10:07)
> знаете компьютер действительно подвисает
100% загрузка процессора не означает повисания компьютера.
Он просто много работает ;)
app (2002-12-16 10:30:00) [15]Digitman © (16.12.02 09:53)
Как ты относишься к целенаправленному искажению твоего псевдонима?
Спрашивающий (2002-12-16 10:07:00) [16]ЦифрМэн знаете компьютер действительно подвисает.Пробовал и на Пне 166 и на 900.
Сергей (2002-12-16 09:58:00) [17]ЦифрМэн прав по поводу замедления при использовании Application.ProcessMessages, так что если цикл реально нагружен, то я бы так не делал.
Digitman (2002-12-16 09:53:00) [18]Ничего универвального не бывает. Всякая задача оптимизируется индивидуально.
Application.ProcessMessages в цикле - палка о двух концах. С одной стороны, позволяет приложению реагировать на адресованные ему сообщения/события, с другой стороны - при "тяжелых" и неразумно построенных циклах - резко снижает производительность процесса данного приложения.
А вот твое утверждение о том, что из-за "подвисания" приложения, выполняющего длит.цикл, "виснет" весь компьютер (читай - другие приложения, работающие параллельно в системе), вызывает большие сомнения.
Сергей (2002-12-16 09:53:00) [19]Могёшь, братуха, написать и Application.ProcessMessages. Ghfdlf dcz "nf ,tlf yfxbyftn lbrj vtlktyytt hf,jnfnm
Спрашивающий (2002-12-16 09:50:00) [20]Спасибо Song.