2009-04-07 4 views
0

매우 오랜 시간 동안 처리하는 VB6 앱이 있습니다. 직접 죽이는 것은 불가능하므로 VB6 앱에서 일종의 플래그를 설정하고 싶습니다. 내 C# 응용 프로그램에서 그것을 종료하기로 결정한 경우이 플래그를 토글하여 VB6 응용 프로그램에 종료가 요청되었음을 알립니다. 자, 나는 VB6 애플 리케이션의 몇 가지가 activex exes로 회전되기 때문에 명명 된 것을 필요로한다. 아무도 이런 식으로 뭔가를 구현하는 아이디어가 있습니까? 워크 플로는 다음과 같습니다.vb6 앱에 대해 C# kill 이벤트를 만드시겠습니까?

C# app - 여러 스레드로 스핀 업 VB6 activex.exes C#에서 변경할 수있는 앱 (다음부터는 플래그라고 함)으로 앱 초기화 및 매우 길게 걸리는 DoStuff 명령 호출 돌아갈 시간.

VB6 - 플래그가있는 초기화 명령을 가져옵니다. DoStuff가 호출됩니다. DoStuff 루프에서 플래그가 아직 설정되어 있는지 확인합니다.

C 번호 - 다른 주

어떤 아이디어가 플래그를 설정하여 프로젝트를 죽여?

+0

VB6 앱 코드를 바꿀 수 있습니까? –

+0

예. 할 수 있습니다.어떤 도움 주셔서 감사합니다 – Steve

답변

1

ActiveX 개체를 만들 때 응용 프로그램이나 스레드에 저장된 참조를 유지하십시오. COM은 스레드간에 마샬링을 처리합니다. 손에있는 참조를 사용하여 메서드를 호출하고 죽일 수 있습니다. 스레드에서 참조를 유지하는 경우 .NET의 프로세스 간 메시징 메커니즘을 사용하여 ActiveX EXE에서 kill 플래그를 설정하려는 .NET 스레드로 전달해야합니다.

+0

VB6 애플 리케이션 불행히도 (단일 스레드 이후), 그래서 그것의 중간에 그 계산을 중지해야 신호의 몇 가지 방법이 필요합니다. – Steve

+0

나는 당신이 .NET에서 활성 EXE를 산란 줄 알았는데 줄 알았는데. 실? –

+0

그는 바쁜 때문에 그는 VB6 응용 프로그램이 ActiveX 호출을 처리하지 않는다는 것을 의미한다고 생각합니다. 그는 C#에서 VB6에 객체에 대한 참조를 전달한 다음 종료 할 시간인지 여부를 확인할 준비가되면 VB6에서 해당 객체를 주기적으로 폴링하도록 할 수 있습니다. – MarkJ

0

프로세스 경계를 ​​넘어서 참조를 열지는 않지만 certianly 프로세스의 Long hWnd를 캐시하고 within .Net에서 kill을 호출 할 수 있습니다.

8

다음은 VB6 클라이언트 및 VB6 서버의 비동기 백그라운드 처리를위한 꽤 표준적인 구성표입니다. (예를 들어 Dan Appleman의 book과 Microsoft의 VB6 samples에 있습니다.) C# 클라이언트에서도 작동해야한다고 생각합니다.

  • VB6 ActiveX EXE 개체는 CheckQuitDoStuff() 이벤트를 노출해야합니다. 여기에는 Quit라는 ByRef Boolean이 사용됩니다.
  • 클라이언트가 ActiveX EXE 개체에서 StartDoStuff를 호출합니다. 이 루틴은 숨겨진 양식의 타이머를 시작하고 은 즉시을 반환합니다. 이것은 호출 스레드를 차단 해제합니다. 타이머 간격은 매우 짧으므로 타이머 이벤트가 빠르게 발생합니다.
  • Timer 이벤트 처리기는 Timer를 사용하지 않도록 설정 한 다음 ActiveX 개체 DoStuff 메서드를 다시 호출합니다. 이것은 긴 처리를 시작합니다.
  • DoStuff 메서드는 주기적으로 CheckQuitDoStuff 이벤트를 발생시킵니다. 클라이언트의 이벤트 핸들러는 특수 플래그를 확인하고 중지해야 할 경우 True로 설정합니다. 그런 다음 DoStuff는 계산을 중단하고 Quit가 True이면 일찍 반환합니다.

이 스키마는 "DoStuff"가 발생하는 동안 호출 스레드가 차단되지 않기 때문에 클라이언트가 실제로는 다중 스레드 일 필요가 없음을 의미합니다. 까다로운 부분은 DoStuff가 적절한 간격으로 이벤트를 발생시키는 것을 확인하는 것입니다. 너무 길면 너무 짧아서 DoStuff를 불필요하게 늦추고 싶을 때 종료 할 수 없습니다. 또한 DoStuff가 종료되면 숨겨진 양식을 언로드해야합니다.

DoStuff가 실제로 모든 작업을 중단하기 전에 완료하면 다른 이벤트를 발생시켜 클라이언트에게 작업이 완료되었음을 알릴 수 있습니다.

+2

+1. 이것은 VB6에서 무료로 멀티 스레딩을하는 가장 쉬운 방법이며 잘 작동합니다. VB6 코드에서 직접 Win32 스레드를 수행하려는 방식으로 프로그램이나 IDE를 불안정하게 만들지는 않습니다. –

+0

IDE에서 지원되지 않으므로 디버그하기가 더 어려워집니다. – bjan

+0

두 개의 IDE를 사용해야하지만 디버깅 할 수 있습니다. VB6 IDE에서 VB6 ActiveX EXE 프로젝트를 시작하고 클라이언트가 연결할 때까지 기다립니다. 그런 다음 IDE에서 C# 프로젝트를 시작합니다. – MarkJ

관련 문제