Frage

Wir bekommen einen Fehler in einer VB6-Anwendung, die Daten hin und her über TCP-Sockets sendet. Wir bekommen einen Laufzeitfehler „aus String-space“. Hat jemand diese oder irgendwelche Gedanken gesehen, warum dies geschehen würde? Es scheint, wie wir einige VB6 Schwelle so dass alle anderen Gedanken und wäre hilfreich schlagen.

thks, ak

War es hilfreich?

Lösung

Wie andere haben darauf hingewiesen, wird jeder String-Verkettung in VB eine neue Zeichenfolge zuweisen und dann die Daten über kopieren und dann de-allocate das Original einmal, es kann. In einer Schleife kann dies zu Problemen führen.

Um dies zu umgehen Sie eine einfache Klasse String wie diese erstellen:

Option Explicit

Private data As String
Private allocLen As Long
Private currentPos As Long

Public Function Text() As String
  Text = Left(data, currentPos)
End Function

Public Function Length() As Long
  Length = currentPos
End Function

Public Sub Add(s As String)

  Dim newLen As Long
  newLen = Len(s)
  If ((currentPos + newLen) > allocLen) Then
    data = data & Space((currentPos + newLen))
    allocLen = Len(data)
  End If

  Mid(data, currentPos + 1, newLen) = s
  currentPos = currentPos + newLen

End Sub

Private Sub Class_Initialize()
  data = Space(10240)
  allocLen = Len(data)
  currentPos = 1
End Sub

Diese Klasse wird die Anzahl der Stringzuweisungen minimieren, indem die Schnur zwingt mit Leerzeichen darin gebaut werden und dann die Räume überschrieben wird je nach Bedarf. Es neu zuordnet auf etwa das Doppelte seiner Größe, wenn es feststellt, dass es nicht genug Platz vorinitialisiert hat. Der Text Verfahren wird den Teil der Zeichenfolge zurück, die tatsächlich verwendet wird.

Andere Tipps

Text auf MSDN gefunden:

http://msdn.microsoft.com/ en-us / library / aa264524 (VS.60) aspx

  

Visual Basic für Applikationen   Referenz Aus Zeichenfolge-Speicherplatz (Error   14)

     

Besonderheiten

     

Visual Basic ermöglicht es Ihnen, sehr zu verwenden   große Strings. Allerdings ist die   Anforderungen anderer Programme und die   So können Sie manipulieren die Saiten können   verursachen diesen Fehler. Dieser Fehler hat die   Folgende Ursachen und Lösungen:

     
      
  • Ausdrücke zu verlangen, dass temporäre Strings erstellt werden   Auswertung kann diesen Fehler verursachen. Zum   beispielsweise der folgende Code bewirkt, dass ein   Aus Zeichenfolge-Speicherplatz Fehler auf einigen   Betriebssysteme:
  •   
MyString = "Hello"
For Count = 1 To 100
MyString = MyString & MyString
Next Count
  Assign the string to a variable of another name.
* Your system may have run out of memory, which prevented a string from
     

zugeordnet ist.

     

Entfernen Sie alle nicht benötigten Anwendungen aus dem Speicher zu erstellen   mehr Platz.

     

Für weitere Informationen wählen Sie die   Artikel in Frage, und drücken Sie F1.

Zusätzlich zu Jacco Antwort, vbAccelerator hat eine große String Builder-Klasse, die genau dasselbe erreicht, aber ein wenig robuster ist. Der Autor geht auch durch die Lösung zu erklären, wie es funktioniert.

Unter der Annahme, dass Sie Daten in einer Schleife anhängen, stellen Sie sicher, dass es nicht an sich selbst angehängt wird, die extrem schnell Speicher essen.

Beispiel und Beschreibung der Fehler Bedeutung: http://msdn.microsoft.com/en-us/library/aa264524. aspx

Irgendwann im Frühjahr 2009, Microsoft hat ein XP-Update, das mit Armadillo / Silicon Realms Wrapper stört. Die Codezeile, die das Werfen wurde Fehler 14, Out of String Raum war nicht logisch. Es gab kein Problem mit einem übergroßen String. Es war eine einfache Zuordnung, die ich selbst zu sein „foo“ und Fehler geändert 14 noch aufgetreten. Ich denke, der Fehler falsch in XP abgebildet wird. Die Antwort war für uns CopyMem-11 aus dem Armadillo Schutzprojekt und rewrap die die exe.

entfernen

Es klingt wie Sie eine Zeichenfolge oft anhängen. Sie könnten versuchen, eine Klasse String

Auch könnte es sein, einige veraltete Objekte haben, die Strings rumhängen enthalten, die nicht verwendet werden und befreit werden sollten. Überprüfen Sie für zirkuläre Referenzen vielleicht, indem Sie Objektzuordnung / frees in Class_Initialize/Class_Finalize

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top