2009-10-13 11 views
1

Использование VB6Как избежать белого пустого экрана?

Во время выполнения, он показывает белый пустой экран, когда он работал с базой данных, Как избежать белого пустого экрана в VB6.

БЕЛЫЙ ЗАЩИТНЫЙ ЭКРАН ЗНАЧИТ (КОГДА ЭТО БЫЛО РАБОТАЕТ С БАЗАМИ).

Как этого избежать?

+0

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

ответ

4

Я предполагаю, что вы имеете в виду, что графический интерфейс не будет перерисовываться при выполнении долговременной операции. (На самом деле это не видно, начиная с Vista, но я отвлекаюсь).

Если ваша длительная работа состоит из нескольких шагов или плотных петель, вы можете посыпать вызов DoEvents каждый раз, чтобы заставить форму оставаться в некоторой степени отзывчивой даже при выполнении работы.

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

+0

Люди всегда, кажется, упускают из виду простые методы, когда беспокоятся о фоновой обработке в отдельном потоке в VB6. Гопал говорит о работе с базами данных, поэтому просто используйте встроенную поддержку ADO для асинхронной обработки. В качестве альтернативы, следуйте ответам AngryHacker и делегируйте работу ActiveX exe, чтобы он работал вне процесса в отдельном потоке. Оба решения выполняют свою работу с минимальными проблемами (и это проще, чем классическая многопоточность в .NET IMHO). – MarkJ

1

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

+2

Не так просто. Это VB6, о котором мы говорим. – AngryHacker

+0

Что не так просто? Подходы к потоку одинаковы практически на каждой платформе. – Restuta

+0

Нет, это не то же самое на каждой платформе. VB6 не поддерживает несколько потоков в одной и той же программе exe. – MarkJ

0

Ваш первый инстинкт должен заключаться в том, чтобы выполнять ваши ресурсоемкие операции в отдельном потоке. Это немного сложно в VB6, хотя возможно (но не рекомендуется), если вы вызываете собственный API CreateThread.

Вы также можете перейти на VB.NET и использовать объекты Thread изначально.

+0

Существует много лучших способов, чем использование CreateThread. Используйте встроенную поддержку ADO для асинхронных операций или делегируйте ее в ActiveX exe, как в ответе AngryHacker. – MarkJ

1

Это фактически та же проблема, что и ваш вопрос «How to exit the program immediately». В обоих случаях проблема заключается в том, что ваша операция с базой данных блокирует выполнение программы VB6.

  • answer you accepted для другого вопроса - использовать ADO для выполнения операции асинхронна - также решить эту проблему пустого экрана.
  • Или, если хотите, выполните одно из моих предложений в my answer to your other question и используйте компонент рабочего стола .NET с помощью Interop, например this.
  • Или следуйте моему другому предложению и делегируйте работу базы данных ActiveX exe like this. EDIT AngryHacker's nice answer на этот вопрос использует этот метод.
1

Я отправил это как ответ на другой вопрос, но модель применима и здесь:

VB6, сама по себе, однопоточный. Тем не менее, вы можете сделать его несколько многопоточным с помощью ActiveX EXE, которые запускаются в их собственном процессе, но все же привязаны к исходному VB6-созданному EXE.

То, что я использовал в прошлом, является объектом Timer в сочетании с ActiveX EXE. Такой подход даст вам возможность локализовать всю логику загрузки в одном месте, управлять им, как если бы вы управляли обычным объектом, и запускать его в отдельном EXE, поэтому по умолчанию он делает многопоточным.

Так как это работает так:

Вы вызываете метод LongRunningOperation на объект ActiveX EXE В методе LongRunningOperation вы создаете экземпляр Timer и он стартует почти сразу. Вы выходите из метода LongRunningOperation, тем самым отдавая управление объекту, который его вызвал. Затем вы связываетесь с главным приложением через события (например, LongRunningOperationProgress или LongRunningOperationComplete и т. Д.)

Я рекомендую Timer object from Karl Petersen.

+0

+1. Я предложил это в своем ответе на другой вопрос Гопала о работе в VB6. http://stackoverflow.com/questions/1264513/how-to-exit-the-program-immediately/1265586#1265586 – MarkJ

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