threads和OLE如何共存

threads和OLE如何共存

由于程序中需要使用OLE,但是OLE好像不是线程安全的,只要引入OLE在线程释放的时候就会报错
请问各位老大如何在多线程环境中使用OLE?

#!/usr/bin/env perl


use threads;
use Win32::OLE;

sub sub1
{
    $a = 0;
    for (my $I = 0; $I < 100; $I++)
    {
        print "is $I\n";
    }
    1;
}

my @ThrdList = ();
my $thrd = threads->create(\&sub1);

push(@ThrdList, $thrd);
foreach my $thrd (@ThrdList)
{
    print "Wait for\n";
    $thrd->join();
    print "Wait ok\n";
}

print "Exit ok";
很多模块都不是线程安全的,遇到这种情况就改用子进程。

能给个子进程的例子吗?


QUOTE:
原帖由 larrykun 于 2007-12-22 16:32 发表
能给个子进程的例子吗?

同样的问题,哪位老师能给一个子进程的例子?谢谢!

我开了一个新线程用来启动ie(ole),想不到出现了ole相关的错误。在论坛中搜索没有找到答案呀。

QUOTE:
Thread 1 terminated abnormally: Could not start Internet Explorer Application through OLE



QUOTE:
use Win32::OLE;

my $pid = fork;
if ($pid){
print "it\'s child process\n";}
else{
print "parent process\n";
my $IE = Win32::OLE->new("InternetExplorer.Application")
        or die "Could not start Internet Explorer.Application\n";
$IE->{visible} = 1;
$IE->Navigate("http://www.chinaunix.com");
}
kill $pid;

进程是这样的吗?请各位指点,期待中。。。。

出错信息如下:

QUOTE:
perl command line interpreter 遇到问题须要关闭。。。

没有人知道么?我也没弄懂这个问题。关注中...
对于非线程安全模块可以试着放入子线程内加载,尤其是XS模块。
http://perldoc.perl.org/threads.html#BUGS-AND-LIMITATIONS
如下例:

[Copy to clipboard] [ - ]
CODE:
use 5.008;
use threads;

threads->create('worker')->join;

sub worker
{
        eval 'use Win32::OLE';

        my $IE = Win32::OLE->new("InternetExplorer.Application")
                        or die "Could not start Internet Explorer.Application\n";
        $IE->{visible} = 1;
        $IE->Navigate("http://www.chinaunix.com");
}

1;
__END__

万分感激ROB大侠的精彩指点!
真的好用,仔细研究一下。再次感谢。