■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
|
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った): |
■ ページの共有: |
[ サイト内検索 ]
![]()
カスタム検索
|
#11437-1大量のデータ受信をリアルタイムで表示してあげるっ。Erica2000-06-09(金) 11:24
#11444-1RE#11437:大量のデータ受信をリアルタイムで表示してあげるっ。しげ2000-06-09(金) 13:17
#11449-1RE#11437:大量のデータ受信をリアルタイムで表示してあげるっ。ゆう(U)2000-06-09(金) 13:32
#11451-1RE#11437:大量のデータ受信をリアルタイムで表示してあげるっ。いなちゃん2000-06-09(金) 13:37
#11444-1RE#11437:大量のデータ受信をリアルタイムで表示してあげるっ。しげ2000-06-09(金) 13:17
#11449-1RE#11437:大量のデータ受信をリアルタイムで表示してあげるっ。ゆう(U)2000-06-09(金) 13:32
#11451-1RE#11437:大量のデータ受信をリアルタイムで表示してあげるっ。いなちゃん2000-06-09(金) 13:37
いつもお世話になっています。 前回も似たような質問しました、解決できたと思ってたのですが まだ問題がありました。 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)で表示して、表示し終わったところで 再びバッファを読みにいくという作業をしたいのですが なにかよい案はあるのでしょうか?
しげ2000-06-09(金) 13:17
> 上の処理をしていると > 最初はデータを受信したらリアルタイムにテキストボックスに > 表示してくれますが、だんだん重くなっていくカンジで > 時間がたつにつれて表示する速度が遅くなっていき > しまいにはハングアップしてしまいます。 > > 大量のデータを一定のバイト(たとえば2048)ずつ受信して > それらをリアルタイム(少々のズレはOK)で表示して、表示し終わったところで > 再びバッファを読みにいくという作業をしたいのですが > なにかよい案はあるのでしょうか? もしかして、受信したデータを最初から全て一つのテキストボックスに表示しているのでしょうか? それであれば、テキストボックスを増やすとかで一つに表示するデータ量を減らした方がいいと思います。 長い文字列の連結はメモリを大量に消費します。 ハズしていたら御免なさい。 _________ _____ ______ | はじめたばかり \ Q&A \ 超初心者 \ | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ \ | 今日の初心者は明日の知識人 |
ゆう(U)2000-06-09(金) 13:32
> 前回も似たような質問しました、解決できたと思ってたのですが > まだ問題がありました。 どの部分が問題か調査してみましたか? > 最初はデータを受信したらリアルタイムにテキストボックスに > 表示してくれますが、だんだん重くなっていくカンジで > 時間がたつにつれて表示する速度が遅くなっていき > しまいにはハングアップしてしまいます。 通信部分は速度低下にそれほど影響を与えていない・・・までは 分かったのですよね? なら、文字列の処理で速度低下がおきている事になります。 文字列変数での追加は・・・ 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文字をテキストボックスに表示出来るかも 調査して見て下さい。
いなちゃん2000-06-09(金) 13:37
> 'この時点でテキストボックスに表示 この部分を Text1.Text = Text1.Text & DataText としていませんか? &での文字連結は文字数が多くなると非常に遅くなります。 Text1.SelStart = Len(Text1.Text) Text1.SelText = DataText としてみてください。
このページと関連する記事:
#16598-0バイナリデータの受信2000-02-22(火) 11:57#21388-0MScommコントロールでのデータ受信の条件2001-06-18(月) 14:43
#9859-0リッチテキストボックス内の任意の文字列に色を2000-04-24(月) 10:47
#27779-0Mscommからの2進数データを16進に変換したい。。。2000-08-10(木) 22:25
#1338-2配列の仲間を順番に取得する方法2002-07-02(火) 16:22
#1559-0バイナリ型データの扱い1999-09-14(火) 19:00
#19048-0リソースが食いつぶされます。なぜですか?2001-02-23(金) 13:42
#6416-0RE#6396:VCのDllでchar*をVBで処理したいのですが...2000-03-05(日) 16:13
#1145-0PDQCommバイナリ受信・・・1999-08-25(水) 16:05
#9786-0(みえちゃんで見ると)送受信できてるのにTextに表示できません。2000-04-21(金) 09:26