精华内容
下载资源
问答
  • VB6 多线程技术,已经测试。稳定、方便、实用的VB6多线程技术(附老马的ActiveX多线程示例)
  • active exe 方式的多线程 区别在于只使用了一个工程不需要做多个exe 线程之间数据的传递使用的是事件的方式 而且可以再ide下调试运行 ... 应该是比较完美的vb使用多线程了.这个是修改过后的 前面传的那个有一些问题
  • VB6多线程探秘

    千次阅读 2016-09-08 17:33:53
    VB6稳定多线程,一直是争论很大的的。 比较稳定的多线程,一般使用 set MT=CreateObject("VbMT.MT") 但其他单元线程之间,是无法访问的,只有在创建者中,才可使用该对象MT.   还有一个问题,如果设置单元...

    VB6稳定多线程,一直是争论很大的的。

    比较稳定的多线程,一般使用

    set MT=CreateObject("VbMT.MT")

    但其他单元线程之间,是无法访问的,只有在创建者中,才可使用该对象MT.

     

    还有一个问题,如果设置单元线程停止,一般通过设置属性,比如MT.bStop=True,设停止参数,

    然后再单元线程中通过检测bStop而退出的。

    但问题来了,如果单元线程挂起,通过MT.bStop=True,会让当前线程死锁状态。程序不能执行下去的。

     

    所以问题来了,不能通过设置对象的属性方法了。这个时候,必须通过地址方法设置。

     

    所以,取得类模块的函数地址,变量地址,通过回调函数函数指针,直接执行函数,是不会死锁的。

     

    下面给出求类模块函数地址的方法:

    Private Function GetClassProcAddress(ByVal SinceCount As Long) As Long
        '***************************************************************************************************
        '   VB6 历史上最简单的获取类中指定函数地址的函数诞生了,can be get address of property to value ,too
        '***************************************************************************************************
        Dim i As Long, jmpAddress As Long
        CopyMemory i, ByVal ObjPtr(Me), 4                                ' get vtable
        CopyMemory i, ByVal i + (SinceCount - 1) * 4 + &H1C, 4           ' 查表
        CopyMemory jmpAddress, ByVal i + 1, 4                            ' 获取的函数地址实际还是一个表,是一个跳转表
        GetClassProcAddress = i + jmpAddress + 5                         ' 计算跳转相对偏移取实际地址
       
    End Function

     

    只求出类模块中函数地址是无法调用类模块函数的,因为类模块函数调用,使通过函数指针、类实例地址,函数参数三部分组成,

    VB没有函数指针概念,VB函数在参数中不能传递函数指针参数,这个时候,可使用VC6写一个函数给VB6使用

    VC DLL 函数如下:

     

    typedef  int  ( __stdcall * FunType)(int lpBuff,int nSize );

    typedef  int  ( __stdcall * MsgFunType)(int nHandle,int nMessage,int wParam,int lParam );

    typedef  void  ( __stdcall * VbClassFunType)( int nObjPtr,int nHandle,int nMessage,int wParam,int lParam);  
     
    int __stdcall  CallAnyFunc(int lpfn,int lpBuff,int nSize )
    {
     FunType pFunc;
     pFunc=(FunType)lpfn;
     
     return  ( *pFunc)( lpBuff,nSize );

    }

    int __stdcall  CallMsgFunc(int lpfn,int nHandle,int nMessage,int wParam,int lParam )
    {
     MsgFunType pFunc;
     pFunc=(MsgFunType)lpfn;
     
     return  ( *pFunc)( nHandle, nMessage, wParam, lParam );

    }

    int __stdcall  CallVbClassFunc(int lpfn,int nObjPtr,int nHandle,int nMessage,int wParam,int lParam )
    {
     VbClassFunType pFunc;
     pFunc=(VbClassFunType)lpfn;
     
     ( *pFunc)( nObjPtr,nHandle, nMessage, wParam, lParam );
     return 0;

    }

     

    展开全文
  • vb6多线程 可编译成本机代码 不使用activex EXE
  • 案例用的是2个网址通过XMLHTTP的方式同时下载获取源代码。
  • VB6多线程,关键段操作

    2019-10-01 13:27:11
     '线程属性.nLength = Len(线程属性)  句柄1 = CreateThreadL(0, 0, AddressOf 线程函数1, 0&, CREATE_SUSPENDED, ID)  句柄2 = CreateThreadL(0, 0, AddressOf 线程函数2, 0&, CREATE_SUSPENDED, ID)  If ...

    Option Explicit

    Declare Function GetLastError Lib "kernel32" () As Long
    'Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    'Declare Sub ExitThread Lib "kernel32" (Optional ByVal dwExitCode As Long = 0)
    'Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
    Declare Function CreateThreadL Lib "kernel32" Alias "CreateThread" (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 Const CREATE_SUSPENDED = &H4
    Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long

    Public 结束所有线程操作 As Boolean
    'Public 线程属性 As SECURITY_ATTRIBUTES
    Public ID As Long, 句柄1 As Long, 句柄2 As Long, 参数 As Long
    Public 共享变量 As Long
    Public 线程数量 As Long

    Public Declare Sub InitializeCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION)
    Public Declare Sub DeleteCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION)
    Private Declare Sub EnterCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION)
    Private Declare Sub LeaveCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION)
    Public Type CRITICAL_SECTION
        DebugInfo As Long
        LockCount As Long
        RecursionCount As Long
        OwningThread As Long
        Reserved As Long
    End Type
    Public g_cs As CRITICAL_SECTION

    Public Sub 创建线程()
        线程数量 = 0
        

        结束所有线程操作 = False
        '线程属性.nLength = Len(线程属性)
        句柄1 = CreateThreadL(0, 0, AddressOf 线程函数1, 0&, CREATE_SUSPENDED, ID)
        句柄2 = CreateThreadL(0, 0, AddressOf 线程函数2, 0&, CREATE_SUSPENDED, ID)
        If 句柄1 <> 0 And 句柄2 <> 0 Then
            主窗体.Caption = "成功!句柄1:" & 句柄1 & ";句柄2:" & 句柄2 & ";ID:" & ID ' & ";参数:" & 参数
        Else
            主窗体.Caption = "失败!错误码:" & GetLastError
        End If
    End Sub

    Public Sub 启动线程()
        If ResumeThread(句柄1) = -1 Then
            主窗体.Caption = "失败!错误码:" & GetLastError
        End If
        If ResumeThread(句柄2) = -1 Then
            主窗体.Caption = "失败!错误码:" & GetLastError
        End If
    End Sub

    Public Sub 结束线程()
        Dim EndThread As Boolean
        Call EnterCriticalSection(g_cs)
            结束所有线程操作 = True
        Call LeaveCriticalSection(g_cs)
        Do
            DoEvents '奇怪,不能不加。可能处理全局变量仍然需要主线程的参与吧。
            Call EnterCriticalSection(g_cs)
                EndThread = (线程数量 <= 0)
            Call LeaveCriticalSection(g_cs)
        Loop Until EndThread
    End Sub

    Public Function 线程函数1(ByVal 参数 As Long) As Long
        Call EnterCriticalSection(g_cs)
            线程数量 = 线程数量 + 1
        Call LeaveCriticalSection(g_cs)
        Dim i As Long
        For i = 0 To 100000
            Call EnterCriticalSection(g_cs)
                If 结束所有线程操作 Then
                    Call LeaveCriticalSection(g_cs)
                    Exit For
                End If
                主窗体.tr1.Caption = i
                共享变量 = 共享变量 + 1
                主窗体.tr.Caption = 共享变量
            Call LeaveCriticalSection(g_cs)
        Next
        Call EnterCriticalSection(g_cs)
            主窗体.显示结束标语
            线程数量 = 线程数量 - 1
        Call LeaveCriticalSection(g_cs)
        '函数结束的时候,线程自然就结束了,不需要调用下面注释中的 ExitThread 函数。
        'ExitThread
    End Function

    Public Function 线程函数2(ByVal 参数 As Long) As Long
        Call EnterCriticalSection(g_cs)
            线程数量 = 线程数量 + 1
        Call LeaveCriticalSection(g_cs)
        Dim i As Long
        For i = 0 To 100000
            Call EnterCriticalSection(g_cs)
                If 结束所有线程操作 Then
                    Call LeaveCriticalSection(g_cs)
                    Exit For
                End If
                主窗体.tr2.Caption = i
                共享变量 = 共享变量 + 1
                主窗体.tr.Caption = 共享变量
            Call LeaveCriticalSection(g_cs)
        Next
        Call EnterCriticalSection(g_cs)
            主窗体.显示结束标语
            线程数量 = 线程数量 - 1
        Call LeaveCriticalSection(g_cs)
        '函数结束的时候,线程自然就结束了,不需要调用下面注释中的 ExitThread 函数。
        'ExitThread
    End Function

    转载于:https://www.cnblogs.com/MMLoveMeMM/articles/3187246.html

    展开全文
  • 一个演示vb6实现多线程的例子! 关闭时保证不异常退出! 很好的代码
  • exe上的多线程几年前就弄稳定了,基本没问题。 VB6做的标准DLL给VC和其他语言使用,要么调用时就崩了,要么调用完退出进程时崩了。 今天基本解决这个问题了,一种方法是退出前强制自动结束进程,把崩溃让你看不到...

    这几天技术上有了重大的突破,日夜研究2周了。

    exe上的多线程几年前就弄稳定了,基本没问题。

    VB6做的标准DLL给VC和其他语言使用,要么调用时就崩了,要么调用完退出进程时崩了。

    今天基本解决这个问题了,一种方法是退出前强制自动结束进程,把崩溃让你看不到,也是一种方法。

    另一种就是找到了一个奇怪的问题,调用其中一个API加载一下DLL中窗体,不显示出来都行,然后再关闭进程就没事了,想不通原因。

    前面崩溃主要是调用了COM对象WINHTTP用来下载网页,VB中还有不少COM对象也是会造成崩溃。

    ------------

    注入到IE或别的32位进程上的DLL又要做另外一种格式,EXE型的工程比较合适。

    然后想要注入64位进程,这几天学习了VisualFreeBasic开发,蛮好用的。有需要也可以再用C++支持64位的版本。

    .NET下面动态编绎运行VB的代码也研究过了,还没完善。

    动态执行JS的用了VBSCRIPT宿主,还有网页JS,WEBKIT控件,VBJS引挚等多种模工。

    WEBKIT浏览器内核也学习开发了几种。

    动态加载控件,以前显示不出来这几天也攻克了,还有些小问题要修正下。

    展开全文
  • VB 实现多线程

    2013-01-16 14:00:04
    使用VB6 和winAPI 利用VB 创建多线程来达到提高运行速度。
  • vb.net多线程例子

    2020-01-13 08:15:40
    对于vb6来讲,实现多线程相对较麻烦(实际上就是模拟多线程),但是对于vb.net来讲就容易多了,我们只需要 Imports System.Threading 即可。 实例 实例很简单,一个按钮,三个文本框,两个进度条。 下载地址:...

    今天给大家出一个vb.net多线程的实例

    前言

    对于vb6来讲,实现多线程相对较麻烦(实际上就是模拟多线程),但是对于vb.net来讲就容易多了,我们只需要 Imports System.Threading 即可。

    实例

    实例很简单,一个按钮,三个文本框,两个进度条。
    在这里插入图片描述
    下载地址:https://bibibiu.net/p/20200113005123

    展开全文
  • VB6实现多线程

    2013-03-23 09:52:05
    VB6实现的稳定多线程源码,利用系统的API实现多线程
  • VB.NET多线程应用

    2013-05-03 20:14:01
    VB6已经支持建立多线程的EXE、DLL和OCX。不过使用多线程这个词语,可能也不太确切。因此VB6仅支持运行多个单线程的单元。一个单元实际上是代码执行的空间,而单元的边界限制了代码访问任何单元以外的事物。
  • 利用VB6实现多线程

    2009-03-19 13:29:00
    利用VB实现多线程,真正的多线程.使用ActiveX EXE实现,将工程属性中的"每个对象对应一个线程"选中.
  • vb6实现多线程参考

    2010-04-28 23:57:38
    vb6实现的多线程方法,初学者的可以参考。
  • VB6本身无法实现多线程编程,但是通过第三方控件,也可以很完美的实现多线程。 本例实现的是在主界面开一个新的线程在后台完成数据查询并根据提供的每页显示的数据行数计算出总页数,然后返回给主界面并显示在表格中...
  • 网上有很多介绍VB6多线程的文章,但无外乎以下几种: 1.使用ActiveX EXE实现的多线程,它可以认为是VB6下最安全的多线程实现了。但是因为是在另外一个进程中实现的,严格意义上来说算不得真正的多线程,在实际使用...
  • vb6写的多线程网抓

    2018-09-13 23:50:23
    active exe 方式的多线程 区别在于只使用了一个工程不需要做多个exe 内部变量参数的传递使用的是事件的方式 而且可以再ide下调试运行 (调试状态使用的是单线程) 使用msgbox 也不会... 应该是比较完美的vb使用多线程了.
  • vb vb6 vb6.0 dde 通信 绝对可用,不要高分, 伪多线程 进程外 源码,注意点,不同操作系统里,可能linktopic不一样,有的是任务管理器里显示的名称,有的是标题,试一下就OK
  • vb6标准版DLL完美版收工,vb多线程完美版 统计完成了,标准DLL 80行代码(7K),另外50行代码是用来控制不崩溃的 EXE多线程另外120行代码(4.7K),总共250行就能支持2种方式了。 有人做的多线程EXE和标准DLL可以直接...
  • 摘要:VB源码,图形处理,多线程绘图 VB多线程绘图程序,无聊时改的一个多线程窗口绘图程序,加了线程同步技术,此多线程可在IDE下调用运行,但退出程序,VB6会崩溃。每条线一个线程,开了1000多线程,CPU占用不到2%...
  • vb6实现安全多线程的ActiveX组件

    热门讨论 2008-05-08 15:48:12
    一个用于vb6实现安全多线程的ActiveX组件,非常值得下载。
  • 就是ActiveX EXE工程里"工程属性"中的"每对象对应一个线程"那种模式. 稳定性肯定没问题,只是会有使用上的限制,比如某些非线程安全的控件无法使用,以及全局变量无法使用等. 代码中是使用两个线程执行大循环,使用...
  • (转)VB6实现多线程数据库大数据查询 VB6本身无法实现多线程编程,但是通过第三方控件,也可以很完美的实现多线程。 本例实现的是在主界面开一个新的线程在后台完成数据查询并根据提供的每页显示的数据行数计算出总...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 258
精华内容 103
关键字:

vb6多线程