|
พูดถึงเรื่องการ SWAP (อ่านว่าสว็อป) หากคนที่เรียนทางคอมพิวเตอร์มา ก็คงจะรู้จักกันดีอยู่แล้วล่ะน่ะครับ ซึ่งเป็นการสลับค่าตัวแปร เช่น A = 3, B = 5 โดยที่ ให้นำค่าจาก A ไปเก็บไว้ที่อื่นก่อน (Temp = A) จากนั้นก็ให้เอาค่าจาก B มาเก็บไว้ที่ A (A = B) สุดท้ายก็ย้ายค่าจาก Temp มาไว้ที่ B (B = Temp) ก็เป็นอันจบก็จะทำให้ A = 5 และ B = 3 นั่นก็หมายความว่าเป็นการเคลื่อนย้ายข้อมูล (Transfer Data) ระหว่างตัวแปร สำหรับบทความนี้จะเป็นการสลับค่าเหมือนกัน แต่จะใช้วิธีการสลับตำแหน่งที่จัดเก็บ (Memory Address) ซึ่งจะทำให้เกิดความรวดเร็วมากขึ้น ในกรณีที่เรานำไปใช้กับข้อมูลที่มีปริมาณมากๆ ... สำหรับ VB6 จะใช้ Win32 API (Application Programming Interface) ด้วย CopyMemory อนึ่ง!!! การใช้ CopyMemory/RtlMoveMemory API เราควรต้องใช้งานระมัดระวังเป็นอย่างยิ่ง เพราะอาจจะเกิดการ Crash ต่อ IDE หรือตัวแอพพลิเคชั่นของเราเอง แต่หากนำมาใช้ให้เป็นและอย่างระมัดระวัง ก็จะสามารถเพิ่มความเร็วแอพพลิเคชั่นของเราเองได้อย่างมาก ...
ตัวอย่างการใช้งาน CopyMemory ... ลองนำไปทดสอบกับปริมาณข้อมูลสตริงจำนวนเยอะๆดูน่ะครับ
- '// การคัดลอกตำแหน่งที่เก็บข้อมูลด้วย CopyMemory API โดยจะให้ VarPtr (Variable Pointer) เป็นตัวชี้ตำแหน่ง
- CopyMemory ByVal VarPtr(sSource), ByVal VarPtr(sDest), 4
คัดลอกไปที่คลิปบอร์ด
มาดูโค้ดกันเถอะ ...
- ' / --------------------------------------------------------------------------
- ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
- ' / eMail : thongkorn@hotmail.com
- ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
- ' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
- ' / Facebook: https://www.facebook.com/commonindy (Worldwide)
- ' / MORE: http://www.g2gnet.com/webboard
- ' /
- ' / Purpose: Fast String SWAP.
- ' / Microsoft Visual Basic 6.0 (SP6)
- ' /
- ' / This is open source code under @CopyLeft by Thongkorn/Common Tubtimkrob.
- ' / You can modify and/or distribute without to inform the developer.
- ' / --------------------------------------------------------------------------
- Option Explicit
- '// Using the CopyMemory/RtlMoveMemory api can be extremely
- '// dangerous to your IDE (and your app!). But used carefully can
- '// speed up your app tremendously.
- Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Source As Any, ByVal lNumBytes As Long)
- Private Declare Function SysReAllocString Lib "oleaut32.dll" (ByVal pBSTR As Long, Optional ByVal pszStrPtr As Long) As Long
- ' / --------------------------------------------------------------------------
- Public Function GetStrFromPtr(ByVal Ptr As Long) As String
- ' / --------------------------------------------------------------------------
- SysReAllocString VarPtr(GetStrFromPtr), Ptr
- End Function
- ' / --------------------------------------------------------------------------
- ' Using this routine is quicker than
- ' sTmp = sDest
- ' sDest = sSource
- ' sSource = sTmp
- Public Sub SwapStr(sSource As String, sDest As String)
- ' / --------------------------------------------------------------------------
- Dim lSaveAddr As Long
-
- '// Save memory descriptor for sSource
- lSaveAddr = StrPtr(sSource)
- '// Copy memory descriptor of sDest to sSource
- CopyMemory ByVal VarPtr(sSource), ByVal VarPtr(sDest), 4
- '// Copy memory descriptor of sSource to sDest
- CopyMemory ByVal VarPtr(sDest), lSaveAddr, 4
- End Sub
- ' / --------------------------------------------------------------------------
- Private Sub Command1_Click()
- ' / --------------------------------------------------------------------------
- Dim Str1 As String, Str2 As String
- Str1 = Text1.Text '// Source String
- Str2 = Text2.Text '// Destination String
- '// SWAP STRING
- Call SwapStr(Str1, Str2)
- '// Display output.
- Text1.Text = GetStrFromPtr(StrPtr(Str1))
- Text2.Text = GetStrFromPtr(StrPtr(Str2))
- End Sub
- Private Sub Form_Load()
- Text1.Text = "This is a message from source."
- Text2.Text = "This is a message from destination."
- End Sub
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดต้นฉบับ VB6 ได้ที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|