C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: Visual Basic でのループ+マルチスレッド化


(過去ログ 99 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■59364 / inTopicNo.1)  Visual Basic でのループ+マルチスレッド化
  
□投稿者/ TN (1回)-(2011/05/23(Mon) 16:52:01)

分類:[VB.NET/VB2005 以降] 

お世話になります。



現在、Visual Basic 2010 Expressを利用して
「任意で作成したボタンをクリックすると、PCのDIOボードの入力(3つの入力を使用)を確認し、その入力に応じたプログラムを
実行する(再度ボタンをクリックするまでは、何度でも同じ動作を実行する)」
というプログラムを作成したいと考えております。

当方、Visual Basicを使うのが初めてなので、インターネットで情報収集しながらプログラムを作成しているのですが、
正常に動作させる事が出来ません。

現状は、While文でDIOボードの入力を常時監視して、入力があった場合はマルチスレッドを利用して対応したプログラム
を作成しようとしてますが、ループの動作が重すぎてフリーズしたような状態になってしまいます。。。

説明下手でわかりにくいかと思いますが、なにか解決案があればご教示ください。
宜しくお願い致します。


引用返信 編集キー/
■59366 / inTopicNo.2)  Re[1]: Visual Basic でのループ+マルチスレッド化
□投稿者/ shu (714回)-(2011/05/23(Mon) 17:47:38)
No59364 (TN さん) に返信

DIOボードへのインターフェースがどのようになっているのか分かりませんが、
状態監視のループをメインスレッドで行っているのなら、それを別スレッドにすると
よいかと思います。
また用意されているインターフェースにはイベントを発生するものは用意されていませんか?

引用返信 編集キー/
■59367 / inTopicNo.3)  Re[2]: Visual Basic でのループ+マルチスレッド化
□投稿者/ TN (2回)-(2011/05/23(Mon) 18:50:42)
2011/05/24(Tue) 13:24:54 編集(投稿者)

No59366 (shu さん) に返信


ご返信ありがとうございます。

マルチスレッド内でループを作った場合も、同様にフリーズしたような状態となってしまい、正常な動作が
完了できませんでした。

DIOは、PCI7230というタイプのものなのですが、

1.ツールボックス内にDAQPilotEngineというものを追加してそれをフォーム内に適応
2.入出力設定をDAQPilotEngine内で設定
3.[xxxx(任意のname).READ]で指定したINから信号状態を取得

という流れで取り込む様になってます。
shuさんがおっしゃられているように、イベントを発生出来れば万々歳なのですが。。。


引用返信 編集キー/
■59394 / inTopicNo.4)  Re[3]: Visual Basic でのループ+マルチスレッド化
□投稿者/ shu (716回)-(2011/05/24(Tue) 16:07:35)
No59367 (TN さん) に返信
> 2011/05/24(Tue) 13:24:54 編集(投稿者)

> マルチスレッド内でループを作った場合も、同様にフリーズしたような状態となってしまい、正常な動作が
> 完了できませんでした。
スレッド内のループで1回毎にSleepをするか、メインならTimerで監視間隔をあけて実行してみるとか
どうでしょう?
引用返信 編集キー/
■59464 / inTopicNo.5)  Re[4]: Visual Basic でのループ+マルチスレッド化
□投稿者/ TN (3回)-(2011/05/26(Thu) 16:12:14)
2011/05/26(Thu) 16:13:55 編集(投稿者)
2011/05/26(Thu) 16:12:43 編集(投稿者)

No59394 (shu さん) に返信

ご返信ありがとうございました。

Timerで監視間隔を1msごとにすることでフリーズしたような状態にならず、プログラムを
連続的な取り込み待ちを作ることが出来ました。
ありがとうございます。


もう一点ご質問がございます。
現在、BackGroundWorkerを利用してマルチスレッド化を計っているのですが、前に作成した
プログラムに比べて若干タイムラグが存在しているような気がします。
下記に示す例のように「3つの動作を並列で行うプログラム」を作成したのですが、BackGround
Workerを使う上での注意点はありますでしょうか?



【タイムラグがないと思われるプログラム(一部抜粋)】

Private Sub C1__Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles C1_.Click

Dim test1 As New System.Threading.Thread(AddressOf test_1)
Dim test2 As New System.Threading.Thread(AddressOf test_2)
Dim test3 As New System.Threading.Thread(AddressOf test_3)


test1.Start()
test2.Start()
test3.Start()

test1.Join()
test2.Join()
test3.Join()

End Sub


Private Sub test_1()

*****実行プログラム1*****

End Sub

Private Sub test_2()

*****実行プログラム2*****

End Sub

Private Sub test_3()

*****実行プログラム3*****

End Sub



【タイムラグが生じているように感じるプログラム(一部抜粋)】


Private Sub C1__Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles C1_.Click

test1.RunWorkerAsync()
test2.RunWorkerAsync()
test3.RunWorkerAsync()

End Sub


Private Sub test1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles test1.DoWork

*****実行プログラム1*****

End Sub

Private Sub test2_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles test2.DoWork

*****実行プログラム2*****

End Sub

Private Sub test3_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles test3.DoWork

*****実行プログラム3*****

End Sub
引用返信 編集キー/
■59472 / inTopicNo.6)  Re[5]: Visual Basic でのループ+マルチスレッド化
□投稿者/ shu (728回)-(2011/05/26(Thu) 17:50:51)
No59464 (TN さん) に返信

詳しくはわかりませんが、Joinするとメインが終了まで待機するのでその分処理に集中するんじゃないかな?
タイムラグは蓄積していますか?蓄積するようなら1回の処理を速くするか通信内容を定期的に捨てる必要が
あるかもしれません。
引用返信 編集キー/
■59473 / inTopicNo.7)  Re[6]: Visual Basic でのループ+マルチスレッド化
□投稿者/ TN (4回)-(2011/05/26(Thu) 18:12:45)
No59472 (shu さん) に返信


ご返信ありがとうございます。色々と回答して頂き本当にありがたいです。

今まで、背景を書くのを忘れていたので、まずはそこから記載させてもらいます。


いま、3台のカメラを使って非同期での画像取り込みをしたいと思ってます。
動いている物体を撮影するので数msのタイムラグがあると厳しい様な状態です。

一番負荷がかかるのが、3台のカメラに同時にトリガが入力された時だと思うので
今はそのときの取り込み状態を確認しているところです。


取り込みにかかる時間は1台の場合100ms程度です。
マルチスレッド機能を使って、3台同時に取り込みを行なった場合、

BackGroundWorkerを使わない場合 → 100ms〜135ms
BackGroundWorkerを使った場合 → 110ms〜185ms

となり、BackGroundWorkerを使うと、タクトのバラツキ量が大きくなってしまいます。


今のところは、タイムラグが蓄積していないと考えてますが、取り込みがばらついて
しまうところが問題として残っている状態です。



引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -