Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Тормоза


Страницы:   1 2 3 4

Askalot ©   (2010-06-22 00:38:00) 

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


Anatoly Podgoretsky   (2010-06-23 14:54:00) [1]

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

К телкам.


RWolf   (2010-06-23 09:19:00) [2]


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

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


Anatoly Podgoretsky   (2010-06-23 08:49:00) [3]

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

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


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


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

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


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


> 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;    
>
> Или я уже совсем сплю, или тварисч реально не понимает что
> такое синхронизация и зачем она нужна
>

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


Askalot   (2010-06-23 01:27:00) [6]

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


Askalot ©   (2010-06-23 01:06:00) [7]

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


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


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

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


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


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

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


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

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

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

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


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

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


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

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


Askalot   (2010-06-22 23:49:00) [13]


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

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


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

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

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


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

> 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.


Askalot   (2010-06-22 20:36:00) [16]


> Юрий Зотов

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


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

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

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

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

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

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

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

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

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

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


Askalot   (2010-06-22 20:19:00) [18]


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

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


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

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

где логика..


Ascalot ©   (2010-06-22 18:43:00) [20]

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

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


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

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


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо