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

Вниз

Тормоза   Найти похожие ветки 

 
Askalot ©   (2010-06-22 00:38) [0]

У меня в программе по таймеру каждую секунду совершается масса вычислений в трехмерном массиве 80х60х10 и компьютер сильно тормозит. Я начинающий программист, подскажите, можно ли как то уменьшить тормоза? Например отдавать под каждую переменную ограниченную память, как то очищать память, выставить приоритеты процессору. Если можно, то дайте ссылку на подобную информацию.


 
KilkennyCat ©   (2010-06-22 00:44) [1]

http://www.sdteam.com/?tid=386


 
Askalot ©   (2010-06-22 00:56) [2]

Спасибо, думаю поможет )


 
KilkennyCat ©   (2010-06-22 01:21) [3]

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


 
Германн ©   (2010-06-22 01:27) [4]


> но не зацикливайся на этом

Угу.
Кстати о птичках. А визуализация процесса этих вычислений есть?


 
Askalot ©   (2010-06-22 01:30) [5]

Да. Каждые 0.05 секунды это все рисуется на canvas. Но я нажимаю на кнопку остановления вычислений и тормоза полностью прекращаются, хотя перерисовка канваса продолжается.


 
sniknik ©   (2010-06-22 01:30) [6]

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


 
Германн ©   (2010-06-22 02:08) [7]


> sniknik ©   (22.06.10 01:30) [6]
>
> на что спорить?

Да не на что. Об чём мне с тобой, Коля спорить?
:)
Очевидность проблемы была сама собой понятна. А Костя ещё и помог своей "подсказкой". :)


 
Юрий Зотов ©   (2010-06-22 07:33) [8]

Ох, и намучается же человек с такой "подсказкой"...

> Askalot ©   (22.06.10 00:38)

Если Вы сделаете точно как в статье, то это не поможет. Поэтому прежде, чем использовать эту подсказку, разберитесь по справке с методом Synchronize. Скорее всего, он или не понадобится Вам совсем, или понадобится только для визуального отображения расчетов.


 
Юрий Зотов ©   (2010-06-22 07:39) [9]

Блин. Человек, путающий потоки с процессами, не понимающий назначение метода Synchronize, берется писать статью о классе TThread.

Как только не стыдно!


 
Сергей М. ©   (2010-06-22 09:13) [10]

Толи Карих Архангельского со Фленовым начитался, толи наоборот)


 
RWolf ©   (2010-06-22 09:24) [11]


>  можно ли как то уменьшить тормоза?

оптимизируй алгоритм для как можно более последовательного доступа к данным, чтобы оптимально нагружать кэш процессора.
Грубо говоря, a[1]+a[2]+...+a[10] выполнится быстрее, чем a[1]+a[100000].


 
KilkennyCat ©   (2010-06-22 10:33) [12]

Виноват, каюсь. Я все не читал, нашел первую ссылку в гугле, глянул - табличка со свойствами, методами есть...


 
Ega23 ©   (2010-06-22 10:47) [13]


> путающий потоки с процессами


Stream - поток
Thread - нить
Англо-русский словарь (с)


 
Anatoly Podgoretsky ©   (2010-06-22 11:15) [14]

> Ega23  (22.06.2010 10:47:13)  [13]

Стремнина
Нитина/Шредер


 
Askalot ©   (2010-06-22 11:39) [15]

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


 
Priority   (2010-06-22 11:57) [16]

>>А если засунуть все это в процесс

А сейчас оно у тебя где?!

и дать ему очень высокий приоритет

Гы... становится совсем интересно!

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

"И тогда мы с Сашкой выпили еще Fanta и повесили сервер Cray Jaguar" (С) Реклама

Товарисч! Высокий приоритет процесса не говорит о том, что процессор станет вдруг турбированным. Высокий приоритет процесса говорит о том, что процессу будет отдаваться бОльшее количество процессорного времени. И если твой алгоритм сильно нагружает процессор, то все остальные процессы будут в полном ауте.

