FPC+многопоточность

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
unC0Rr
новенький
Сообщения: 59
Зарегистрирован: 02.02.2006 02:44:44

FPC+многопоточность

Сообщение unC0Rr »

Здравствуйте, столкнулся с неприятной проблемой: программа (игра), написанная на паскале с использованием SDL падает в непредсказуемый момент времени при запуске второго потока. Необходимые синхронизации доступа к данным сделаны. Та же программа, скомпилированная при помощи Delphi работает стабильно. Падение, кстати, выражается не в исключении, а в простом выходе с сообщением "At end of ExceptionAddresStack". Поиск по "ExceptionAddresStack" в гугле выдаёт одни корки :) ума не приложу, что делать. Может это баг компилятора? Подскажите, пожалуйста, в чём может быть дело.
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

Сообщение Cheb »

Сам я многопоточностью не пользуюсь, но слышал, что в FPC её надо как-то дополнительно включать. То-ли модуль какой добавлять к программе, то-ли ещё что. Короче, муть какая-то.
В TMemoryManager, к слову, в отличие от дельфиного есть булево поле NeedLock.
Юра
постоялец
Сообщения: 163
Зарегистрирован: 25.05.2005 10:20:09
Откуда: Украина, Киев

Сообщение Юра »

Многопоточность не надо включать. Все делается автоматом при создании первого потока.

Похоже на баг с исключениями при использовании потоков.
Попробуй использовать FPC 2.1.x.
unC0Rr
новенький
Сообщения: 59
Зарегистрирован: 02.02.2006 02:44:44

Сообщение unC0Rr »

Немного почитал про многопоточность в freepascal... Возможно, проблема в том, что поток я создаю средствами SDL, а не rtl фрипаскаля? Но в потоке я не использую классы и динамическую память, поэтому косяков по идее быть не должно не смотря на то что компилятор не знает что относится к отдельному потоку, что нет.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

В Delphi многопоточность менеджера памяти надо включать, если не использовать TThread и еще какой-то встроенный метод.
isMultiThreaded := True;
Иначе возможны глюки даже со string'ами.
В FPC скорее всего тоже. Если поток создается левыми средствами (SDL), то компилятор не может определить многопоточность, надо ему сказать.
unC0Rr
новенький
Сообщения: 59
Зарегистрирован: 02.02.2006 02:44:44

Сообщение unC0Rr »

Не, строки тоже не используются... вообще ничего относящегося к динамической памяти... только стек. Спасибо за подсказку, попробую.
Юра
постоялец
Сообщения: 163
Зарегистрирован: 25.05.2005 10:20:09
Откуда: Украина, Киев

Сообщение Юра »

Возможно, проблема в том, что поток я создаю средствами SDL, а не rtl фрипаскаля?

В этом и проблема. Поток нужно средствами RTL создавать.
unC0Rr
новенький
Сообщения: 59
Зарегистрирован: 02.02.2006 02:44:44

Сообщение unC0Rr »

В этом и проблема. Поток нужно средствами RTL создавать.


Жаль... придётся городить кучку ifdef-ов. Хотелось бы сохранить совместимость с Delphi.
Юра
постоялец
Сообщения: 163
Зарегистрирован: 25.05.2005 10:20:09
Откуда: Украина, Киев

Сообщение Юра »

Зачем ifdef-ы? И в FPC и в Delphi можно использовать один и тот же TThread.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

Думаю, можно и средствами ОС и там и там. Просто надо почитать как сказать ему о многопоточности.
unC0Rr
новенький
Сообщения: 59
Зарегистрирован: 02.02.2006 02:44:44

Сообщение unC0Rr »

Зачем ifdef-ы? И в FPC и в Delphi можно использовать один и тот же TThread.


Ах да, маленькое ограничение: в программе принципиально не используются классы :)
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Если классы не используются, есть процедура BeginThread.
Ответить