热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

VB6多线程,关键段操作

OptionExplicitDeclareFunctionGetLastErrorLib"kernel32"()AsLongDe

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


推荐阅读
  • 采用CreateThread()创建多线程程序
    本位转自:http:blog.csdn.netcbnotesarticledetails8277180在window环境下,Win32提供了一系列的AP ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 作者一直强调的一个概念叫做oneloopperthread,撇开多线程不谈,本篇博文将学习,怎么将传统的IO复用pollepoll封装到C++类中。1.IO复用复习使用p ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • 不知道你是否还记得之前在进程中的信号处理时,提到过阻塞信号集与未决信号集的概念,如果你已经忘记了,请参考《阻塞信号与未决信号》一文回忆一下 ... [详细]
  • pthread_mutex_lockpthread_mutex_lock(pthread_mutex_t*mutex);intpthread_mutex_trylock(pthre ... [详细]
  • 主要用的线程函数:1.创建线程:12intpthread_create(pthread_t*thread,constpthread_attr_ ... [详细]
author-avatar
丶敷衍怎么演彡_175
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有