*Подстеркательским тоном*: ты ему поставь приоритет THREAD_PRIORITY_TIME_CRITICAL...


 
12 ©   (2010-06-22 11:59) [17]


> Askalot ©   (22.06.10 11:39) [15]

код когда будет?


 
Hip-Hop   (2010-06-22 12:00) [18]

Ну вы и флудеры

Лучше иногда быть флудером, чем самоуверенным ленивым дилетантом.


 
Омлет ©   (2010-06-22 12:04) [19]

Озвучь, что именно вычисляется и зачем.
Скорее всего, можно оптимизировать сами вычисления или подход к задаче.


 
Askalot ©   (2010-06-22 12:05) [20]

Это еще два раза повторяется, все не стал копировать ) Это жизнь дерева.
Я уже как то выкладывал скриншот http://xmages.net/upload/bb2b3524.jpg

for i := 0 to 80 do
begin
for y := 0 to 60 do
begin
if kletka3[i,y,1]>=0 then
begin
if kletka3[i,y,5]>0 then
begin
// изменение основных параметров
kletka3[i,y,2]:=kletka3[i,y,2]+1;
if kletka3[i,y,5]<kletka3[i,y,6] then kletka3[i,y,5]:=kletka3[i,y,5]+1;
if kletka3[i,y,7]<kletka3[i,y,8] then kletka3[i,y,7]:=kletka3[i,y,7]+1;
if kletka3[i,y,4]<=kletka3[i,y,2] then kletka3[i,y,10]:=kletka3[i,y,10]+1;
if kletka3[i,y,2]=kletka3[i,y,3] then kletka3[i,y,5]:=-10;
if kletka1[i,y,1]>-1 then kletka3[i,y,5]:=-10;
// светолюбивость
svet:=0;
if kletka3[i-1,y-1,1]>-1 then svet:=svet+1;
if kletka3[i,y-1,1]>-1 then svet:=svet+1;
if kletka3[i+1,y-1,1]>-1 then svet:=svet+1;
if kletka3[i-1,y+1,1]>-1 then svet:=svet+1;
if kletka3[i,y+1,1]>-1 then svet:=svet+1;
if kletka3[i+1,y+1,1]>-1 then svet:=svet+1;
if kletka3[i-1,y,1]>-1 then svet:=svet+1;
if kletka3[i+1,y,1]>-1 then svet:=svet+1;
if kletka3[i,y,12]=1 then
begin
if svet>=3 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=4 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=5 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=6 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=8 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
end;
if kletka3[i,y,12]=2 then
begin
if svet>=4 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=6 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=8 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
end;
if kletka3[i,y,12]=4 then
begin
if svet<=1 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet<=3 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet<=5 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
end;
if kletka3[i,y,12]=5 then
begin
if svet<=1 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet<=3 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet<=4 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet<=5 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet<=6 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
end;
// влаголюбивость
voda:=0;
if kletka3[i,y,13]=0 then voda:=1;
if kletka3[i,y,13]=1 then
begin
for k := -4 to 4 do
begin
for t := -4 to 4 do
begin
if (kletka1[i+k,y+t,1]>-1) and (i+k>0) and (y+t>0) and (i+k<=80) and (y+t<=60) then voda:=1;
end;
end;
end;
if kletka3[i,y,13]=2 then
begin
for k := -10 to 10 do
begin
for t := -10 to 10 do
begin
if (kletka1[i+k,y+t,1]>-1) and (i+k>0) and (y+t>0) and (i+k<=80) and (y+t<=60) then voda:=1;
end;
end;
end;
if kletka3[i,y,13]=3 then
begin
for k := -15 to 15 do
begin
for t := -15 to 15 do
begin
if (kletka1[i+k,y+t,1]>-1) and (i+k>0) and (y+t>0) and (i+k<=80) and (y+t<=60) then voda:=1;
end;
end;
end;
if kletka3[i,y,13]=4 then
begin
for k := -20 to 20 do
begin
for t := -20 to 20 do
begin
if (kletka1[i+k,y+t,1]>-1) and (i+k>0) and (y+t>0) and (i+k<=80) and (y+t<=60) then voda:=1;
end;
end;
end;
if kletka3[i,y,13]=5 then
begin
for k := -30 to 30 do
begin
for t := -30 to 30 do
begin
if (kletka1[i+k,y+t,1]>-1) and (i+k>0) and (y+t>0) and (i+k<=80) and (y+t<=60) then voda:=1;
end;
end;
end;
if voda<>1 then kletka3[i,y,5]:=kletka3[i,y,5]-5;

