Visual Basic 6 - Существуют ли библиотеки, позволяющие реализовать многопоточность? - PullRequest
1 голос
/ 24 мая 2011

Существуют ли какие-либо библиотеки, которые я могу импортировать в проект VB6, чтобы включить многопоточную поддержку? Я знаю, что есть примеры использования Windows API, но мне было интересно, есть ли уже существующие библиотеки, которые я могу просто импортировать в свой проект, чтобы разрешить эту функциональность в VB6. Я унаследовал очень сложное приложение в VB6, одной из его задач является управление роботизированной рукой на несколько миллионов долларов. Мне нужно взять это приложение и внести некоторые изменения, которые принесут большую пользу, если я смогу добавить многопоточную поддержку. Преобразование этого приложения в .NET было бы огромной задачей (для нас хорошая аналогия была бы эквивалентом пилотируемой миссии на Марс в следующем году). Приложение включает в себя несколько пользовательских библиотек, которые выполняют сложные научные расчеты и анализ данных. Код был настроен для обеспечения впечатляющей скорости обработки (это VB6). Для перехода на платформу .NET потребуется огромное количество ресурсов. Руководство показывает, что до модернизации системы может пройти 8 лет. Буду признателен за любые ответы.

Примечание. Перед отправкой этого вопроса я выполнил поиск и увидел, что ему задают похожий вопрос, но ответ на этот вопрос напрямую связан с Windows API. Мой вопрос немного другой. Я спрашиваю о библиотеках, которые уже включают эту функциональность, которую я могу использовать в этом проекте. То есть библиотеки, которые уже проделали всю эту работу с использованием API.

Ответы [ 4 ]

2 голосов
/ 24 мая 2011

Нет библиотеки для многопоточности, о которой я знаю.Но асинхронная обработка не обязательно требует потоков.У Desaware есть StateCoder , библиотека для конечных автоматов, которая помогает с многозадачностью без многопоточности.Немного похоже на Aysnc CTP.

В качестве альтернативы здесь представлена ​​довольно стандартная схема для асинхронной фоновой обработки в VB6.(Например, он находится в книге Дэна Эпплмана и VB6 семплов Microsoft .) Вы создаете отдельный EXE-файл ActiveX для выполнения работы: таким образом, работа автоматически выполняется в другом потоке, в отдельномпроцесс (что означает, что вам не нужно беспокоиться о растоптанных переменных).

  • Объект VB6 ActiveX EXE должен предоставлять событие CheckQuitDoStuff ().Для этого используется логическое значение ByRef Quit.
  • Клиент вызывает StartDoStuff в объекте ActiveX EXE.Эта процедура запускает таймер в скрытой форме и немедленно возвращает .Это разблокирует вызывающий поток.Интервал таймера очень короткий, поэтому событие таймера срабатывает быстро.
  • Обработчик событий Timer отключает Timer, а затем вызывает метод ActiveStuff объекта ActiveX.Это начинает длительную обработку.
  • Периодически метод DoStuff вызывает событие CheckQuitDoStuff.Обработчик событий клиента проверяет специальный флаг и устанавливает Quit True, если необходимо прервать операцию.Затем DoStuff прерывает вычисление и возвращает рано, если Quit имеет значение True.

Эта схема означает, что клиент на самом деле не должен быть многопоточным, поскольку вызывающий поток не блокируется, пока происходит DoStuff.Сложная задача - убедиться, что DoStuff вызывает события через соответствующие промежутки времени - слишком долго, и вы не можете выйти, когда хотите: слишком коротко, и вы без необходимости замедляете DoStuff.Кроме того, когда DoStuff завершает работу, он должен выгружать скрытую форму.

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

Отказ от ответственности: прямая копия моего ответа на другой вопрос

1 голос
/ 24 мая 2011

Вы можете, конечно, вызвать Windows API для реализации многопоточности, и это не так уж сложно.Однако самое простое решение - открыть объект .net Com и реализовать многопоточность через .net.Для сложной уже существующей функциональности вы можете разбить приложение vb6 на библиотеки com, которые могут вызываться многопоточным контроллером .net.


[Gui]  ┬> [ .net Com Mulit thread controller]  -> [Com exposed VB 6 utility]
       |
       └> [Com exposed VB 6 utility]

0 голосов
/ 25 октября 2014

Была библиотека потоков, созданная elitevb в 2002 году, которая, к сожалению, сейчас закрыта. Но есть архив статей elitevb на xtremevbtalk . В разделе Система и устройства внизу есть сообщение с прикрепленным файлом threading.dll и примером исходного кода, что упрощает реализацию потоков. Насколько я помню, была проблема, что тестирование в IDE приводило к сбою программы, но не было проблем с запуском скомпилированной программы.

С библиотекой вы можете создавать темы довольно смиренно:

Dim ReadValuesThread As Thread

Private Sub Form_Load()
    Set ReadValuesThread = New Thread
    ReadValuesThread.StartThread "ReadValues", "None", Me
    ' Public Function StartThread(FunctionName As String, _
    '                             FunctionParameter As Variant, _
    '                             ParentObject As Object) As Long
End Sub

Private Sub ReadValues()
    ' do things
End Sub

Private Sub Form_Unload(Cancel As Integer)
    ' kill thread
    ReadValuesThread.EndThread
End Sub
0 голосов
/ 09 июня 2011

См. Статью Использование фоновых потоков с Visual Basic 6 для элегантного ответа на проблему.

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