Писал некоторое время назад игру-платформер, делал передвижение и атаку у противников.
Написал, собрал, запускаю тестировать. Все вроде бы в порядке, побегал, пострелял во врагов - лежат себе. Начинаю двигаться к выходу с уровня - и тут противники, лежа, убитые, начинают ползти вслед за мной. Ничего не понимаю.
Останавливаю дебаг, проверяю каждую строчку ИИ врагов, там стоит switch и кейсы по состояниям. Жив, мертв, охотиться и прочее. Все проверил - все верно, запускаю, убиваю - мертвые опять ползут за мной!
Сидел, нервно курил. Пил кофе почти до утра. Отоспался, открыл код заново. Долго и вдумчиво ругался - break'и в кейсах забыл поставить...
Приятель недавно жаловался, что его чуть с работы не поперли.
Он - высококлассный программист в Штатах и его компания пишет ПО для банков. Рассказывает:
- Сижу я на совещании, слушаю представителя заказчика. Представитель говорит много, громко и в основном чушь. Я ему спокойно объясняю, что так делать нельзя, что вот это работать не будет, и так далее. А он мне: "Да вы представляете, с кем говорите?! Мы - Федеральный Резерв! Мы можем делать все, что захотим!" И я не нашел ничего лучше, чем сказать, что я это уже заметил...
Из метода передавался в объект ( который работает в ДРУГОМ потоке ) адрес локальной переменной. Представляешь, что случается, когда метод завершает работу?
Правильно, локальная переменная уничтожается. Адрес становится инвалидным. А так как объект, в который передается этот адрес - работает в другом потоке, то это вполне реальная проблема. Я на это долго медитирую... И иду спрашивать, как это работает? Ведь ясно же, что это ошибка.
На что мне автор говорит: ставлю у потока более высокий приоритет и благодаря этому объект УСПЕВАЕТ вычитать содержимое переменной.
А ты говоришь - "Архитектура"... "Планирование"... Индусам до нас далеко. Чисто по-русски. Успеть хапнуть, пока не пришел писец...