// размножение
if kletka3[i,y,10]>=kletka3[i,y,9] then
begin
xr:=0;
yr:=0;
xxx:=i;
yyy:=y;
xr:=round(random(kletka3[i,y,11]*2+1)-kletka3[i,y,11]);
yr:=round(random(kletka3[i,y,11]*2+1)-kletka3[i,y,11]);
xxx:=i+xr;
yyy:=y+yr;
if (kletka1[xxx,yyy,1]<1) and (kletka3[xxx,yyy,1]<1) and (xxx>=0) and (xxx<=wid) and (yyy>=0) and (yyy<=hei) then
begin
kletka3[i,y,10]:=0;
rx:=xxx*45+round(random(20)-40);
ry:=yyy*45+round(random(20)-40);
kletka3[xxx,yyy,1]:=1;
kletka3[xxx,yyy,17]:=rx;
kletka3[xxx,yyy,18]:=ry;
minimap[xxx,yyy,3].Left:=xxx*2;
minimap[xxx,yyy,3].top:=yyy*2;
for k:=1 to 15 do
begin
kletka3[xxx,yyy,k+1]:=strtoint(objekt[kletka3[i,y,16],k]);
end;
end;
end;

end
else
begin
// гниение
kletka3[i,y,14]:=kletka3[i,y,14]+1;
kletka3[i,y,7]:=0;
kletka3[i,y,10]:=0;
// удаление с карты
if kletka3[i,y,14]=kletka3[i,y,15] then
begin
minimap[i,y,3].Left:=-100;
for k := 1 to 100 do
begin
kletka3[i,y,k]:=-1;
end;
end;
end;
end;
end;
end;


 
ixen ©   (2010-06-22 12:25) [21]

можно еще использовать Application.ProcessMessages;
в циклах где идут вычисления помогает работать с другими программами не создавая эфекта зависания


 
Игорь Шевченко ©   (2010-06-22 12:36) [22]

Askalot ©   (22.06.10 12:05) [20]

Как ты только в этом разбираешься...


 
RWolf ©   (2010-06-22 12:54) [23]

вот это твоё kletka3[i,y,5] — сколько раз за цикл оно вычисляется?
не лучше ли вместо крайнего правого индекса сделать запись (тем более, что по смыслу это и есть запись, которая содержит значения каких-то параметров клетки), а дальше один раз за цикл вычислять указатель pKletka = @kletka3[i,y] и дальше работать уже с ним?


 
Askalot ©   (2010-06-22 12:57) [24]


> можно еще использовать Application.ProcessMessages;

Это помогло, но начались тормоза другого плана - похоже все эти вычисления теперь не успевают просчитаться за секунду и рассчитываются только для первой половины деревьев. Когда нажимаю на паузу, то только тогда начинают расти остальные деревья. Сейчас еще поэксперементирую.


 
Askalot ©   (2010-06-22 13:18) [25]


> RWolf

По моему количество вычислений останется тем же, все равно для каждой из 4800 клеток в которой что-то есть придется считать её параметры отдельно. Или же записи вычисляются быстрее массивов?


 
RWolf ©   (2010-06-22 13:22) [26]

ключевое слово — указатель:

> один раз за цикл


 
Юрий Зотов ©   (2010-06-22 13:22) [27]

> Askalot ©   (22.06.10 12:57) [24]

1. Перенесите вычисления в отдельный поток.

2. При создании потока передайте ему хэндл формы.

3. Закончив порцию расчета, поток заполняет его результатами какую-то структуру и через PostMessage (только не SendMessage) посылает форме сообщение WM_USER+100, в нем чере WParam передает адрес этой структуры, а сам считает дальше.

