2010-06-16 3 views
2

비슷한 다른 질문을했지만 여전히 혼란스럽고 아무 답변도 저에게 효과가없는 것 같습니다. 그래서 나는 또 다른 질문을하기로 결정했다. 제발 저를 참아주세요, 나는 스레딩에 정통하지 않습니다.C# 이벤트를 제어하지 않고 실행을 계속하기 전에 COM 이벤트가 발생하기를 기다려야합니다.

Revit Structure의 타사 추가 기능입니다. 그들이 작동하는 방식은 인터페이스를 구현하는 클래스가있는 클래스 라이브러리입니다. 응용 프로그램이 실행될 때 실행됩니다.

내 도구는 인쇄 도구로서 PDF 로의 인쇄를 자동화하는 것을 목표로합니다. 내 코드를 PDF 파일을 인쇄하기 위해 PdfCreator를 사용하도록 이동하려고합니다. (Revit에서 인쇄 작업은 프린터를 설정하고 API에서 'print'메서드를 호출하는 방식이므로 다른 방법으로는 PDF를 수행 할 수 없습니다. 프린터).

PDFCreator에는 모든 문서가 인쇄 된 후에 발생하는 이벤트에 등록 할뿐만 아니라 설정을 구성 할 수있는 유용한 COM 인터페이스가 있습니다. hte print 메서드를 여러 번 호출하므로 모든 작업이 완료 될 때까지 기다린 다음 코드에서 수행하십시오.

  1. 사용자는
  2. 내 코드는 다음의 PDF 크리에이터 설정을 설정합니다 (내 WPF 창)
  3. 조회수를 인쇄 단추를 인쇄하는 일을 선택하고 듣고 등록 :

    내 논리는 다음과 같이 간다 이벤트

  4. Print() API 메서드를 호출하면 각 항목을 인쇄하는 데 약간의 시간이 걸립니다.
  5. 모든 작업이 끝나면 경고 메시지가 표시되고 문서에 '후 처리'가 수행되기를 원합니다. uments.
  6. 사후 처리는 다른 것들
  7. 내 문제는 내가 인쇄 메서드를 호출 할 때, 내 코드는을 PDFCreater 이벤트를 대기하지 않는, 그냥 통해 종료 계속됩니다

중 주위 PDF 파일을 이동/이름 변경 포함 이는 후 처리가 결코 해고되지 않음을 의미합니다.

내가해야 할 일은 차단하지 않고 어떻게 든 이벤트를 기다리는 것입니다.

나는이 시도했습니다 다른 질문을 읽은 후 :

  • AutoResetEvent, 이벤트 핸들러 세트를 호출 할 때까지 WaitOne()를 사용합니다. 이것은 방금 WaitOne에 붙어있어 결코 계속되지 않았습니다.
  • Application.DoEvents 특정 클래스 변수가 이벤트 핸들러에 의해 설정 될 때까지 ..
  • 내가 이벤트에 가입하기 위해 새로운 쓰레드를 생성 시도
  • 하지만 didnt가 어떻게 내가 할

도움이 보인다 새 스레드에서 이벤트를 시작한 다음 현재 스레드에 계속 경고를 보내시겠습니까? 또는 코드가 이벤트가 발생하기를 기다리게하려면 어떻게해야합니까?

추가 정보가 필요하면 알려주세요. 기꺼이 제공하십시오.

답변

1

다음과 같은 문제가 있습니다. 다른 라이브러리는 이벤트를 발생시키기 위해 실행중인 메시지 루프가 필요합니다. 특히 특정 메시지가 메시지 루프에서 도착하면 메시지가 라이브러리로 전달되어 이벤트를 발생시킵니다.

호출 코드에서 "대기"프리미티브를 사용하면 메시지 루프를 차단하므로 이벤트가 실행되지 않습니다. 프로그램은 차단해서는 안됩니다. 모든 Windows GUI 프로그램처럼 메시지 루프를 계속 실행해야합니다.

+0

메시지 루프를 계속 실행하려면 어떻게해야합니까? 양식을 보여주고 행사를 기다려야합니까 (저는이 문제에 약간의 문제가 있었지만 너무 일찍 포기했을 수 있습니다)? 내 프로그램에서 Print() API 메소드를 호출 한 다음 시트가 인쇄 될 때까지 기다렸다가 완료되면 다른 작업을 수행합니다. 기다리는 동안 양식을 보여 주면 행사가 시작됩니까? – RodH257

+0

ShowDialog를 사용하여 GUI를 표시하려고 할 때 보호 된 메모리 읽기 및 쓰기와 관련하여 AccessViolationException이 발생합니다. – RodH257

+0

일부 창을 표시하고 그대로 유지해야합니다. 창에 버튼이 있고 버튼을 클릭하면 버튼에 대한 이벤트 핸들러가 실행됨을 알았습니까? 그것은 당신을 위해 달리고있는 메시지 루프 덕분에 끝났습니다. COm 이벤트 핸들러에 대해서도 의존합니다. 창만 유지하면 메시지 루프가 실행되고 이벤트가 시작되고 메시지 처리기의 상태가 변경됩니다. – sharptooth