ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 2955|ตอบกลับ: 0

[VB6] การสลับ (SWAP) ข้อความสตริง (String) แบบรวดเร็วปานสายฟ้าแล่บ

[คัดลอกลิงก์]

310

กระทู้

501

โพสต์

6035

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6035




พูดถึงเรื่องการ
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 ...  ลองนำไปทดสอบกับปริมาณข้อมูลสตริงจำนวนเยอะๆดูน่ะครับ
  1. '// การคัดลอกตำแหน่งที่เก็บข้อมูลด้วย CopyMemory API โดยจะให้ VarPtr (Variable Pointer) เป็นตัวชี้ตำแหน่ง
  2. CopyMemory ByVal VarPtr(sSource), ByVal VarPtr(sDest), 4
คัดลอกไปที่คลิปบอร์ด


มาดูโค้ดกันเถอะ ...
  1. ' / --------------------------------------------------------------------------
  2. ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
  3. ' / eMail : thongkorn@hotmail.com
  4. ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
  5. ' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
  6. ' / Facebook: https://www.facebook.com/commonindy (Worldwide)
  7. ' / MORE: http://www.g2gnet.com/webboard
  8. ' /
  9. ' / Purpose: Fast String SWAP.
  10. ' / Microsoft Visual Basic 6.0 (SP6)
  11. ' /
  12. ' / This is open source code under @CopyLeft by Thongkorn/Common Tubtimkrob.
  13. ' / You can modify and/or distribute without to inform the developer.
  14. ' / --------------------------------------------------------------------------
  15. Option Explicit

  16. '// Using the CopyMemory/RtlMoveMemory api can be extremely
  17. '// dangerous to your IDE (and your app!). But used carefully can
  18. '// speed up your app tremendously.

  19. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Source As Any, ByVal lNumBytes As Long)
  20. Private Declare Function SysReAllocString Lib "oleaut32.dll" (ByVal pBSTR As Long, Optional ByVal pszStrPtr As Long) As Long

  21. ' / --------------------------------------------------------------------------
  22. Public Function GetStrFromPtr(ByVal Ptr As Long) As String
  23. ' / --------------------------------------------------------------------------
  24.     SysReAllocString VarPtr(GetStrFromPtr), Ptr
  25. End Function

  26. ' / --------------------------------------------------------------------------
  27. ' Using this routine is quicker than
  28. ' sTmp = sDest
  29. ' sDest = sSource
  30. ' sSource = sTmp
  31. Public Sub SwapStr(sSource As String, sDest As String)
  32. ' / --------------------------------------------------------------------------
  33.     Dim lSaveAddr As Long
  34.    
  35.     '// Save memory descriptor for sSource
  36.     lSaveAddr = StrPtr(sSource)
  37.     '// Copy memory descriptor of sDest to sSource
  38.     CopyMemory ByVal VarPtr(sSource), ByVal VarPtr(sDest), 4
  39.     '// Copy memory descriptor of sSource to sDest
  40.     CopyMemory ByVal VarPtr(sDest), lSaveAddr, 4
  41. End Sub

  42. ' / --------------------------------------------------------------------------
  43. Private Sub Command1_Click()
  44. ' / --------------------------------------------------------------------------
  45.     Dim Str1 As String, Str2 As String
  46.     Str1 = Text1.Text '// Source String
  47.     Str2 = Text2.Text '// Destination String
  48.     '// SWAP STRING
  49.     Call SwapStr(Str1, Str2)
  50.     '// Display output.
  51.     Text1.Text = GetStrFromPtr(StrPtr(Str1))
  52.     Text2.Text = GetStrFromPtr(StrPtr(Str2))
  53. End Sub

  54. Private Sub Form_Load()
  55.     Text1.Text = "This is a message from source."
  56.     Text2.Text = "This is a message from destination."
  57. End Sub
คัดลอกไปที่คลิปบอร์ด


ดาวน์โหลดโค้ดต้นฉบับ VB6 ได้ที่นี่ ...



ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-4-20 22:29 , Processed in 0.126020 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้