4. В обработчике этого сообщения форма берет из структуры данные и  обновляет картинку.

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


 
Юрий Зотов ©   (2010-06-22 13:23) [28]

НЕ мешая, конечно.
:o)


 
RWolf ©   (2010-06-22 13:24) [29]

кстати, в настройках проекта Range checking включено? надо отключить.


 
Юрий Зотов ©   (2010-06-22 13:29) [30]


> RWolf ©   (22.06.10 13:24) [29]

При отладке - не надо ни в коем случае. После окончательной отладки - можно.


 
Askalot ©   (2010-06-22 13:35) [31]

Эххх, как все сложно ( Спасибо всем за помощь, сейчас мануалы почитаю, может разберусь


 
KilkennyCat ©   (2010-06-22 14:13) [32]

я бы в массиве хранил только дату создания объекта в клетке и тип объекта.
алгоритм был бы такой:
type
 TPole = record
   Objct : byte;// тип объекта (дерево, трава, вода...)
   Time : integer; //время объекта
end;

begin
var
Pole : array[0..xx, 0..yy] of TPole
...

for x := 0 to xx do //бег по строкам поля
 for y := 0 to yy do  //бег по столбцам поля
   
             // мне пора бежать на работу, поэтому просто опишу
берем Pole[x, y].Time, увеличиваем его на единицу и рисуем на временный битмап из таблицы спрайтов bmp.draw(x, y , arraysprite[Pole[x,y].objct, Pole[x,y].Time])
соответсвенно, arraysprite хранит все состояния.
итого, что мы получили?

for x := 0 to xx do
 for y := 0 to yy do      
    bmp.draw(x, y , arraysprite[Pole[x,y].objct, Pole[x,y].Time])

и итоговый BitBlt

Кроме того, отрисовывать только видимую область. И никаких вычислений...


 
KilkennyCat ©   (2010-06-22 14:16) [33]

немного забыл: :)
for x := 0 to xx do
for y := 0 to yy do begin
   inc(Pole[x,y].Time);
   if (Pole[x,y].Time > умерло и исчезло) then Pole[x,y].Time := 0;
   bmp.draw(x, y , arraysprite[Pole[x,y].objct, Pole[x,y].Time]);
 end;


 
Askalot ©   (2010-06-22 14:49) [34]


> KilkennyCat

Все дело в том, что мне эти вычисления нужны =) Например деревья растут только вблизи воды, если светолюбивые то не могут расти очень плотно, к тому же они сами размножаются )
Отрисовка у меня происходит примерно так же, в отдельном цикле. В зависимости от возраста дерева меняется номер картинки и записывается в массив, а затем рисуется изображение под этим номером из массива с картинками.


 
RWolf ©   (2010-06-22 14:56) [35]

кстати, в строке kletka3[xxx,yyy,k+1]:=strtoint(objekt[kletka3[i,y,16],k]); этот самый strtoint так ли уж нужен? довольно медленная операция, не для циклов.


 
Askalot ©   (2010-06-22 15:07) [36]


> RWolf

Ок, сделаю отдельно перевод в число один раз, а то действительно каждый раз делать глупо )


 
KilkennyCat ©   (2010-06-22 15:08) [37]


> Askalot ©   (22.06.10 14:49) [34]

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


 
cyber-pilot   (2010-06-22 15:10) [38]

вот этот код:


if svet>=3 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=4 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=5 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=6 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=8 then kletka3[i,y,5]:=kletka3[i,y,5]-1;


равнозначен этому:
if svet>=3 then kletka3[i,y,5]:=kletka3[i,y,5]-1;

И еще несколько похожих мест заметил.


 
RWolf ©   (2010-06-22 15:12) [39]


> cyber-pilot   (22.06.10 15:10) [38]

не равнозначен.


 
cyber-pilot   (2010-06-22 15:19) [40]

Ой, глючу. Вот этому равнозначен:


