からのイベントをサブスクライブするフォームを作成するので、私は更新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スレッドが滞っているためハングしません。
私の考えは次のとおりです。労働者は、労働者のインスタンスのプロパティとして新しいスレッドでフォームを作成作成され
- 。
- 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つの問題を修正したが主導イベントがトリガされたAwesomiumスレッドからフォームのpictureBox1にアクセスできません。フォームへの変更を適切に呼び出すためにForm.Invoke関数を呼び出す静的クラスを作成して、そのクラスを作成しました。 –