2014-09-08 1 views
-2

Я разрабатываю приложение для асфальтовой установки смешивания, используя поток для запуска процесса смешивания, несколько таймеров для чтения состояний системы и выполнения управляющих действий.Приложение Delphi 5 разбилось на «EInvalidPointer», когда включена поддержка Hyper-Threading, обновит IDE?

Если «Hyper-Threading» функции disabled, приложение будет работать бесперебойно, все в порядке; или он вызовет диалог, ворчащий, что доступ к памяти недействителен и прерван сразу после нажатия «ОК».

Не знаете, почему? Возможно, что-то не так с версией IDE, поскольку Delphi 5 был выпущен 10 августа 1999 года; может быть, нить в Delphi 5.0 не может иметь дело с новой технологией процессора?

Возможно, у управления памятью есть некоторые ошибки, может быть, режим нити не подходит для новой эры?

Я хочу обновить IDE, но поскольку есть много многолетних вставок, я понятия не имею, какой будет лучший выбор, Delphi 7? Delphi 2007 (поддерживающий OmniThreadLibrary)? RAD Studio XE6/7? Надеюсь, кто-то поможет.

+1

Я не уверен, почему вы думаете, что это связано с D5; честно говоря, гораздо более вероятно, что это будет проблема с вашим кодом, потому что люди успешно записывают и запускают многопоточные приложения D5, так как они появились. – MartynA

+0

Определенно: это звучит как типичная ошибка состояния гонки, которая появляется при действительном паралилизме. – pf1957

+0

Спасибо MartynA и pf1957. В эти дни мне очень больно, оригинальные коды были написаны 12 лет назад, в прошлом году я обновляю его до версии 2013 с общим драйвером без изменений, проблема только напоминает мне совместимость драйверов, но не ошибка потока; в этом году я заменяю универсальный драйвер карты DAQ последовательным уровнем связи, который имеет дело с 6 устройствами, приложение не работает, когда все модули интегрированы и система запускается. Тестер пытается отключить функцию Hyper-Threading в BIOS, все кажется ОК. –

ответ

1

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

Ошибки, связанные с потоками, являются такими же. Они будут отображаться, если потоки выполняют конкретный код в определенном порядке по отношению к другим потокам. И относительный порядок непредсказуем. Это часть параллельных вычислений. Поврежденный код может показаться правильным при работе в одной среде, но затем сбой под другим. В то время как соблазнительно обвинять инструменты, всегда сначала проверяйте зеркало.

Изменение среды разработки не является решением. Что вам нужно сделать, так это найти и исправить ошибку в коде. Получение хорошей трассировки стека поможет, и я могу порекомендовать такой инструмент, как madExcept.

+0

Спасибо за быстрый ответ. Я пытаюсь EurekaLog 7.0.7.1 для захвата точек сбоя, но не работает. Может быть, новая версия Delphi IDE с улучшенным управлением памятью и шаблоном нитей поможет решить проблему? Приложение было впервые выпущено в 2002 году, было больно поддерживать коды кода, написанные за 12 лет до этого. Возможно, я должен внимательно изучить коды. –

+1

IDE не имеет значения. Вы цепляетесь за соломинку. Пожалуйста, не заставляйте меня повторять то, что я сказал в ответ ;-) –

+1

Это классический сценарий. Свидетельство ясно указывает на ваш код. Но вы не можете столкнуться с болью отладки этого ужасного кода. Поэтому вы ищете волшебное быстрое решение. Человеческая природа. –

Смежные вопросы