case svet of
 3: kletka3[i,y,5]:=kletka3[i,y,5]-1;
 4: kletka3[i,y,5]:=kletka3[i,y,5]-2;
 5: kletka3[i,y,5]:=kletka3[i,y,5]-3;
 6: kletka3[i,y,5]:=kletka3[i,y,5]-4;
 7: kletka3[i,y,5]:=kletka3[i,y,5]-4;
 >8: kletka3[i,y,5]:=kletka3[i,y,5]-5;
end;


 
Омлет ©   (2010-06-22 15:20) [41]

тихий ужас...

> cyber-pilot   (22.06.10 15:10) [38]
> вот этот код:
> равнозначен этому:
> if svet>=3 then kletka3[i,y,5]:=kletka3[i,y,5]-1;


Нет. Вот этому:
if svet >= 3 then dec(kletka3[i,y,5], min(svet, 8) - 2);


 
Омлет ©   (2010-06-22 15:21) [42]

> cyber-pilot   (22.06.10 15:19) [40]

Этому тем более не равнозначен ))


 
Омлет ©   (2010-06-22 15:22) [43]

> [42]

вру. невнимателен )


 
Омлет ©   (2010-06-22 15:24) [44]

А круче так:
dec(kletka3[i,y,5], max(2, min(svet, 8)) - 2);


 
cyber-pilot   (2010-06-22 15:28) [45]


> [44]

для svet = 7 не подходит, хотя скорее всего исходный алгоритм не корректный )


 
Askalot ©   (2010-06-22 15:30) [46]

Да там все что угодно можно написать ) ну вы и команды навыдумывали, я кроме if и for ничего не знаю )


 
Омлет ©   (2010-06-22 15:30) [47]

А, блин, мы оба неправы. Там же магические числа - 7 пропущено


 
Омлет ©   (2010-06-22 15:33) [48]

> Askalot ©   (22.06.10 15:30) [46]

Опиши лучше сам алгоритм расчета параметров.
По коду его понять трудно.


 
nobody   (2010-06-22 15:35) [49]

Установи профилировщик AQTime и потестируй под ним.
Он тебе покажет узкие места в программе, которые больше всего съедают ресурсов.


 
Askalot ©   (2010-06-22 15:53) [50]


> Омлет

kletka3[i,y,5] - это здоровье дерева
svet - это количество деревьев рядом
если svet>3 то здоровье дерева уменьшается на 1;
если svet>4 то здоровье дерева уменьшается еще на 1;
...
это для светолюбивого дерева, для тенелюбивого наоборот =)


 
Ascalot &#169;   (2010-06-22 18:43) [51]

>>Юрий Зотов ©   (22.06.10 13:22) [27]

3. Закончив порцию расчета, поток заполняет его результатами какую-то структуру и через PostMessage (только не SendMessage) посылает форме сообщение WM_USER+100, в нем чере WParam передает адрес этой структуры, а сам считает дальше.


Это еще почему это? Только ради уменьшения количества тормозов? Или по какой другой причине?

В общем-то, в [27] есть несколько спорных моментов. Где хранится структура? Кто ее создает? Кто уничтожает? Сколько должно быть таких структур, одна или несколько? Как прозводится управление доступом к этой структуре?


 
12 ©   (2010-06-22 19:13) [52]

> kletka3[i,y,5] - это здоровье дерева
> svet - это количество деревьев рядом
> если svet>3 то здоровье дерева уменьшается на 1;
> если svet>4 то здоровье дерева уменьшается еще на 1;
> ...
> это для светолюбивого дерева

где логика..


 
Askalot ©   (2010-06-22 20:19) [53]


> где логика..

Всмысле? Деревьям не хватает света и они умирают.


 
Юрий Зотов ©   (2010-06-22 20:28) [54]

> Ascalot ©   (22.06.10 18:43) [51]

>> только не SendMessage
> Это еще почему это? Только ради уменьшения количества тормозов?
>  Или по какой другой причине?

Чтобы вычислительный поток не ждал, пока главный поток все отрисует, а продолжал считать параллельно отрисовке. Но если время отрисовки незначительно по сравнению с временем счета, то можно использовать и SendMessage.

> В общем-то, в [27] есть несколько спорных моментов.

