2017-12-19 17 views
0

코드의 특정 부분에서 모듈을 무시하여 스레드 모듈을 비 스레드 안전 모듈 Win32 :: OLE와 함께 사용할 수있는 방법을 찾으려고합니다. 먼저 모든 다른 스레드를 생성하지 않는펄에서 비 threadsafe 모듈을 무시하는 방법이 있습니까?

use strict; 
use warnings; 
use Win32::OLE; 

#Do some OLE stuff 

#unimport Win32::OLE 
use threads; 

my $exec_command = threads->create(sub{}); 
$exec_command->join(); 
#reimport Win32::OLE 
+3

'threads'를 사용하지 않는 자체 프로세스에서 실행해야합니다. 왜 이전 질문을 삭제 했습니까? – Borodin

+0

스레드로 비 threadsafe 모듈을 사용하는 것이 일반적인 실수라고 생각하기 때문에 여기서 다시 묻기로했습니다. – TheAschr

답변

1

당신은 당신의 주 스레드에서 Win32::OLE을 사용할 수 없습니다. 그러나 자식 스레드에서 모듈을 사용할 수 있습니다. 여기에 use 대신 require을 입력하십시오. 스레드 안전되지 않은 다른 모듈 일 수있다

이 동일한 방법 [http://www.perlmonks.org/?node_id=595491 인용]를

my $ole_thread = threads->create(sub { 
    require Win32::OLE; 
    # do OLE stuff 
}); 
my $result = $ole_thread->join(); 

. 하지만 하나의 메인이 아닌 스레드에서만 모듈을 사용하도록주의해야합니다.

+0

Win32 : OLE를 사용하여 수정할 수없는 main 모듈을 가져 왔습니다. 새 스레드 내에서 모듈을 필요로하는 경우 기본 모듈에서 정의 된 함수를 사용할 수 없다고 가정합니다. 모듈이 정의하지만 Win32 : OLE 함수가 아닌 전역 함수로 내보낼 수 있습니까? – TheAschr

+1

@TheAschr : 삭제 된 질문에서'InHouseModule'에 대해 이야기하고 있다면, 수십개의 다른 모듈을'사용 '하고 있다면, 변경된 것을 얻기 위해 할 수있는 모든 일을해야합니다. 매우 나쁜 습관이고 모든 펄 프로그램을 불필요하게 커지게 만듭니다. 또한 여기서 경험하는 것과 같은 여러 가지 호환성 문제가 있습니다. – Borodin

+0

불행히도 그렇게 할 방법이 없습니다. 'Win32 :: OLE' 모듈 자체를 로딩하는 것은 스레드가 안전하지 않은 행동을 일으키는 것이지, 함수가 임포트되는 것이 아닙니다. – Dre