Я думаю с помощью некоторого метода как aku's или , Guy является способом пойти, но несколько вещей отнять у определенных примеров:
основная предпосылка должна была бы показать Ваш всплеск на отдельном потоке как можно скорее. Это - способ, которым я склонился бы, подобный тому, какой проиллюстрированный aku's, так как это - способ, с которым я являюсь самым знакомым. Я не знал о функции VB, которую упомянул Guy. И, даже думал, что это библиотека VB, он прав - это - весь IL в конце. Так, даже если это чувствует себя грязным , это не все настолько плохо!:) Я думаю, что Вы захотите быть уверенными, что или VB обеспечивает отдельный поток для в том переопределении или что Вы создаете тот сами - определенно исследование это.
Принятие Вы создаете другой поток для отображения этого всплеска, Вы захотите остерегаться перекрестного потока обновления UI. Я поднимаю это, потому что Вы упомянули, что обновили прогресс. В основном, для сейфа необходимо вызвать функцию обновления (что Вы создаете) на форме всплеска с помощью делегата. Вы передаете того делегата в эти , Вызывают функция на объект формы Вашего экрана-заставки. На самом деле при вызове формы всплеска непосредственно для обновления элементов прогресса/UI на нем, Вы обеспечите исключение, Вы работаете на.Net 2.0 CLR. Как показывает опыт, любой элемент UI на форме должен быть обновлен потоком, который создал его - это что Форма. Вызовите обеспечивает.
Наконец, я, вероятно, решил бы создать всплеск (не используя перегрузку VB) в основном методе Вашего кода. Мне это лучше, чем наличие основной формы выполняет создание объекта и быть так плотно связанным с ним. Если бы Вы проявляете тот подход, я предложил бы создать простой интерфейс, который экран-заставка реализует - что-то как IStartupProgressListener - который получает обновления прогресса запуска через функцию членства. Это позволит Вам легко подкачивать в / любом классе по мере необходимости, и приятно разъединяет код. Форма всплеска может также знать, когда закрыть себя, если Вы уведомляете, когда запуск завершен.
Много раз в режиме отладки в C ++ все переменные инициализируются нулем, тогда как то же самое не происходит в режиме выпуска, если явно не указано иное.
Проверьте любые макросы отладки и неинициализированные переменные
Использует ли ваша программа многопоточность, тогда оптимизация также может вызвать некоторые проблемы в режиме выпуска.
Также проверьте все исключения, например, не имеет прямого отношения к режиму выпуска, но иногда мы просто игнорируем некоторые критические исключения, такие как нарушение доступа к памяти в VC ++, но то же самое может быть проблемой, по крайней мере, в других ОС, таких как Linux, Solaris. В идеале ваша программа не должна перехватывать такие критические исключения, как доступ к NULL-указателю.
Это возможно. Если это произойдет и не будет задействована условная компиляция, то вы можете быть уверены, что ваша программа неправильная и работает в режиме отладки только из-за случайных инициализаций памяти или даже из-за разметки в памяти!
Существуют оптимизации компилятора, которые могут нарушить допустимый код , потому что они слишком агрессивны.
Попробуйте скомпилировать код с включенной меньшей оптимизацией.
Это возможно, если у вас есть условное компиляция так, чтобы код отладки и код выпуска были разными, а в коде есть ошибка, которая используется только в режиме выпуска.
В остальном это невозможно. Есть разница в том, как компилируются отладочный код и код выпуска, и различия в том, как код выполняется, если он выполняется под отладчиком или нет, но если какое-либо из этих различий вызывает что-либо, кроме разницы в производительности, проблема была всегда.
В отладочной версии ошибка может не возникать (поскольку время или распределение памяти другое), но это не означает, что ошибки нет. Также могут быть другие факторы, не связанные с режимом отладки, который изменяет время выполнения кода, вызывая возникновение ошибки или нет, но все сводится к тому, что если бы код был правильным, ошибка не возникла бы. в любой из ситуаций.
Итак, нет, отладочная версия не подходит только потому, что вы можете запустить ее без получения ошибки. Если ошибка возникает при запуске в режиме выпуска, это не из-за режима выпуска, а потому, что ошибка была с самого начала.
Не вдаваясь в подробности, я предполагаю, что «не в порядке» означает, что он либо не компилируется, либо выдает какую-то ошибку во время выполнения. Проверьте, есть ли у вас код, основанный на версии компиляции, с помощью операторов #if DEBUG
или методов, отмеченных атрибутом Conditional
.
Конечно, например, если вы используете конструкции типа
#if DEBUG
//some code
#endif
Может, особенно если вы находитесь в сфере C.
Одна из причин может заключаться в том, что версия DEBUG может добавлять код для проверки на случайные указатели и каким-то образом защищать ваш код от сбоев (или вести себя некорректно). В этом случае вы должны внимательно проверять предупреждения и другие сообщения, которые вы получаете от вашего компилятора.
Другой причиной может быть оптимизация (которая обычно включена для релизных версий и отключена для отладки). Код и макет данных могли быть оптимизированы, и хотя ваша программа отладки просто, например, обращалась к неиспользуемой памяти, версия выпуска теперь пытается получить доступ к зарезервированной памяти или даже указывает на код!
РЕДАКТИРОВАТЬ: Я вижу, что другие упоминали это : конечно, у вас могут быть целые участки кода, которые условно исключаются, если не компилируются в режиме DEBUG. Если это так,
Да !, если у вас есть условная компиляция, могут быть ошибки синхронизации (оптимизированный код выпуска, неоптимизированный код отладки), повторное использование памяти или куча отладки.
Вам нужно предоставить намного больше информации, но да, это возможно. Это зависит от того, что делает ваша отладочная версия. У вас вполне могут быть журналы или дополнительные проверки, которые не скомпилированы в версию выпуска. Эти пути кода только для отладки могут иметь непредвиденные побочные эффекты, которые изменяют состояние или влияют на переменные странным образом. Сборки отладки обычно выполняются медленнее, поэтому это может повлиять на многопоточность и скрыть условия гонки. То же самое и с прямой оптимизацией из релизной компиляции, возможно (хотя и маловероятно в наши дни), что релизная компиляция может что-то закоротить как оптимизацию.
Другие различия могут быть такими:
Распространенная ошибка - использование выражения с побочным эффектом внутри ASSERT.
В .NET, даже если вы не используете условную компиляцию, например #if DEBUG
, компилятор по-прежнему гораздо более либерален в отношении оптимизаций в режиме выпуска, чем в режим отладки, который также может приводить только к выпуску ошибок.
Функции библиотеки CRT ведут себя по-разному при отладке и выпуске (/ MD vs /MDd).
Например, отладочные версии часто предварительно заполняют буферы, которые вы передаете до указанной длины, чтобы проверить свое утверждение. Примеры включают strcpy_s
, StringCchCopy
и т. Д. Даже если строки заканчиваются раньше, ваш szDest лучше будет иметь длину n байтов!
В прошлом меня укусили ошибки, которые исправлялись в отладочных сборках, но давали сбой в сборках Release. Существует множество основных причин (включая, конечно, те, которые уже были описаны в этой цепочке), и меня уловили все из следующего:
#ifdef _DEBUG
, чтобы класс имел другой размер в отладочной сборке. Иногда #ifndef NDEBUG
используется в сборке выпуска #ifdef
, который присутствует только в одной из двух сборок #pragma pack
, которое не было сброшено, это может привести к неприятным проблемам.Подобные проблемы также могут возникать при использовании предварительно скомпилированных заголовков и принудительного включения Некоторые советы, которые я накопил за годы добраться до сути ошибок отладки / выпуска: