问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求按键精灵(VB)多线程实例

发布网友 发布时间:2022-09-19 07:10

我来回答

1个回答

热心网友 时间:2023-10-26 10:37

'====.bas====

'线程安全属性数据结构;
Public Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type

'这个是用于多线程访问临界资源同步Api的数据结构
Public Type CRITICAL_SECTION
mmy As Long
End Type
'为什么用GDI 函数绘图?原因等下再讲
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Public Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
'请注意;createThread APi声明已被我修改过,修改的地方请自行参照APIView复制的内容
Public Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
'这个是sleep,作用就是让两个线程绘图频率不一致,效果才明显。
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare Sub EnterCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION) '进入临界区
Public Declare Sub LeaveCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION) '离开临界区

'几个重要的函数举例
'ObjPtr:返回对象实例私有域的地址。
'StrPtr:返回字符串第一个字的地址。
'VarPtr:返回变量的地址。

'全局的form的句柄!
Public formhandle As Long
'临界数据结构
Public sect As CRITICAL_SECTION

Sub OutText1() '过程一
Dim i As Long
Dim dc As Long
Dim s As String
dc = GetDC(formhandle) '获取窗体句柄的DC
For i = 1 To 100000
s = CStr(i)
Call SetBkColor(dc, &HF0F0F0) '设置绘制区域的背景色,也起清除作用
Call TextOut(dc, 10, 10, s, Len(s)) '输出文本!
Call Sleep(40) '等待
Next
Call ReleaseDC(formhandle, dc) '释放资源!
' Call EnterCriticalSection(sect)
' 上下表示该处为临界区,如果要对工程全局变量做操作,最好在该区域内
' 否则线程同步过程中,非常容易让程序崩溃
' Call LeaveCriticalSection(sect)
End Sub

Sub OutText2() '和过程一类似
Dim i As Long
Dim dc As Long
Dim s As String
dc = GetDC(formhandle)
For i = 1 To 100000
s = CStr(i)
Call SetBkColor(dc, &HF0F0F0)
Call TextOut(dc, 10, 80, s, Len(s)) '文本位置改变了
Call Sleep(20) '延时改变了
Next
Call ReleaseDC(formhandle, dc)
' Call EnterCriticalSection(sect)
' Call LeaveCriticalSection(sect)
End Sub

'关于为何使用gdi 函数输出文本,这是一个很重要的内容;
'程序在记数时用了难用的TextOut 函数,而没有使用标签控件,这是因为
'vb的组件不都是线程安全的,当多线程访问不是线程安全的组件,那么会
'产生严重错误。

'===.frm===---===

Private Sub Command1_Click()
'声明了线程ID
Dim threadid1 As Long
Dim threadid2 As Long

'参数一,lpThreadAttributes 线程安全属性,传递为NULL
'参数二,dwStackSize ,线程堆栈大小,可以为0,表示堆栈和此应用堆栈相同
'参数三,lpstartAddress ,执行函数地址,用AddressOf 获取
'参数四,lpParameter ,执行函数的参数地址,可以是一个记录或者是别的类型,用VarPtr获取参数地址(varptr为未公开函数)!!
'参数五,dwCreationFlags ,表示线程创建后的状态!,0表示立即运行,create_SUSPENDED表示线程挂起
'参数六,lpThreadID 表示分配给线程的线程号
Call CreateThread(Null, ByVal O&, AddressOf Mole1.OutText1, VarPtr(0), ByVal 0&, threadid1)
Call CreateThread(Null, ByVal 0&, AddressOf Mole1.OutText2, VarPtr(0), ByVal 0&, threadid2)

End Sub

Private Sub Command2_Click()
'该事件运行于主线程!
Dim i As Long
i = CLng(Text1.Text)
Text1.Text = CStr(i + i) '不要点击次数太多,LONG 类型会溢出
End Sub

Private Sub Form_Load()
'保存窗体句柄全局变量,用于在form 上绘图
formhandle = Form1.hwnd
End Sub

'====----===----===
form1中放coommand1,command2,text1就行了

其实用vb开发多线程效率是很低的!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我女儿是2012年2月14日,阴历正月二十三下午5点11分出生的,求一个好听... 起名。女孩2012年农历十月二十一晚上二十三点五十分出生本人姓胡_百度... 2012年农历九月二十三凌晨两点三十五出生的女孩按五行属象怎么取名... 2012年农历九月初十 二十三点三十六出生的男孩 五行缺什么 任姓 取什 ... 高一地理关于地转偏向力的问题 ...介绍_油管主播的生活双层楼阶段怎么发展是什么 油管主播的生活怎么增进NPC关系介绍_油管主播的生活怎么增进NPC关系是... ...介绍_油管主播的生活如何搬进大厦攻略详解是什么 ...对话框:无法访问,由于I/O设备错误,无法运行此项请求 关于移动硬盘i/o错误 谁能给些asp.net中b/s多线程中的应用的例子及资料 这是我的一个多线程的一个例子。让我疑惑的是我使用了实现Runnable 接口,其中一个结果却出现了有两个2, pc和pp材质哪个好 增持公司股份的进展公告是什么意思 利 字的成语 利字成语有哪些 有“利”字的成语有哪些? 夏天猫咪的散热方法有哪些? 夏天到了,怎么给猫咪降温,求支招 夏季该如何给猫咪降温 夏天猫咪太热应该怎么办? 考研打算考翻译硕士,给推荐一些 好的学习网站。 香港岭南大学翻译硕士需要网推吗 李晟我家有喜演的什么 派派后台怎么开 我是派派吧主我怎么上麦 小燕子方慈演过什么电视剧 请问一下梦见别人搬家什么意思 月饼豆沙馅怎么做 电视剧画江湖之不良人中扮演林轩的人是谁 昨晚上梦见十几个人死了 有共同赡养人,平均分摊显示是500,为什么不能改成1000 赡养老人可以填两个老人各500元 合计1000元吗? css+ div 怎么样定位一个 #div 在底部,就是网站最底部显示icp 备案的那一条怎么做,让他永远在最底部 关于宗教信仰的党课心得 现在是否有500元内的手机支持后台JAVA,QQ,像素200万,支持扩张卡,屏幕2.0及以上,240×320.适合学生用? 关于纽曼影音王M958 MP4 德国工业同盟的历史作用和意义 求一千块左右的高性价比直板或者滑盖手机,最好是国产的… AUTO FOCUS怎么样 砂锅炖鸡汤喝完可以续填水吗 找什么理由推掉一次学生会ppt演讲 君应有语,君应有语,渺万里层云,千山暮雪,只影向谁去? 这句诗什么意思, 杭州瑞丽佳鞋业有限公司怎么样? 汕头市瑞丽佳人化妆品有限公司星湖城分公司怎么样? 刘建华的艺术简历 如何选购老花镜? 人均综合总用水量(m3/人·年)的概念以及计算方法 机关单位人均用水量公式 求大批量QQ号帐号密码。几位都行。密码最好都是一样的,,,在线等