Потоки.

Потоки.

Последний вариант исходного текста программы: http://cdrriko.jpegimager.com/universelife/20060306.zip (17 кб).
Скомпилированный исполняемый файл http://cdrriko.jpegimager.com/universelife/UniverseLife.zip (206 кб)

Работает, глайдеры по экрану ездят. ^__^

Как и предупреждал, не буду ничего в деталях рассказывать про потоки. В общих чертах имеем кроме главного потока ещё два. Первый -- поток рисования, второй -- поток вычисления. Координация между ними выполнена через события TEvent. Взаимодействие потоков показано на схеме.

Схема взаимодействия потоков.

Честно говоря, с потоком рисования возникли определённые трудности при разработке тестов. Надо поизучать DUnit изнутри, чтобы понять как делать тесты для компонентов, завязанных на Delphi VCL. Так что писал по старинке.

Upd 1:
Упс, если скачали, а оно не компилируется, то надо выкинуть Logger из uses

Upd 2:
Кроме потоков были добавлены прочие мелкие переделки:

  1. В свойства Cell TGameBoard и TCellRule добавлено определение default. Теперь можно пистать FBoard[i, j] вместо FBoard.Cell[i, j]. В соответствии с этим изменены все обращения.
  2. В TCellRule добавлен метод CalcNewValueAt совмещающий в себе вызовы SetAt и CalcNewValue.
  3. TCellValue.Cell[] и TCellValue.CalcNewValue перемещены в protected, чтобы ими не могли пользоваться все, кто ни попадя.
  4. Чтобы сохранить существующие тесты в CellRuleTest для тестирования TCellRule введён специальный класс TOpenCellRule, всё-таки открывающий поле Cell[] ^_^ Как говорится, если нельзя, но очень хочется, то можно. На самом деле это трюкачество. Но по крайней мере с Delphi 4 по Delphi 7 оно сходит с рук.
  5. В TGameBoard введены новые методы Clear и CreateSelfCopy. Вместе с ними появились и тесты для них а TGameBoardTest Для CreateSelfCopy введён так же защищённый виртуальный метод SelfClass. (Но надо сказать, что-то тут я искривил. Кажется, можно и проще)
  6. В TArrayBoard переопределены Assign и Clear с учётом знания внутренней реализации этого класса. Маленькая оптимизация по быстродействию, короче.

Upd 3:
Механик обнаружил, что неверно считается число шагов в секунду. Посмотрели, оказалось это не число шагов было, а число миллисекунд на один шаг.
В процессе исследований выяснили, что самый тормозной момент в программе -- вывод через TMemo. При отключении вывода всё убыстряется минимум раза в три четыре (а у некоторых -- и в десять ;) . Чтобы отключить вывод достаточно минимизировать окошко на некоторое время а потом вернуть обратно и сразу же посмотреть на число.







Смотрите также:

No related posts.