0

VB6で記述されたEXE用のC#DLLプラグインを作成しています。EXEのソースにアクセスできません。DLL自体が機能し、EXEと正常に通信します。

イベントのプロセスは次のとおりです。

  1. ユーザーがEXEでコマンドを発行すると、DLL内の関数が呼び出され、オブジェクトがパラメーターとして渡されます。
  2. DLLは、時間がかかることがあるデータを処理します
  3. DLLは、渡されたオブジェクトの関数を呼び出すことによって応答します。DLL関数自体は何も返しません

    public void DoCommand(object CommandSettings)
    {
        //ObjectVB6 is my custom class to allow easy calling of COM methods and properties
        ObjectVB6 CS = new ObjectVB6(CommandSettings);
        ... //process data
        CS.CallMethod("MyReply", args);
    }
    

私の問題は、(DLLからの)長いクエリ中に、EXEのUIがフリーズすることです。

これを防ぐための最良の方法は何ですか?非同期のMySQLクエリを使用してみましたが、これは良くありませんでした。また、複数のスレッドを使用してみましたが、保護されたメモリの問題が発生しました。

あなたが提供できるどんなアドバイスも素晴らしいでしょう。この問題に何日も対処しようとしてきました。ありがとう。

4

5 に答える 5

1

次のことを試してください。

BackgroundWorker bw = null; 
ObjectVB6 CS = null;

public void DoCommand(object CommandSettings)
{
    //ObjectVB6 is my custom class to allow easy calling of COM methods and properties
    CS = new ObjectVB6(CommandSettings);

    // hook up background worker
    bw = new BackgroundWorker();
    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}

private void bw_DoWork(...)
{
    // process data, e.g. the piece that takes too long
}

private void bw_RunWorkerCompleted
{
   CS.CallMethod("MyReply", args);
}

レスポンダーの1人が言ったように、VB6アパートメントスレッドの性質により、これは機能する場合と機能しない場合があります。

于 2009-11-27T04:57:54.230 に答える
0

私は自分が求めていたものを達成する方法を考え出しました。私はより良い方法を好みますが、この方法は機能します。

情報を共有するために2つのキューを使用しました。メインスレッドは_getキューの取得をリッスンし、リクエストが行われると_setキューを設定します。ワーカースレッドは単純にリクエストを_getキューに挿入し、_setの準備ができるまで待機します。メインスレッドはプロキシのように機能しています。

ご協力いただきありがとうございます!

于 2009-11-27T00:52:55.020 に答える
0

そのコードにワーカー スレッドを使用できないのはなぜですか? どのような「保護されたメモリの問題」が発生していますか?

于 2009-11-26T20:33:50.773 に答える
0

これに対処するIMOの最善の方法は、リクエストをThreadPoolDLL側の「ファイアアンドフォーゲット」スタイルにスローすることです。これを試しましたか?

それ以外の場合は、VB6 プログラムへのコールバック関数を起動してステータスを取得する必要があります。これは、既にお気づきかもしれませんが、VB6 のシングル スレッド アパートメント モデルのために注意が必要です。

VB6 でのマルチスレッド化の危険性とメリットをさらに詳しく調べたい場合は、次の記事をご覧ください。スレッドを起動してVB6側で実行するだけでよい場合があります。

VB5 および VB6 でのマルチスレッド
http://www.freevbcode.com/ShowCode.Asp?ID=1287

于 2009-11-26T20:37:54.540 に答える
0

.NET で開発されたすべての関数は、デリゲートを使用して非同期的に呼び出し、BeginInvoke を呼び出して実際に関数を呼び出すことができます。関数は何も返さないため、EndInvoke を呼び出す必要はありません。IAsyncResult を利用することで、Callback 要件を満たすことができます。これを適切に行う方法については、O'Reilly 発行の Juval Lowy による「Programming .NET Components」を参考にしてください。ISBN は 0596102070 です。よろしくお願いします。

于 2009-11-26T21:24:45.707 に答える