8

質問の一番下までスキップしてください。これは単なる追加情報です

コンポーネント (GeckoFX) を使用していくつかの Web サイトをレンダリングしていますが、これは Windows フォームでしか使用できません。描画できる WinForms オブジェクトにバインドする必要があるためです。すべての WinForms が同じスレッドで実行されているため、一度に 1 つの GeckoFX インスタンスしか使用できません。そこで、WinForm の形式で「ワーカー クラス」を作成し、そこにすべてのロジックを追加することにしました。フォームは、メイン フォームと通信する必要はありません。

これで 10 個のウィンドウを起動でき、最終的には機能しますが、1 つのスレッドで複数のインスタンスを使用できないため、他のすべてのフォームがすべての GeckoFX イベントを処理する前に、すべての新しいフォームが待機します。さらに、ブラウザは UIThread 上にある必要があります。そう:

複数の UI スレッド (フォームごとに 1 つ) を作成することはできますか?

私は誰かがそれをやっているのを見たことがあります ([編集: '悪い' リンクを削除しました]) が、誰も彼のコード サンプルを動作させたことはありません。それを機能させた人は、もともとこの種のことを行うために何らかの形のカスタムメッセージポンピングを使用していましたが、そのようなことを達成する方法はわかりません.

4

4 に答える 4

9

あなたが求めていることは本当にあなたが望むものではないと思いますが、スレッドごとにメッセージポンプを作成するのは簡単です.Application.Runをスレッドごとに1回呼び出すだけです.

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Thread t1 = new Thread(Main_);
        Thread t2 = new Thread(Main_);

        t1.Start();
        t2.Start();

        t1.Join();
        t2.Join();
    }

    static void Main_()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}
于 2009-10-14T23:01:02.410 に答える
3

GeckoFx はフォームを必要としません。

GeckoWebBrowser wb = new GeckoWebBrowser();
wb.CreateControl(); //<-- the magic lays here!
wb.DocumentCompleted += delegate{ MessageBox.Show(wb.DocumentTitle); };
wb.Navigate("http://mysite.com");
于 2010-12-14T06:02:02.680 に答える
2

Application.DoEvent()を使用します。
または
複数のスレッドフォームを作成します。

    Thread form2Thread;
    Form2 form2;

    private void Form1_Load(object sender, EventArgs e)
    {
        form2Thread = new Thread(RunForm2);
        form2Thread.SetApartmentState(ApartmentState.STA);
        form2Thread.Name = "Form2 Thread";   // looks nice in Output window
        form2Thread.Start();
    }

    public void RunForm2()
    {
        form2 = new Form2();
        Application.Run(form2);
    }
于 2009-10-14T22:51:28.327 に答える
1

それは可能のようです。

私はバックグラウンダーを取り、TestAppを開き、スレッド/メッセージポンプ#2で新しいForm1を作成しました。

private void button2_Click(object sender, EventArgs e) {
    helper.Background(() => {
        Form1 form2 = new Form1();
        form2.Show();
    });
}

2番目のウィンドウは、マウスのクリックなどに応答します。

すべてが正しく見えるかどうかを実際に確認していません。私が使用している無料のVisualStudioExpress Editionには、「スレッド」デバッグウィンドウがありません。だから私は少し暗闇の中にいます。しかし、それはうまくいくようです。お知らせ下さい :-)。

于 2009-10-14T22:55:30.650 に答える