VB6.0で重複データ検索のソフトを開発しております。フォーム上にListViewとコマンドボタンがありListViewに読み込ませたファイルが何個か表示されてて、コマンドボタンを一度クリックしたあとListView内にある読み込ませたファイルを同時に処理したいのですが方法が分かりかねます。一応、一旦全ファイルを配列に入れて配列内の同じ番号にあるやつのみを同時に処理(無ければそのファイルは終了)と試しましたがなんだか同時に思えなくて・・・
いろいろ調べて見ましたが見つからずどなたかご教授して頂けると幸いです。
コマンドボタンクリック後の処理に
Call File1
Call File2
・
・
・
と処理しましたがこれではCall File1の処理が終らないとFile2にはいかないので同時にはなりませんでした。かと言ってコマンドボタンを何個も配置してクリックでは面倒なので何かいい方法が無いものかと思っております。分かりにくい説明かもしれませんが、宜しくお願い致します。
通常、同時処理(並列処理)を行うにはスレッドを使用しますが、
残念ながらVB6.0はスレッドを作成できません。
VB.NETならSystem.Threading.Threadクラスが用意されているので
可能ですが・・・。
よって、VB6.0では順番に処理するしか方法がありません。
余談ですが私は昔、VB6.0でスレッドを使いたかったので
スレッド部分をVC++6.0のDLL又はCOMで作成して
VBの関数アドレスをaddressof演算子でDLL及びCOM側に
渡して行っていました。
モーヲタさん有難う御座います。そうですか・・・
やはり無いですか・・・
私はVC++がほとんどできないのでDLLを作成することもできません。
やはりコマンドボタンをListView内のファイル分作成してその分をクリックするしかないですねー。
助言、有難う御座いましたー。
同時処理の必要性があるのでしょうか?
その理由如何によっては、わざわざマルチスレッドで行う必要も無いかと。
VB6で上記の何等かの処理を1ファイルづつ行ったとして、その1ファイル
の処理で、CPUの負荷を食ってしまうようなコーディングですと、結局、他
のスレッドにCPUタイムが割りあたらなくなり、結果的にマルチスレッドで
行う効果が無くなります。
該当のデータファイルの大きさによっては、キャッシュに乗らない為、マルチ
化の効果は設計時点で無くなると思われますが・・・
その辺如何?
※ どうしてもVB6でと言うことであれば、擬似的な処理ですが、タイマー
3個をフォームに貼り付け、各々のタイマーから重複データ検索を行う機
能を呼び出せば?
尚、VB6はスレッドセーフではないので、各タイマーから呼ばれる重複
データ検索関数は、3個用意して呼び出されては?
ループ処理中には、DoEventsを入れて・・・CPUタイムが他に割り当た
るようにすることが肝要です。
以上。
追伸
VB6でマルチスレッド・・・は、できない。との記述を多くみかけますが
再度調べてみたところ、できるようです。
http://dobon.net/vb/bbs/log3-11/6202.html
P-Codeコンパイルで実行しないといけないとのこと。
ただし、スレッドの関数内にブレークポイント置いたら、飛ぶと言うか、
ハングアップしたかナ?デバッグできないので、お気をつけ下さい。
それと、多分、スタックの問題も隠れており、巨大な処理やオート変数
で大量なメモリを使うようなコーディングや、ReDimは落ちる原因だった
と思います。制約があることを忘れずに!
参考までに。
以上。
オショウさん助言有難う御座います。
確かに一ファイルずつでもいいのですが、実際にはDBに検索対象になるデータが入っていてそれをフォルダ内に比べたいデータファイルを入れておき(CommonDialogで一つずつよりフォルダ内のデータを見る方が楽かと思いました)重複していないデータのみ排出したいと考えておりました。最初は全部一ファイルずつ処理してたのですが同時の方が楽かと思いましてこのような発言をしました。
確かに一ファイルに負荷がかかってしまうと意味はないと思います。
ただ、機能として一ファイルずつの処理もあるのですが複数の機能もつけようかと思い同時処理の発言をしました。
※但し、タイマーを複数配置での処理は考えて無かったです。
参考になりました。
試してみます。
本当に有難う御座いました。
オショウさん本当に有難う御座います。
追伸でのURLを参考にそれも試してみます。
本当にご迷惑をお掛けして申し訳御座いませんでした。
なるほど・・・p-Codeコンパイルすれば可能ではあるのですね。
一つ勉強になりました。
ちなみにスレッド内に制約はまだあります。
スレッド関数内で直接TextBoxのメソッドやFormのメソッドなど
あるコントロールのメソッドやプロパティを参照すると
かなりの確率で落ちます(落ちない場合もある)。私はコレにかなり苦労
した記憶があります。
よってやはりVB6.0でスレッドを構築すると予期せぬ不具合を
もたらす危険性が大きくなるのでタイマーイベント等で
対処する方が安全なような気がします。
とはいってもオショウさんが言われている通り、わざわざマルチスレッド
にしなくても良いような気がします。
外部のデータファイルの形式を調整できるのであれば、データベースが
SQL Server であるならば、エージェントにJOB登録して、定期的に外部
データを参照して自動処理させると言う手もあろうかと。
また、システムサービス(Windowsサービスとも言いますか)にフォルダ
のファイル監視をさせて、データファイルが追加更新されれば、そのイベ
ントで、SQLを実行させると言う手もあります。
サービスはVB6でも組めますし・・・
なんとか欲しい機能は実現可能かと。
以上。
モーヲタさん、オショウさん今回は本当に有難う御座いました。
お陰さまで解決できました。
タイマーイベント処理の方が安全でした。
確かに今回の処理では、なくてもいい処理なのかもしれませんが今後必要になる時がくるかもしれません。
その時に今回のご教授はすごく助かると思います。
今後もひょっとしたらくだらないスレを書くかもしれませんが、何卒今後ともご教授宜しくお願い致します。
今回は本当に有難う御座いました。
ツイート | ![]() |