0

3.9.7 cURLライブラリを使用してインターネットからファイルをダウンロードしているので、viculoの動的なbibiotecaを作成しました。VC + + 6.0を使用してCで記述されたdllの問題は、vb6アプリケーションウィンドウ内から関数を呼び出すと、ファイルをダウンロードした後でのみロックおよびロック解除されるということです。この問題を解決するにはどうすればよいですか。

4

2 に答える 2

2

問題は、DLLから関数を呼び出すと、終了するまでアプリの実行を「ブロック」することです。基本的に、実行は関数呼び出しを行うコードから関数呼び出し内のコードに進み、関数内のコードの実行が終了した後、関数呼び出し後に次の行に戻るだけです。実際、これがすべての関数呼び出しの仕組みです。これは、VB6開発環境でコードをシングルステップで実行することで確認できます。

呼び出されている関数内のコードは、制御が呼び出し元に返される前に実行するのにそれほど時間はかからないため、通常はこれに気付くことはありません。ただし、この場合、DLLから呼び出している関数は多くの処理を実行しているため、実行に時間がかかり、アプリケーションのコードの実行をかなりの時間「ブロック」します。

これは、アプリケーションウィンドウがフリーズしているように見える理由の一般的な説明です。もう少し技術的には、画面上の要素とのユーザーインタラクションの処理を担当するメッセージポンプが実行されていないためです(呼び出した関数が処理を終了するまで一時的に中断されたコードの一部です)。これは、VBプログラマーにとって理解するのが少し難しいです。なぜなら、この本質的なものはVBの世界では公開されていないからです。Cプログラムの場合と同じように、すべて舞台裏で行われていますが、通常はそれらのいずれにも対処する必要はありません。しかし、時折、抽象化が漏れ、核心がその醜い頭を後ろに向けます。これはそのようなケースの1つです。

他の人が示唆しているように、この一般的な問題の正しい解決策は、バックグラウンドスレッドで長い操作を実行することです。これにより、メインスレッド(現在、あなたが持っている唯一のスレッド、アプリケーションが実行されているスレッド)はユーザー入力の処理を続行できますが、他のスレッドはデータを処理し、処理されたデータをメインスレッドに返すことができます。終了した。もちろん、コンピューターは実際には一度に複数のことを実行することはできませんが、オペレーティングシステムがタスク間をすばやく切り替えるという魔法は、これをシミュレートできることを意味します。そのためのメカニズムにはスレッドが含まれます。

問題は、VB6環境が複数のスレッドを作成するためのサポートをまったく備えていないという事実にあります。取得するスレッドは1つだけであり、それがアプリケーションが実行されるメインスレッドです。その実行を一時的にでもフリーズすると、すでにわかっているように、アプリケーションがフリーズします。

ただし、すでにC ++ DLLを作成している場合は、VB6アプリで複数のスレッドを作成できない理由はありません。C ++のような別の低水準言語を使用しているかのように、すべてを自分で処理する必要があります。バックグラウンドスレッドでC++コードを実行し、完全に終了したときにのみ結果をメインスレッドに返します。その間、メインスレッドは無料です。

ただし、特にWin32プログラミングや複数のスレッドを取り巻く問題に関して経験が浅い場合は、これはまだかなりの作業です。すぐに使用できる非同期関数呼び出しをサポートする別のライブラリを見つける方が簡単な場合があります。Antagonyは、VBのAsyncRead方法を使用することを提案しています。それはおそらく良いオプションです。Karl Petersonがリンクされた記事で述べているように、すべてを純粋なVB 6コードに保持します。これは、リアルタイムの節約であり、将来のメンテナンスプログラマーにとってもメリットがあります。唯一の問題は、データを取得した後でも、何らかの方法でデータを処理する必要があることです。そして、それが遅い場合、あなたはあなたが始めたところに戻っています…

于 2012-07-25T21:20:03.933 に答える
2

この記事をチェックしてください。この記事では、ユーザーコントロールであまり知られていない方法を使用して、大きなファイルを非同期で転送する方法を示しています。

于 2012-07-25T20:34:05.203 に答える