2009-03-03 17 views
1

私はすぐに大学の割り当てをしています。実行には時間がかかります(おそらくinfinte、ユーザー入力に依存します)C++ dllを呼び出す必要があります。私はこれをVBで呼びます。私のVB GUIはフリーズしてしまい、GUIを応答しておきたいので、ユーザーがこのようなループを止めることができます。マルチスレッドの最善の方法

誰もがこれを行う最高の/最速の方法を提案することはできますか?

C++はウェブカムを使ってスヌーカーテーブルのスコアを保持しようとしていますが、VBスコアボードは簡単に更新されますが、解析はほぼ継続しています。ユーザは対話する。現在のところ、このプロジェクトではショット解析を開始するにはユーザーがボタンを押す必要がありますが、プログラム自体がスクリプトを作成している方が望ましいでしょう。私は今この問題を認識しており、締め切りはすぐに終わりです。

アップデート:私たちの講師は、問題を解決するためのオプションを示唆したが、ほとんどここにオプションと、彼はウェブカメラの画像キャプチャのために必要な処理時間として私たちのために動作しません示唆し1が原因処理するためには大きすぎるように思われますハードウェアの制約に依存します。時間を割いてくれてありがとう、それは非常に感謝していた!

+1

本当にクールなプロジェクトのようですね。 – configurator

答えて

2

VB.NETでのスレッド処理を処理する最善の方法は、System.Threading名前空間を使用することです。

また、マークが言ったようにもVB.NETで少し単純である背景のワーカープロセスを見てみてください、system.Threadingを試してみてくださいApplication.DoEvents()

+0

Application.DoEvent()はスレッド化とは関係ありませんが。 – erikkallen

+0

私は決して言ったことはありません:) –

+0

彼は彼の外部C + +のDLLからApplication.DoEvents()を呼び出すことはできません、彼はできますか?私は単純なスレッドがここの答えだと思います。 – configurator

1

に見えるかもしれません。 Readup here

0

これに代わる方法として、実際にはC++を常にバックグラウンドで処理させることができます。 VBから呼び出されたときには、そのデータを取得したり、コマンド(start、quit、???)を送信するだけです。これらのコマンドはすべて即時に戻ります。

これはまた、VBがゴミを収集している間にビデオフレームを見逃したり、バックグラウンドでVBが何をしていても、C++はあなたがリアルタイムシステムに近づくようにするため、 。

RE:コメントについて。

おそらく私のVBプログラムは、C++に「メッセージ」を送るようにしています(私が言ったように)。メッセージは関数/メソッド呼び出しを考える方法ですが、一般的にはすぐに返されます。

「開始」メッセージは、C++コードにスレッドの実行を開始して戻すように指示します。これはLinux C++ thread howtoですが、Windowsで何か別のことをする必要があるかどうかはわかりません(私は望んでいませんが、何十年も私の主な開発者としてC++を使用していません)。

問題が解決しない場合は、単に「停止」のメッセージの送信「をC++スレッド」

をGoogleがスレッドを停止(そしておそらくリソースの解放)です。

「Get Data」コールは、C++スレッドがデータの格納に使用した場所に移動し、取得して戻ります。

とても一般的に申し訳ありませんが、最近はかなりJavaです。

+0

これは良い選択肢のようです。バックグラウンドでC++を常時稼働させるにはどうすればいいですか? VBでdo untilループを使用してダウンタイムを最小限に抑えようとしていましたが、これはより良いオプションのようです。 – user71498

1

私は間違いなくバックグラウンドワーカープロセスを使用します。フォームにドラッグして、DoWorkサブルーチンを使用してGUIスレッドをフリーズしている作業を実際に行うことができます。また、ReportProgressイベントを使用して、実際にフォームに進捗状況を戻すこともできます。両方のステップが完了するまでに長い時間がかかる場合は二つの別々のスレッドに関するご質問については

、私は他の後に、同じスレッド1でそれらを実行します。スレッドを使用して、あなたをかむことができ

一つのことは、クロススレッドです。あなたの問題の文脈では、これはあなたの2番目のスレッドがフォームコントロールを更新しないことを意味します。

クロススレッドを扱うとともに、このコードを実装する方法のための本当に良いリソースは、これはPDFです。

私はまた、あなたが.NET 1.0/1.1を使用している場合、あなたはまだマルチスレッドを行うことができますが、バックグラウンドワーカーコントロールを持つのluxaryを持っていないことを指摘しなければなりません。 System.Threading名前空間から新しいスレッドを作成するだけです。