Создание события C # kill для приложения vb6? - PullRequest
0 голосов
/ 08 апреля 2009

У меня есть приложение VB6, которое обрабатывает очень и очень долго. Убить его напрямую невозможно, поэтому я хотел бы установить какой-то флаг в приложении VB6. Если в моем приложении C # я решу закрыть его, я бы хотел включить этот флаг, чтобы приложение VB6 знало, что было запрошено завершение работы. Теперь мне также нужно кое-что с именем, потому что будет несколько приложений VB6, запущенных как exe-файлы ActiveX. У кого-нибудь есть идеи, как реализовать что-то подобное? Рабочий процесс следует ниже

Приложение C # - раскрутить несколько активных файлов VB6 activex.exes в отдельных потоках, Инициализировать приложение чем-то (далее именуемым флагом), которое я могу изменить в C #, и вызвать команду DoStuff, для возврата которой требуется очень много времени. 1003 *

VB6 - получает команду инициализации с флагом. DoStuff вызывается. В цикле DoStuff он проверяет, установлен ли флаг по-прежнему.

C # - убить проект, установив флаг в другое состояние

Есть идеи?

Ответы [ 3 ]

8 голосов
/ 15 апреля 2009

Вот довольно стандартная схема для асинхронной фоновой обработки с клиентами VB6 и серверами VB6. (Например, это в книге Дэна Эпплмана и в семплах Microsoft .) Я думаю, это должно работать и для клиента C #.

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

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

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

1 голос
/ 08 апреля 2009

При создании объекта ActiveX сохраняйте ссылку, хранящуюся в приложении или потоке. COM будет обрабатывать маршалинг по всем потокам. Имея в руках ссылку, вы можете вызвать метод и убить его. Если вы сохраните ссылку в потоке, вам нужно будет использовать механизм обмена сообщениями между процессами .NET, чтобы передать потоку .NET, для которого вы хотите установить флаг уничтожения в ActiveX EXE.

0 голосов
/ 09 апреля 2009

Я бы не оставлял ссылку открытой за границами процесса, но вы можете, конечно, кэшировать Long hWnd процесса и вызывать kill для него из .Net.

...