Tuesday 19 September 2017

Delforex Delphi Xe5


Ich portiere einen Server, der auf Indy TCP Component von Delphi 7 bis XE5 gebaut wurde, um 64-Bit-Unterstützung zu ermöglichen. Nun, nachdem ich alle Portierung und lief der Server es funktionierte gut in Test-Umgebung. Es funktionierte großartig, bis die Benutzerzahl 400 überschritten hat. Danach beginnt das Erstellen von Zugriffsverletzungsfehlern. Manchmal brechen auf dem Fehler mich in die indy Quelldateien und manchmal auf das CPU-Fenster. Ich kann den Bereich des Codes in meinen Quellen nicht ermitteln, wo der Fehler erzeugt wird. Während diese Art von Zugriffsverletzung Fehler bedeutet, dass ich auf ein Objekt zugreifen, das noch nicht instanziiert ist, aber warum ist der Fehler nicht, wenn weniger Benutzer online sind und der ganze Code genau wie der Delphi 7-Code ist, werden die Objekte zugegriffen und befreit Genauso wie ich es in Delphi 7 getan habe. Ich habe irgendwo gelesen, dass das Gießen von Zeiger-bezogenen Sachen NativeInt anstelle von IntegerCardinal verwenden sollte. Jetzt in dem Code, wo ich eingehende Daten verarbeitet, sieht der Code wie folgt aus. FPacketBuffe r ist ein globaler Zeiger, der in jedem deklariert ist TMyContext-Klasse und PacketBufferPtr ist eine Integer-Variable, die in jeder TMyContext-Klasse deklariert ist Soll ich NativeInt hier anstelle von Cardinal verwenden, könnte dies der Wurzel des Problems sein, wenn ja, warum ist es nicht Fehler zu schaffen, wenn die Benutzerzahl unter 400 ist, habe ich mit allen getestet Die Funktionen in der lokalen Umgebung und kein einziger Teil des Codes erzeugt einen Fehler. Was Sie über 64-Bit-Code verstehen müssen, ist, dass Zeiger 64 Bits breit sind. Im Gegensatz zu 32-Bit-Code, wo Zeiger sind 32 Bits breit. Nun sind die nativen Integer-Typen Integer und Cardinal immer 32 Bits breit. Klar können Sie nicht alle 64-Bit-Werte in einem 32-Bit-Typ passen. Sie sind richtig, dass dieser Code unter 64 bit gebrochen ist. Das Gießen eines 64-Bit-Zeigers auf eine 32-Bit-Ganzzahl kann zu einer Trunkierung führen. Der Code kann funktionieren, wenn die Adresse in Ihren 32-Bit-Typ passt. Wenn du einen solchen Cast ausführen musst, musst du NativeInt oder NativeUInt ablegen. Und ebenso wie das Ändern der Abgüsse, müssten Sie alle Variablen deklarieren, die Zeiger als NativeInt oder NativeUInt enthalten. Natürlich sollten Sie sich bemühen, solche Abgüsse zu vermeiden. Sie können das tun, indem Sie keine Integer-Variable verwenden, um Zeiger zu speichern. Speichern Sie Zeiger als Zeiger, vermeiden Sie Casting auf ganze Zahlen und nie leiden Zeiger Trunkierung Bugs. Das heißt, der Name PacketBufferPtr ist sehr irreführend. Es ist kein Zeiger, wie der Name vorschlagen würde. Es ist ein Offset. Es sollte PacketBufferOffset heißen. Es scheint plausibel, dass es niemals höher sein wird (Integer) und vielleicht ist Integer eine Klangwahl. Aber es würde niemals weh tun, es zu erklären, dass es NativeUInt ist. Also, vorausgesetzt, dass Sie die Zeiger als PByte deklarieren. Und der Offset als NativeUInt dann würde der Code so geschrieben werden: Und jetzt ist der Code frei von Abgüssen. Ich empfehle, dass Sie die Top-Down-Speicherzuweisung als Debugging-Hilfe aktivieren. Dies wird mehr Bugs dieser Art ausspülen. Danke, ich brauche diese Art von Speicheroperationen, da die empfangenen Daten in einem globalen Speicher gespeichert werden müssen und ich muss die Daten, die zuvor in ihr gespeichert waren, verfolgen und wo weitere Daten in diesem zugeordneten Speicherplatz hinzuzufügen sind. So sollte ich sie als NativeInt anstelle von Kardinal schreiben und wie man Top-Down-Speicherzuweisung aktivieren kann. Ndash Junaid Noor Mai 20 14 um 8:09 Top down Speicher Zuteilung Details hier: msdn. microsoften-uslibrarybb190527.aspx obwohl nicht überrascht sein, wenn Ihre AV-Software gags, wenn Sie diese Einstellung aktivieren ndash David Heffernan Mai 20 14 um 8: 13 Ich habe War für einige Zeit freizugeben experimentelle GExperts Versionen, die die Code-Formatierer früher bekannt als DelForEx mit einigen Verbesserungen und Korrekturen enthalten. Die neueste Version ist von 2008-12-26 und unterstützt die folgenden Delphi-Versionen: Delphi 6 bis 7 Delphi 2005 bis 2010 Delphi XE Delphi XE2 zu XE7 Bitte beachten Sie, dass ich es nur mit Delphi 2007 verwende, also die anderen Versionen Kann unbekannte Fehler haben. Außerdem werden nicht alle Sprachverbesserungen der späteren Delphi-Versionen funktionieren, z. B. Verschachtelte Typen, Generika und anonyme Methoden. Btw: Jede Hilfe zur Verbesserung der Formatierer, vor allem das Hinzufügen der neuen Sprache Konstrukte würde geschätzt werden. Der Quellcode kann aus dem von meiner Homepage verknüpften Subversion-Repository heruntergeladen werden. Die TWM-Version von GExperts funktioniert gut und ist gut in die IDE integriert. Es ermöglicht Ihnen, Ihren Code zu schreiben und zu modifizieren, ohne sich zu sehr über die genaue Formatierung zu sorgen, dann schlagen Sie einfach den zugewiesenen Hotkey und es sofort reformiert. Ich habe es immer leicht gefunden, mich dem Stil anzupassen, den ich bevorzuge, und nicht so komplex wie das JEDI Code Format, das wie übertrieben zu mir aussah. Die Version von Delphi 2009 ist ab sofort über den Link bekannt, der auf einer Beta-Version von GExperts basiert. Es ist immer noch der gleiche Formatierer darunter, und ist sich der Syntax von einigen der neueren Delphi-Verbesserungen nicht bewusst. Beantwortet Dec 31 08 um 12:19

No comments:

Post a Comment