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

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

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

Re[2]: 並列処理を利用した通信について


(過去ログ 98 を表示中)

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

■58677 / inTopicNo.1)  並列処理を利用した通信について
  
□投稿者/ piroyuki (4回)-(2011/04/22(Fri) 09:45:08)

分類:[C#] 

マルチコア(Core 2 Quad)を利用した並列処理ができないか検討しています。

C# 2010 Express のParallel.Invokeで、並列に処理を動かし、
通信にはFTDI社のFtd2xxドライバーを使用しようと思っています。

この場合の排他制御について質問させてください。
単純化していますが、以下のようにプログラミングした場合、
機器1と機器2で同じ関数FT_Write()、FT_Read()を使用することに
なるので、マズイのではないかと考えています。

FT_Write()、FT_Read()内での排他制御も考える必用があるとということで、
以下のように考えるべきなのでしょうか。

クラスを2つ用意し、それぞれのファイルの頭で、
#region 宣言部 内の宣言を行い、
機器1、2で別々のFT_Write()、FT_Read()を使用する。

また並列処理について参考になるHP、書籍等ありましたら
教えていただけるとうれしいです。

よろしくお願いします。


#region 宣言部
using FTD2XX_NET;

//FT_WRITE
[DllImport("FTD2XX.dll")]
unsafe private static extern UInt32 FT_Write(
    UInt32 ftHandle,
    [MarshalAs(UnmanagedType.LPArray)] byte[] bdata,
    UInt32 BufferSize,
    UInt32* BytesWriten);

//FT_READ
[DllImport("FTD2XX.dll")]
unsafe private static extern UInt32 FT_Read(
    UInt32 lngHandle,
    [MarshalAs(UnmanagedType.LPArray)] byte[] bdata,
    UInt32 lngBufferSize,
    UInt32* lngBytesReturned);
#endregion 宣言部



Parallel.Invoke(
() =>
{

	//USB機器1へデータ要求
	FT_Write(handle1,  省略 );

	//USB機器1からデータ受信
	while(Flg1 == false)
	{
		FT_Read(handle1,  省略 );
		
		//FT_Read()で受信したデータに従いFlg1をTrueにする
	}
}
,
() =>
{

	//USB機器2へデータ要求
	FT_Write(handle2,  省略 );

	//USB機器2からデータ受信
	while(Flg2 == false)
	{
		FT_Read(handle2,  省略 );

		//FT_Read()で受信したデータに従いFlg2をTrueにする
	}
}
);

引用返信 編集キー/
■58678 / inTopicNo.2)  Re[1]: 並列処理を利用した通信について
□投稿者/ オショウ (584回)-(2011/04/22(Fri) 10:05:41)
2011/04/22(Fri) 10:06:27 編集(投稿者)

> マルチコア(Core 2 Quad)を利用した並列処理ができないか検討しています。

  今回の並列処理とは、マルチコアの性能を十分に引き出したいのか
  ただ単にマルチスレッドで効率よく通信したいのか、どちらでしょうか?

> C# 2010 Express のParallel.Invokeで、並列に処理を動かし、
> 通信にはFTDI社のFtd2xxドライバーを使用しようと思っています。

  FTDI社のFtd2xxドライバーって、USB・シリアル変換アダプタですか?
  商品として何なのかよくわからん・・・
  で、Windows標準COMポートにならないもの?
  専用APIで通信するなら、そのアダプタが、1台のPCに複数接続できる
  ものであれば、マルチスレッドでアクセスは可能・・・しかしながら、
  1台のPCに1個だけ接続と言う機器も結構ある為、そういう場合は、
  ドライバーやDLLがマルチスレッド非対応なので、排他制御しても、
  使えません。

  他社の標準COMになるUSB・シリアル変換アダプタ使うか・・・
  2社の違うUSB・シリアル変換アダプタ使った方が安全。

以上。
引用返信 編集キー/
■58679 / inTopicNo.3)  Re[2]: 並列処理を利用した通信について
□投稿者/ piroyuki (5回)-(2011/04/22(Fri) 10:27:15)
回答ありがとうございます。
説明不足ですみませんでした。
補足させていただくと、システム構成は1台のPCに2台のUSB機器を接続します。

>今回の並列処理とは、マルチコアの性能を十分に引き出したいのか
>ただ単にマルチスレッドで効率よく通信したいのか、どちらでしょうか?
2台のUSB機器にデータ要求・受信通信処理をシングルスレッドで行うと、
規定時間内に通信処理が収まりきらないため、並列処理によりパフォーマンスの向上
ができないか検討しています。

>FTDI社のFtd2xxドライバーって、USB・シリアル変換アダプタですか?
>  商品として何なのかよくわからん・・・
、USB・シリアル変換アダプタではありません。
USB機器とPCとはUSBケーブルのみで接続します。
先ほどドライバーと書いたのは不適切だったかもしれません。
Ftd2xxドライバーと書いたのは、USB機器を制御するDLLのことで、
FT_Read()、FT_Write()のAPIを使用するために読み込んでいます。

引用返信 編集キー/
■58681 / inTopicNo.4)  Re[3]: 並列処理を利用した通信について
□投稿者/ todo (139回)-(2011/04/22(Fri) 10:42:40)
> 機器1と機器2で同じ関数FT_Write()、FT_Read()を使用することに
> なるので、マズイのではないかと考えています。

本当に、そんな糞APIなのですか?
引用返信 編集キー/
■58682 / inTopicNo.5)  Re[4]: 並列処理を利用した通信について
□投稿者/ ツPツAツTツIツO (3回)-(2011/04/22(Fri) 11:20:11)
No58681 (todo さん) に返信
>>機器1と機器2で同じ関数FT_Write()、FT_Read()を使用することに
>>なるので、マズイのではないかと考えています。

内容的にはDLLの提供元に問合せるべき話だと思います。
この掲示板で大丈夫と言う話が出たとしてもそれは保証になりませんし。
関数の仕様次第になるので関数仕様をきちんと確認すべきです。
多分調べておられるとは思いますが、まずはDLLの説明資料を確認して
それでも分からないならやはり提供元に確認と言うことになると思います。

引用返信 編集キー/
■58683 / inTopicNo.6)  Re[5]: 並列処理を利用した通信について
□投稿者/ PATIO (109回)-(2011/04/22(Fri) 11:21:43)
がーん、また名前が変になった。
Firefox4にしてからずっとこの調子。

No58682 (ツPツAツTツIツO さん) に返信
> ■No58681 (todo さん) に返信
> >>機器1と機器2で同じ関数FT_Write()、FT_Read()を使用することに
> >>なるので、マズイのではないかと考えています。
>
> 内容的にはDLLの提供元に問合せるべき話だと思います。
> この掲示板で大丈夫と言う話が出たとしてもそれは保証になりませんし。
> 関数の仕様次第になるので関数仕様をきちんと確認すべきです。
> 多分調べておられるとは思いますが、まずはDLLの説明資料を確認して
> それでも分からないならやはり提供元に確認と言うことになると思います。
>
引用返信 編集キー/
■58684 / inTopicNo.7)  Re[6]: 並列処理を利用した通信について
□投稿者/ todo (140回)-(2011/04/22(Fri) 11:32:02)
>FT_Write()、FT_Read()内での排他制御

FT_Write()、FT_Read()をラップする関数を作って、API呼出中はlockする

lock ステートメント
http://msdn.microsoft.com/ja-jp/library/c5kehkcz(v=vs.80).aspx

引用返信 編集キー/
■58685 / inTopicNo.8)  Re[6]: 並列処理を利用した通信について
□投稿者/ piroyuki (6回)-(2011/04/22(Fri) 11:43:01)
No58683 (PATIO さん) に返信
> がーん、また名前が変になった。
> Firefox4にしてからずっとこの調子。
>
> ■No58682 (ツPツAツTツIツO さん) に返信
>>■No58681 (todo さん) に返信
>>>>機器1と機器2で同じ関数FT_Write()、FT_Read()を使用することに
>>>>なるので、マズイのではないかと考えています。
>>
>>内容的にはDLLの提供元に問合せるべき話だと思います。
>>この掲示板で大丈夫と言う話が出たとしてもそれは保証になりませんし。
>>関数の仕様次第になるので関数仕様をきちんと確認すべきです。
>>多分調べておられるとは思いますが、まずはDLLの説明資料を確認して
>>それでも分からないならやはり提供元に確認と言うことになると思います。
>>
ありがとうございます。
手順的にはおっしゃるとおりだと思いました。
FTDIという会社が国内の会社でないようなので、二の足を踏んでました。。。
そちらの方向も検討してみます。
このDLLが並列処理には対応していないだろう、という勝手な思い込みは危ないですね。

引用返信 編集キー/
■58686 / inTopicNo.9)  Re[1]: 並列処理を利用した通信について
□投稿者/ オショウ (585回)-(2011/04/22(Fri) 11:59:33)
> //FT_WRITE
> [DllImport("FTD2XX.dll")]
> unsafe private static extern UInt32 FT_Write(
> UInt32 ftHandle,
> [MarshalAs(UnmanagedType.LPArray)] byte[] bdata,
> UInt32 BufferSize,
> UInt32* BytesWriten);
>
> //FT_READ
> [DllImport("FTD2XX.dll")]
> unsafe private static extern UInt32 FT_Read(
> UInt32 lngHandle,
> [MarshalAs(UnmanagedType.LPArray)] byte[] bdata,
> UInt32 lngBufferSize,
> UInt32* lngBytesReturned);

  FTDI社のナレッジベースも読んでみましたが・・・
  USBデバイスとして複数認識はOKなようなので、同時に複数接続して
  通信できるか?については、APIの変数宣言で、lngHandle として、
  デバイスを見分けるハンドルが割りあたっているので、

  『大丈夫じゃ〜ないかな〜』

  と思われます。

  排他制御の方法は、いろいろあるので、実装させバグらなければ、
  ちゃんと動作するかと。

※ ただこういうケースは、ドライバー内のバグとかで、OSクラッシュ
  して再起動・・・なんてことがよくあるので、プログラムをデバッグ
  する際のブレークポイントの置く場所や、デバイスをクローズしない
  で、デバッグを中止する・・・なんてことはやらないように!

  どうしてもデバッグを中止して抜けてしまう場合は、IDE環境も終了
  させて再度VisualStudio起動すれば、トラブルの軽減はできます。
  安心したければ、機器とのUSB接続を解除(ケーブルを抜く)する
  のが得策かと。

  ケーブル挿して再認識しない場合は、ドライバーがバグっているので
  PC再起動かな〜

以上。
引用返信 編集キー/
■58687 / inTopicNo.10)  Re[7]: 並列処理を利用した通信について
□投稿者/ piroyuki (7回)-(2011/04/22(Fri) 12:06:09)
No58684 (todo さん) に返信
> >FT_Write()、FT_Read()内での排他制御
> 
> FT_Write()、FT_Read()をラップする関数を作って、API呼出中はlockする
> 
> lock ステートメント
> http://msdn.microsoft.com/ja-jp/library/c5kehkcz(v=vs.80).aspx
> 

回答ありがとうございます。
API呼出中だけlockするのであれば、
問題になっている”規定時間内に通信処理が収まりきらない”という
点もクリアできそうな気がします。

Object thisLock = new Object();
lock (thisLock)
{
	FT_Read(handle2,  省略 );
}

引用返信 編集キー/
■58688 / inTopicNo.11)  Re[2]: 並列処理を利用した通信について
□投稿者/ piroyuki (8回)-(2011/04/22(Fri) 12:12:09)
>   FTDI社のナレッジベースも読んでみましたが・・・
>   USBデバイスとして複数認識はOKなようなので、同時に複数接続して
>   通信できるか?については、APIの変数宣言で、lngHandle として、
>   デバイスを見分けるハンドルが割りあたっているので、
>   『大丈夫じゃ〜ないかな〜』
>   と思われます。
いろいろお手数をおかけしてすみません。
複数機器の接続については、機器にIDを割り振り、オープン時にそのIDを指定
することで、複数認識は可能です。

> ※ ただこういうケースは、ドライバー内のバグとかで、OSクラッシュ
>   して再起動・・・なんてことがよくあるので、プログラムをデバッグ
>   する際のブレークポイントの置く場所や、デバイスをクローズしない
>   で、デバッグを中止する・・・なんてことはやらないように!
デバイスをクローズせずに、デバッグを中止するということは、思い当たる節が多々あるので
これから注意します。ありがとうございます。


引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -