■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#11437-1
大量のデータ受信をリアルタイムで表示してあげるっ。
いつもお世話になっています。
前回も似たような質問しました、解決できたと思ってたのですが
まだ問題がありました。

100000キャラ以上のデータの受信を行っています。

InBufferSizeは2048

With PDQComm1
   '受信処理
   If .InBufferCount Then
          '受信バッファからデータを読み込み
         InPut_Key = InPut_Key & .InputB
	'受信文字列長さ
	ReceiveLength = LenB(InPut_Key)
	'受信String配列再宣言
	ReDim Receive_Array(ReceiveLength)
	'1文字づつ取り出してDataTextに格納
	For i_Loop = 1 To ReceiveLength
		'UniCode変換
		Receive_Array(i_Loop) = StrConv(MidB(InPut_Key, i_Loop, 1), vbUnicode)
		'DataTextに格納
		DataText = DataText & Receive_Array(i_Loop)
	Next i_Loop

	'この時点でテキストボックスに表示

	'まだ受信バッファにデータがあるなら
	If .InBufferCount > 0 Then
	        '引き続きバッファから読み込み(タイマ内で受信処理)
                 .Timer1.Interval = 100
                 .Timer1.Enabled = True
        	ElseIf .InBufferCount > 2048 Then
                 .InBufferCount = 0
	ElseIf .InBufferCount = 0 Then
	     '受信データ処理
	EndIf
	'ここで配列のクリア
     EndIf
End With

上の処理をしていると
最初はデータを受信したらリアルタイムにテキストボックスに
表示してくれますが、だんだん重くなっていくカンジで
時間がたつにつれて表示する速度が遅くなっていき
しまいにはハングアップしてしまいます。

大量のデータを一定のバイト(たとえば2048)ずつ受信して
それらをリアルタイム(少々のズレはOK)で表示して、表示し終わったところで
再びバッファを読みにいくという作業をしたいのですが
なにかよい案はあるのでしょうか?
#11444-1
RE#11437:大量のデータ受信をリアルタイムで表示してあげるっ。
> 上の処理をしていると
> 最初はデータを受信したらリアルタイムにテキストボックスに
> 表示してくれますが、だんだん重くなっていくカンジで
> 時間がたつにつれて表示する速度が遅くなっていき
> しまいにはハングアップしてしまいます。
> 
> 大量のデータを一定のバイト(たとえば2048)ずつ受信して
> それらをリアルタイム(少々のズレはOK)で表示して、表示し終わったところで
> 再びバッファを読みにいくという作業をしたいのですが
> なにかよい案はあるのでしょうか?


もしかして、受信したデータを最初から全て一つのテキストボックスに表示しているのでしょうか?
それであれば、テキストボックスを増やすとかで一つに表示するデータ量を減らした方がいいと思います。
長い文字列の連結はメモリを大量に消費します。

ハズしていたら御免なさい。


 _________ _____ ______
| はじめたばかり \ Q&A \ 超初心者 \
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄       \
| 今日の初心者は明日の知識人
|
#11449-1
RE#11437:大量のデータ受信をリアルタイムで表示してあげるっ。
> 前回も似たような質問しました、解決できたと思ってたのですが
> まだ問題がありました。
どの部分が問題か調査してみましたか?

> 最初はデータを受信したらリアルタイムにテキストボックスに
> 表示してくれますが、だんだん重くなっていくカンジで
> 時間がたつにつれて表示する速度が遅くなっていき
> しまいにはハングアップしてしまいます。
通信部分は速度低下にそれほど影響を与えていない・・・までは
分かったのですよね?

なら、文字列の処理で速度低下がおきている事になります。

文字列変数での追加は・・・
strTemp = ""
For i = 1& To 100&
  strTemp = strTemp & String$(1000& , &H41)
Next i
とするより
strTemp = String$(100000&, 0)
For i = 1& To 100&
  Mid(srTemp, 1& + (i - 1&) * 1000&, 1000&) = String$(1000& , &H41)
Next i
の方が高速に出来ます。
※仕様次第ですが・・・

> 	ReceiveLength = LenB(InPut_Key)
> 	'受信String配列再宣言
> 	ReDim Receive_Array(ReceiveLength)
> 	'1文字づつ取り出してDataTextに格納
> 	For i_Loop = 1 To ReceiveLength
> 		'UniCode変換
> 		Receive_Array(i_Loop) = StrConv(MidB(InPut_Key, i_Loop, 1), vbUnicode)
> 		'DataTextに格納
> 		DataText = DataText & Receive_Array(i_Loop)
> 	Next i_Loop
この部分に何か無駄がありそうなんですけど・・・

DataText = StrConv(InPut_Key, vbUniCode)
だけではいかがでしょうか?
※InPut_Keyの宣言が無いし、詳しい仕様が分からないので
 外しているかも・・・

> 
> 	'この時点でテキストボックスに表示
テキストボックスへ表示させているコードはどんなコード?
Text1.Text = Text1.Text & DataText
なら・・・SelTextを使用する方法に変更して見て下さい。
※詳しくはヘルプ参照
 「SelLength、SelStart、SelText プロパティ」

ちなみに100000文字をテキストボックスに表示出来るかも
調査して見て下さい。
#11451-1
RE#11437:大量のデータ受信をリアルタイムで表示してあげるっ。
> 	'この時点でテキストボックスに表示
この部分を Text1.Text = Text1.Text & DataText としていませんか?
&での文字連結は文字数が多くなると非常に遅くなります。

    Text1.SelStart = Len(Text1.Text)
    Text1.SelText = DataText
としてみてください。
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)