Может быть, все же не спорных, а непонятных?

> Где хранится структура? Кто ее создает? Кто уничтожает? Сколько
> должно быть таких структур, одна или несколько? Как прозводится
> управление доступом к этой структуре?

Чудесные вопросы. Но все они вызывают встречный вопрос (правда, лишь один): кто разрабатывает программу - Вы или я?

Если разработчик - Вы, то все эти вопросы Вы сами и должны решить. Тем более, что это вопросы не архитектуры а ее реализации (раз), что они элементарны (два), и что как именно Вы их решите - без разницы (три).

А если разработчик - я, то почему не озвучено ТЗ, сроки и сумма?


 
Askalot ©   (2010-06-22 20:36) [55]


> Юрий Зотов

Вы прочитайте внимательно ник, это не я писал а какой то шутник =) Я такие премудрости и спрашивать бы побоялся =) Мне и таймера хватает )


 
Юрий Зотов ©   (2010-06-22 21:03) [56]

> Askalot ©   (22.06.10 20:36) [55]

Действительно. Тогда вот Ваша программа (структуру передаваемых для отрисовки данных, методы CalculateData и DrawData допилите сами):

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

const
 Msg_DataReady = WM_USER + 101;

type
 PDataRecord = ^TDataRecord;
 TDataRecord = record // Допилить
   Int: integer;
 end;

 TMyThread = class(TThread)
 private
   FFormHandle: THandle;
   procedure CalculateData(PData: PDataRecord); // Допилить
 protected
   procedure Execute; override;
 public
   constructor Create(CreateSuspended: boolean; FormHandle: THandle);
 end;

 TForm1 = class(TForm)
   procedure FormDblClick(Sender: TObject);
 private
   FThread: TMyThread;
   procedure MsgDataReady(var Msg: TMessage); message Msg_DataReady;
   procedure DrawData(PData: PDataRecord); // Допилить
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

 { TMyThread }

procedure TMyThread.CalculateData(PData: PDataRecord);  // Допилить
begin
 PData^.Int := PData^.Int + 1;
 Sleep(3000) // Имитация длительных вычислений
end;

constructor TMyThread.Create(CreateSuspended: boolean; FormHandle: THandle);
begin
 FFormHandle := FormHandle;
 inherited Create(CreateSuspended)
end;

procedure TMyThread.Execute;
var
 DataRecord: TDataRecord;
begin
 DataRecord.Int := -1;
 while not Terminated do
 begin
   CalculateData(@DataRecord);
   SendMessage(FFormHandle, Msg_DataReady, Integer(Self), Integer(@DataRecord))
 end
end;

 { TForm1 }

procedure TForm1.DrawData(PData: PDataRecord); // Допилить
begin
 Caption := "Это число рассчитано вторым потоком: " + IntToStr(PData^.Int)
end;

procedure TForm1.FormDblClick(Sender: TObject);
begin
 if FThread = nil then
   FThread := TMyThread.Create(False, Handle)
end;

procedure TForm1.MsgDataReady(var Msg: TMessage);
begin
 DrawData(PDataRecord(Msg.LParam))
end;

end.


 
Омлет ©   (2010-06-22 23:03) [57]

> Askalot ©   (22.06.10 15:53) [50]

Нормально, ага. Чем больше света, тем быстрее дерево умрёт.


 
Askalot ©   (2010-06-22 23:49) [58]


> svet - это количество деревьев рядом

Т.е. это сколько деревьев загораживают свет =) Я долго не задумываюсь над названиями переменных =)


 
MsGuns ©   (2010-06-23 00:21) [59]

Посмотрел [20] сдуру..
Теперь спать не буду блин..
Я б таких програматоров в Воронеж, в глушь, в деревню, к теткам :)


 
KilkennyCat ©   (2010-06-23 00:27) [60]

вообще-то, это все очень схоже с алгоритмом "Жизнь", а его реализация доведена практически до совершенства, рекомендую изучить.


 
MsGuns ©   (2010-06-23 00:40) [61]

Меня в ступор ввело из ппрведенной статьи вот это :
procedure TMyThread.Execute;
begin
  {Если Вы хотите, чтобы процедура DoWork выполнялась лишь один раз - удалите цикл while}
  while not Terminated do
    Synchronize(DoWork);
end;

procedure TMyThread.DoWork;
begin
  {Здесь можно уже выполнять те задачи, которые должны быть исполнены процессом} end;
   

Или я уже совсем сплю, или тварисч реально не понимает что такое синхронизация и зачем она нужна


 
Askalot ©   (2010-06-23 00:45) [62]


> Посмотрел [20] сдуру..
> Теперь спать не буду блин..
> Я б таких програматоров в Воронеж, в глушь, в деревню, к
> теткам :)

А что такое, нормальный код, даже комментарии есть =)))


 
Askalot ©   (2010-06-23 00:50) [63]

Кстати, я подправил код, убрал кое-что лишнее и теперь почти не тормозит. Теперь тормоза начинаются только когда вся карта полностью заселяется деревьями, но они небольшие, жить можно )


 
Askalot &#169;   (2010-06-23 01:06) [64]

>>Askalot ©   (23.06.10 00:50) [63]
>>А что такое, нормальный код, даже комментарии есть


То есть, наличие комментариев является признаком "нормальности" кода?
То есть, если я с комментариями напишу ахинею, то ахинея вдруг станет нормальным кодом?


 
Askalot ©   (2010-06-23 01:27) [65]

Заколебали такие умники, я учился на курсах один год три года назад, конечно я не знаю многих команд, но даже с такими командами я могу сделать вполне нормальную программу.


 
Германн ©   (2010-06-23 01:46) [66]


> MsGuns ©   (23.06.10 00:40) [61]
>
> Меня в ступор ввело из ппрведенной статьи вот это :
> procedure TMyThread.Execute;
> begin
>   {Если Вы хотите, чтобы процедура DoWork выполнялась лишь
> один раз - удалите цикл while}
>   while not Terminated do
>     Synchronize(DoWork);
> end;
>
> procedure TMyThread.DoWork;
> begin
>   {Здесь можно уже выполнять те задачи, которые должны быть
> исполнены процессом} end;    
>
> Или я уже совсем сплю, или тварисч реально не понимает что
> такое синхронизация и зачем она нужна
>

Пить надо меньше.
Этот шаблон уже давно всеми освистывается.  Уже много лет. Но пока ОС не запрещает Копи_Пасте такие статьи плодятся. Даже не как кошки, а как крысы.


 
Германн ©   (2010-06-23 01:51) [67]


> Askalot ©   (23.06.10 01:27) [65]
>
> Заколебали такие умники, я учился на курсах один год три
> года назад, конечно я не знаю многих команд, но даже с такими
> командами я могу сделать вполне нормальную программу.
>

Ты сначала найди того, кто тебе за эту работу заплатит.
Ну если тебя зарплата не интересует, то пожалуйста. Делай всё что хочешь.


 
Anatoly Podgoretsky ©   (2010-06-23 08:49) [68]

> Askalot  (23.06.2010 01:27:05)  [65]

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


 
RWolf ©   (2010-06-23 09:19) [69]


> Askalot ©   (23.06.10 01:27) [65]

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


 
Anatoly Podgoretsky ©   (2010-06-23 14:54) [70]

> MsGuns  (23.06.2010 00:21:59)  [59]

К телкам.



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

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

Наверх





Память: 0.65 MB
Время: 0.089 c
15-1276582543
12
2010-06-15 10:15
2010.09.19
Мысль. Сельское хоз-во. Давление и полив.


15-1277349628
ixen
2010-06-24 07:20
2010.09.19
Не запускается программа. В чем может быть причина?


15-1275517571
RGV
2010-06-03 02:26
2010.09.19
Простенький Video stream сервер


15-1277651139
AKE
2010-06-27 19:05
2010.09.19
Стоит ли студенту изучать что-то дополнительно...


15-1277125976
laao
2010-06-21 17:12
2010.09.19
Как получить доступ к SVN-ревизии .DFM в run-time ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский