Использовать нить в программировании в vb6 - PullRequest
1 голос
/ 20 декабря 2008

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

Спасибо в ожидании ценной помощи

Ответы [ 5 ]

8 голосов
/ 20 декабря 2008

Единственный «законный» способ сделать многопоточность в VB6 - это использовать ActiveX EXE - просто используйте опцию thread per object в диалоге свойств проекта. У Мэтта Керленда есть хороший пример того, как преобразовать ваш стандартный EXE-файл в многопоточный ActiveX EXE-файл. Это позволяет отладчику VB6 работать без сбоев, потому что в IDE все выполняется в одном потоке.

Если вы хотите сократить накладные расходы на многопоточность ActiveX EXE, вам придется использовать многопоточность in-proc, которая не поддерживается, но все же выполнима. Проверьте Compact In-Process Multi-Threading: FolderWatcher с образцом пользовательского интерфейса для способа безопасного использования CreateThread и безопасной инициализации времени выполнения VB6 в новом потоке (снова предоставлено Matt Curland).

Вы можете проверить его Advanced Visual Basic 6 книгу для более подробной информации.

2 голосов
/ 20 декабря 2008

Вы можете использовать API CreateThread Win32, но имейте в виду, что отладчик VB6 не может обрабатывать несколько потоков.

Кроме того, если у вас есть петли любого типа, попробуйте добавить «DoEvents» где-нибудь в цикле. Это сильно снизит производительность, но ваши формы будут отзывчивыми.

0 голосов
/ 05 января 2009

Я считаю, что метод exe Matt Curland ActiveX является классическим методом. В качестве альтернативы вы можете использовать DoEvents . Или делегируйте работу отдельному файлу ActiveX, например this . Было бы неплохо также использовать компонент .NET BackgroundWorker , но оказывается, что не работает .

0 голосов
/ 27 декабря 2008

Вы также можете запустить дочерний процесс через CreateProcess и перенаправить потоки StdIO для IPC. Anonymous Pipe I / O - это совсем не то, что попытка установить связь с помощью файлов на диске.

Для этого есть несколько бесплатных компонентов.

http://www.xtremevbtalk.com/showpost.php?p=1304628&postcount=4

0 голосов
/ 20 декабря 2008

Это может быть невозможно, но вы можете рассмотреть возможность перехода на .NET, где VB имеет полную поддержку многопоточности.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...