2009-05-12 4 views
1

私は約1分かかるいくつかのアクションを実行するために、activeXコントロールを作成しました。この動作中、IEは完全にフリーズします。 IEがフリーズしないようにActiveXコントロールを呼び出す方法はありますか?ActiveXフリーズIE

これはIEを扱うスレッドの問題ですので、私はこれを行うにはどのような方法があるとは思わないあなたに

答えて

1

ありがとうございます。

+0

私はそれを回避することができますか?私のActiveXをIframeに追加すると同じ問題が発生するでしょうか? – vikasde

+1

ええ、私はそれがそうだと思います。私は本当にこれを回避する唯一の方法は、新しいIEウィンドウを生成し、その中からコントロールを呼び出すことだと思います。もちろん、ワーカースレッドを生成するようにActiveXコントロールを変更してください。 –

6

Internet Explorerだけでなく、ActiveXホストでも同じ問題が発生します。 UIスレッドをブロックしたくない場合は、セカンダリスレッドでActiveXコントロールを変更する必要があります。

+0

どうすればいいですか?私はC#で自分のコントロールを作成し、それを登録するためにRegasmを使用しました。 – vikasde

4

IEをフリーズした私のactiveXには似た問題がありました。私は、私のactiveXコントロールにクライアント上に新しいスレッドを作成させることで回避策をとった。スレッドが作業を行っていても、activeXはその完了を返し、UIのブロックを解除します。

トリッキーな部分は、スレッドが完了したときを知ることです。スレッドが完了したときにtrueに設定されている、あなたのactiveXにbooleanプロパティがあることが分かります。 javascriptから、trueに設定されるまでそのプロパティを呼び出すことができます。

Javascriptを:

var myActiveXObject = new ActiveXObject("myActiveX"); 

function startWork() 
{ 
    myActiveXObject.startWork(); 

    setTimeout(checkIsDone(), 1000); 
} 

function checkIsDone() 
{ 
    if(myActiveXObject.checkIsDone()) 
     workComplete(); 
    else 
     setTimeout(checkIsDone(), 1000); 
} 

のActiveX:

private bool blnIsDone; 

[ComVisible(true)] 
public void startWork() 
{ 
    blnIsDone = false; 

    Thread myThread = new Thread(delegate() 
    { 
     ThreadedWork(); 
    }); 

    myThread.Start(); 
} 

private ThreadedWork() 
{ 
    //Do work 

    blnIsDone = true; 
} 

[ComVisible(true)] 
public bool checkIsDone() 
{ 
    return blnIsDone; 
} 
関連する問題