2017-07-07 5 views
1

からのイベントをサブスクライブするフォームを作成するので、私は更新Awesomiumと特異的に1.7.5ブロッキングスレッド

まあ、Awesomiumの新しいバージョンを使用するためのプログラムを更新する必要があり、今それ自身のスレッド上で動作しなければなりません、それはブロックされています。

WebCore.QueueWork()を使用してブロックスレッドに作業をキューイングできます。これにより、WebCore.Run()スレッドが渡されたアクションが完了します。私はそれが自分のスレッドであることを確認したので、残りのアプリケーションはブロックされません。

プログラムの機能は、WebCoreライブラリを使用してWebViewとWebSessionをインスタンス化したコンストラクタを持つワーカーオブジェクトを作成することでした。その後、WebCoreライブラリのイベントをフォームに登録できるように、ワーカー・オブジェクトを引数として受け入れるフォームを作成しました。

var worker = new Worker(); 
var debugForm = new PBForm(worker); 
debugForm.Show(); 

ワーカーコンストラクタは、ビューが更新されるたびに、関数SurfaceIsDirtyを呼び出すコード行を持っています。

((ImageSurface)_view.Surface).Updated += (s, e) => { if (webView_SurfaceIsDirty != null) webView_SurfaceIsDirty(s, e); }; 

この機能は、フォームのコンストラクタに割り当てられます。WebViewのが更新されるたびに

this.worker.webView_SurfaceIsDirty = (sender, e) => 
{ 
    ImageSurface buffer = (ImageSurface)this.worker._view.Surface; 
    pictureBox1.Image = buffer.Image; 
}; 

だから、フォームの画像が更新されます。

これはWebCoreスレッドで実行できるようになっていましたが、WebCoreスレッドがブロックされているので、このフォームを正しく動作させることができません。

これは私が立ち往生しているところです。別のスレッドでフォームを実行する必要があるので、ブロックしているWebCoreスレッドが滞っているためハングしません。

私の考えは次のとおりです。労働者は、労働者のインスタンスのプロパティとして新しいスレッドでフォームを作成作成され

  1. WebCoreイベントが発生すると、ワーカーインスタンスはフォームを更新できるはずです。

フォームは応答性がありますが、画像は更新されていませんし、今は別のスレッドにあるフォームに関連していると思われます。ここに関連するコードは、今私が持っているのです。

私は労働者のクラスにこのプロパティを追加しました:AddWorkerで

WebCore.QueueWork(AddWorker); 

public PBForm2 DebugForm; 

私はWebCore、ブロッキングスレッド内のワーカークラスをインスタンス化メソッド私は新しいスレッドを作成し、それをworkerプロパティにアタッチしながらフォームを実行します:

そして最後に、ワーカーイベント自体は今ある:それは作業に非常に近いと思われる

((ImageSurface)_view.Surface).Updated += (s, e) => 
{ 
    ImageSurface buffer = (ImageSurface)_view.Surface; 
    DebugForm.pictureBox1.Image = buffer.Image; 
    DebugForm.pictureBox1.Refresh(); 
}; 

、フォームがユーザーとの対話に応答し、労働者が自分のことをやってイベントをトリガされますが、絵がに変更されていません形。イベントがヒットし、新しいイメージがそこにあります。私は、フォームが異なるスレッドにあるという事実が、フォーム上のイメージを更新しない原因になっていると思われます。

これは非常に長い投稿だったので、読んでいるなら、時間をかけていただきありがとうございました。私は非常に多くの初心者ですが、スレッドや任意の提案やリンク、または正確に何かをこの問題を解決するために検索することになると大いに感謝します。

答えて

1

私は私が間違ってFormオブジェクト(感謝トロイMac1ure)を更新して問題を修正した後、私はアクセスできませんでしたスレッドの問題に遭遇し、それを考え出しましたAwesomiumスレッドのフォームのピクチャボックス。

私はヘルパークラスを使用して、それを解く:

public static class ThreadHelper 
{ 
    private delegate void SetPictureCallback(PBForm f, Image image); 
    private delegate void AppendTextCallback(PBForm f, string text); 

    public static void SetPicture(PBForm form, Image image) 
    { 
     if (form.InvokeRequired) 
     { 
      SetPictureCallback d = SetPicture; 
      form.Invoke(d, form, image); 
     } 
     else 
     { 
      form.pictureBox1.Image = image; 
      form.pictureBox1.Refresh(); 
     } 
    } 

    public static void AppendText(PBForm form, string text) 
    { 
     if (form.InvokeRequired) 
     { 
      AppendTextCallback d = AppendText; 
      form.Invoke(d, form, text); 
     } 
     else 
     { 
      form.textBox1.Text += text; 
      form.textBox1.SelectionStart = form.textBox1.TextLength - 1; 
      form.textBox1.ScrollToCaret(); 
      form.textBox1.ScrollToCaret(); 
     } 
    } 
} 

イベントは、ワーカースレッドでトリガされると、私はフォームを更新するための関数を呼び出します。

_view.Surface = new ImageSurface(); 
((ImageSurface)_view.Surface).Updated += (s, e) => 
{ 
    ImageSurface buffer = (ImageSurface)_view.Surface; 
    ThreadHelper.SetPicture(DebugForm, buffer.Image); 
    Application.DoEvents(); 
}; 

_view.ConsoleMessage += (s, e) => 
    ThreadHelper.AppendText(DebugForm, string.Format("{0} : {1} [{2}]\r\n", e.LineNumber, e.Message, e.Source)); 
2

あなたが同じフォームの2を作成している:

worker.DebugForm = new PBForm2(worker.Id); 
var debugForm = new PBForm2(worker.Id); 

はその後debugFormをロードするが、あなたの更新は表示されませんので、あなたのアップデートはDebugForm.picturebox1に行われています。 debugForm.picturebox1に更新を行う必要がありますが、作成する必要があります。

コードを一切表示せずに、ワーカークラスにそのコードをロードするか、または別のクラスを参照してください。

Application.Run(worker.DebugForm); 
Application.DoEvents(); 

または

worker.DebugForm = new PBForm2(worker.Id); 
var debugForm = worker.DebugForm; 

Application.Run(debugForm); 
Application.DoEvents(); 
+0

まあ、これは1つの問題を修正したが主導イベントがトリガされたAwesomiumスレッドからフォームのpictureBox1にアクセスできません。フォームへの変更を適切に呼び出すためにForm.Invoke関数を呼び出す静的クラスを作成して、そのクラスを作成しました。 –