Задать вопрос
Koi_jp
@Koi_jp

Как пофиксить ошибку Delphi «Access viilation at adress 004190B8»?

Написал небольшое тестовое приложение на delphi использовал delphi 7. Раньше не писал на delphi. Программа решает задачу синхронизации трех процессов. Один генерирует случайные числа и записывает в буфер, второй считывает числа и вычисляет квадрат каждого и пишет их в другой буфер, третий поток вычисляет сумму и выводит в Edit.
Окно
55ea8105a91a4cddb659954394e8e190.png
При нажатии на запуск выдается такое сообщение:
4586c760caf741f8879c80c82d026414.png
Уже пробовал несколько способов из гугла - не помогло. Запускаю под Win 8.1
  • Вопрос задан
  • 2536 просмотров
Подписаться 2 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
@evvcom
Виктор Кольцов, конечно, прав, но скорее не это является причиной указанной ошибки. Судя по "Write of address 0000000E" идет запись в поле объекта, которого не существует, т.е. ссылка MyObject = nil. Надо закрыть окно об ошибке, потом в меню Search - Find Error... Спозиционируется на строку вида MyObject.prop := value; или MyObject.SomeMethod(); внимательно изучить последовательность действий, понять почему к этому моменту еще не было выполнено присвоение MyObject := TMyObject.Create(); (вызов конструктора), ну и исправить.
В дополнение добавлю для новичка неочевидное: третий поток, который пишет в Edit, на самом деле первый (или даже нулевой, если с нуля считать), т.е. это основной поток, UI-поток, т.к. с VCL надо работать только из основного потока, но быть аккуратным, чтобы при синхронизации его чтения из 2-го буфера с тем потоком, который пишет в этот 2-й буфер, не повесить основной UI-поток.
Ответ написан
Vityarik
@Vityarik
Нужно синхронизировать потоки перед чтением/записью в буферы, чтобы в один момент времени с буфером работал только 1 поток.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы