吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5643|回复: 67
收起左侧

[原创工具] VB6多线程补丁,TlsFake

  [复制链接]
JuncoJet 发表于 2022-6-22 14:28
QQ截图20220622142509.jpg
VB6多线程网上方法很多,但很难稳定 ,本身问题是因为Tls无法跨线程,
用此补丁IAT Hook了VBVM,修补了BUG,使得VBVM可以稳定跨线程
调用非常简单
Private Declare Sub initTlsFake Lib "tlsfake" ()
需要多线程时 initTlsFake 就行,无需释放,建议 Form_Load 或者 Form_Initialize 时补丁

VB多线程补丁.rar

11.65 KB, 下载次数: 139, 下载积分: 吾爱币 -2 CB

免费评分

参与人数 13吾爱币 +20 热心值 +11 收起 理由
蓝箭 + 1 + 1 我很赞同!
submariner + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
sphinx + 2 + 1 谢谢@Thanks!
ChrisCheung + 1 我很赞同!
610100 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Mr.Zhang青春 + 1 + 1 热心回复!
S.K + 1 + 1 谢谢@Thanks!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ebaolzh + 1 + 1 666
笙若 + 1 + 1 谢谢@Thanks!
爱的太迟 + 1 + 1 谢谢@Thanks!
KSPprince + 1 + 1 又强行给VB6续命~
klxn0-0 + 1 + 1 复活老vb6

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

submariner 发表于 2022-6-28 08:59
本帖最后由 submariner 于 2022-6-28 09:14 编辑
JuncoJet 发表于 2022-6-27 16:31
设计代码10个线程,大概相差一倍的速度
PCODE的话多线程加速比较明显

00012022-06-28_085021.png 00022022-06-28_085046.png
00032022-06-28_085104.png 00042022-06-28_085125.png

谢谢LZ,测试成功了,和预想得差不多,比单线程能节省不少时间,6线程(6核处理器)由9.2秒降到1.54秒了;
从测试可以看出,即使线程数高达1000,也并未大幅增加时间开销(但也同预想的那样,并不能额外节省任何时间);
计算尾数存在极少量误差,估计是受限于双精度数值自身的精度
submariner 发表于 2022-6-27 12:27
本帖最后由 submariner 于 2022-6-27 12:38 编辑

我试着写了一段测试程序,总是发生闪退,能帮看看吗?
不知怎的,无法上传附件,贴主要代码如下:
窗体上只有text1~text6共六个TextBox控件,command1和command2两个按钮控件
点击command2按钮时,程序会无任何错误提示,后面就直接结束了

[Visual Basic] 纯文本查看 复制代码
'模块代码
Option Explicit
Public Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Public Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub initTlsFake Lib "tlsfake.dll" ()
Public Type lpParaIn
    beginLong As Long
    endLong As Long
    RetTLSecond As Double
    RetS As Double
End Type


Public Sub mx(i0 As Long, ii As Long, ByRef RetTls As Double, ByRef RetS As Double)
'功能:从i0次计算到ii次,传地址返回本阶段用时秒数RetTls和本阶段计算结果RetS

    Dim S As Double, xs As Double, i As Long
    Dim Tb As Long, Te As Long, Tl As Long, Tls As Double
    
    Tb = GetTickCount()
    S = 0
    For i = i0 To ii
        S = S + Sin(i * 0.0172222) '主要计算累加Sin(i * 0.0172222)
    Next i
    Te = GetTickCount
    Tl = Te - Tb
    Tls = Tl / 1000#
    RetTls = Tls
    RetS = S
End Sub
Public Sub mtst(Iloop As Long, ByRef S As Double, ByRef Tls As Double)
'功能:从1到ILoop次计算,4线程,传地址返回全程用时秒数Tls和本阶段计算结果S
    Dim i As Long, j As Long, k As Long
    
    Dim lpPara(0 To 3) As lpParaIn
    j = Iloop / 4
    
    For i = 0 To 3
        lpPara(i).beginLong = 1 + i * j
        lpPara(i).endLong = (i + 1) * j
    Next i
        lpPara(3).endLong = Iloop '防止不能被整除,修正末尾
        

    Call initTlsFake
    For i = 0 To 3
        CreateThread 0, 0, AddressOf mx, VarPtr(lpPara(i)), 0, 0
        Sleep 8000
    Next
    Sleep 8000

    S = 0
    Tls = 0
    For i = 0 To 3
        S = S + lpPara(i).RetS
        Tls = Tls + lpPara(i).RetTLSecond
    Next i
    
End Sub

[Visual Basic] 纯文本查看 复制代码
’窗体代码
Option Explicit
Private Sub Command1_Click() '单线程计算结果及用时
    Dim ii As Long, S As Double, xs As Double, i As Long
    Dim Tb As Long, Te As Long, Tl As Long, Tls As Double
    
    ii = Val(Text1)
    Tb = GetTickCount()
    S = 0
    DoEvents
    Command1.Caption = "计算中...请等几秒"
    DoEvents
    For i = 1 To ii
        S = S + Sin(i * 0.0172222) '主要计算累加Sin(i * 0.0172222)
    Next i
    Te = GetTickCount
    Tl = Te - Tb
    Tls = Tl / 1000#
    Text3 = Str(S)
    Text4 = Str(Tls) + "    s"
    DoEvents
    Command1.Caption = "一般的VB计算方法"
    DoEvents
End Sub

Private Sub Command2_Click() '多线程计算及结果
    Dim ii As Long, S As Double
    Dim Tb As Long, Tls As Double
    
    ii = Val(Text1)
    Tb = GetTickCount()
    
    Call mtst(ii, S, Tls)
    
    Text5 = Str(S)
    Text6 = Str(Tls) + "    s"
    
End Sub



 楼主| JuncoJet 发表于 2022-6-22 14:34
wren0315 发表于 2022-6-22 14:45
玩VB就是浪费生命
5151diy 发表于 2022-6-22 14:46
可以用来编程 反复执行程序 ,如调用 电子教室学生端
 楼主| JuncoJet 发表于 2022-6-22 14:47
wren0315 发表于 2022-6-22 14:45
玩VB就是浪费生命

此话不假,因为低阶程序VB写起来很快很好用,高阶程序得花至少N倍时间用于调试和除错
比如多线程崩溃问题,需要OllyDBG调试半天,写补丁修补VM
三滑稽甲苯 发表于 2022-6-22 15:00
wren0315 发表于 2022-6-22 14:45
玩VB就是浪费生命

虽然早就被淘汰了,但是u1s1用来做小软件的图形界面还是不错的
lushihao 发表于 2022-6-22 15:01
三滑稽甲苯 发表于 2022-6-22 15:00
虽然早就被淘汰了,但是u1s1用来做小软件的图形界面还是不错的

小东西也不用,直接用E语言
lovehfs 发表于 2022-6-22 21:51
太好了,有这么好的工具,可以完成一些曾经不能完成的任务。
CXC303 发表于 2022-6-23 01:02
感谢分享
yanggo 发表于 2022-6-23 10:42
感谢分享,很久很久没有写过小软件了。。。。毕竟没时间呢。感谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 03:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表