多线程同步操作多个窗口.doc

上传人:s9****2 文档编号:559633506 上传时间:2023-01-11 格式:DOC 页数:11 大小:87.01KB
返回 下载 相关 举报
多线程同步操作多个窗口.doc_第1页
第1页 / 共11页
多线程同步操作多个窗口.doc_第2页
第2页 / 共11页
多线程同步操作多个窗口.doc_第3页
第3页 / 共11页
多线程同步操作多个窗口.doc_第4页
第4页 / 共11页
多线程同步操作多个窗口.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《多线程同步操作多个窗口.doc》由会员分享,可在线阅读,更多相关《多线程同步操作多个窗口.doc(11页珍藏版)》请在金锄头文库上搜索。

1、多线程同步操作多个窗口RunApp notepad.exeRunApp notepad.exeRunApp notepad.exeDelay 2000Dimenv temp_Hwndtemp_Hwnd = 0Dim str, arr, istr = Plugin.Window.Search(无标题 - 记事本)arr = Split(str, |)For i = 0 To UBound(arr) - 1 temp_Hwnd = Plugin.Window.FindEx(arr(i), 0, Edit, 0) BeginThread WriteString While temp_Hwnd 0判断

2、多线程已经启动完毕,继续循环下一个。 Delay 500 WendNextEndScriptFunction WriteString() Dim str, Hwnd Hwnd = temp_Hwnd temp_Hwnd = 0 Do str = WaitKey If Hwnd Plugin.Window.GetKeyFocusWnd Then Call Plugin.Bkgnd.KeyPress(Hwnd, str) End If LoopEnd Function多线程多开窗口同步执行与子线程间的数值如何传递:1. Dimenv IsThread, i2. Dim arr_Thread()3.

3、 For i = 0 To 24. IsThread = False未启动线程5. Redim Preserve arr_Thread(i)6. arr_Thread(i) = BeginThread(EnterThread)7. While IsThread = False未启动成功,等待中8. Delay 5009. Wend10. 跳出循环说明 IsThread = True,已经执行到了,循环继续启动下一个11. Next12. EndScript结束主线,但子线程还会继续运行13. 函数调用/14. Function EnterThread()15. Dim n16. n = i17

4、. IsThread = True18. Do19. TracePrint 运行线程: & n20. Delay 50021. Loop22. End Function多线程运行中单独停止某个子线程演示:1. 环境变量声明2. Dimenv Hwnd, IsThread3. IsThread = False4. Do5. Hwnd = Plugin.Window.Find(Notepad, 无标题 - 记事本)6. If Hwnd = 0 Then7. RunApp notepad.exe : Delay 20008. TracePrint 运行记事本9. End If10. Loop Whi

5、le Hwnd = 011. 获得记事本中输入子窗口句柄,以便按键输入内容12. Hwnd = Plugin.Window.FindEx(Hwnd, 0, Edit, 0)13. 全局变量声明14. Dim IdThread15. 主循环16. Do17. If WaitKey() = 81 Then18. If IsThread = False Then19. IdThread = BeginThread(WriteString)20. Do21. TracePrint 等待线程启动!22. Delay 50023. Loop While IsThread = False24. TraceP

6、rint 线程启动成功!25. Else26. TracePrint 线程停止操作!27. StopThread IdThread28. IsThread = False29. End If30. End If31. Loop32. 以下是函数区域33. Function WriteString()34. IsThread = True35. Do36. Call Plugin.Bkgnd.KeyPress(Hwnd, 65)37. Delay 50038. Loop39. End Function主线程逐个开启子线程五开操作演示:1. 五开操作2. Dim str_Hwnd3. str_Hw

7、nd = vbNullString记录都有哪些窗口句柄在运行4. DimEnv IsHwnd5. IsHwnd = 06. For i_win = 0 To 47. Do8. RunApp notepad.exe9. str = Plugin.Window.Search(无标题 - 记事本)10. arr = Split(str, |)11. If str vbNullString Then12. For i = 0 To UBound(arr) - 113. If InStr(str_Hwnd, arr(i) = 0 Then14. IsHwnd = arr(i)15. str_Hwnd =

8、 str_Hwnd & arr(i) & |16. Exit For17. End If 18. Next19. Else20. IsHwnd = arr(0)21. End If22. Loop While IsHwnd = 023. Call Plugin.Window.SetClientSize(IsHwnd, 300, 300)24. Call Plugin.Window.Move(IsHwnd, 300 * i_win, 0)25. BeginThread 后台喊话26. Do27. Delay 100028. Loop Until Hwnd = 029. Next30. EndSc

9、ript31. Function 后台喊话()32. Dim Hwnd33. Hwnd = Plugin.Window.FindEx(IsHwnd, 0, Edit, 0)34. IsHwnd = 035. Do36. Call Plugin.Bkgnd.SendString(Hwnd, 文字测试)37. Call Plugin.Bkgnd.KeyPress(Hwnd, 13)38. Delay 50039. Loop40. End Function一、多线程是什么,可以干什么 一般来说,我们编写的脚本都是一条道走到黑,最多加点循环、判断和跳转,程序始终是按部就班的执行指定的命令,只能同时干一

10、件工作,让它取色就取色,让它单击就单击,不能同时完成两项以上的工作。多线程的出现,是让脚本可以同时开展几项工作,在单击时,可以通过环境变量传过来取色子程序获得的坐标,而无需在每次单击命令前执行调用取色子程序。当然这只是一个很简单的例子,像这样简单的情况,是没必要弄个多线程的,如果非要弄出多线程处理,反而要考虑到同步的问题:这边要单击了,那边取色命令传过来的坐标值,是多长时间以前的?或者直接取色命令还没执行完,这边到底单击哪里呢? 有人说按键精灵的多线程是伪多线程,其实不管是真假多线程,对于电脑的CPU来说,同时只会做一件事情,只是说把各个线程传过来需要处理的东西按照时间先后和优先级的关系,排个

11、队列挨个执行而已。就像你去食堂打饭,很多人排队打,但是打饭的师傅只有一个,关系好的可能能插个队。多核CPU大概是食堂有好几个窗口,这样的话,倒是有可能同时有几个同学在打饭。那么,我们假设要做的工作是让一个寝室的同学聚餐,可以派一个人去打饭(单线程),或者派几个人去打饭(多线程)。假设班长下达了命令:甲负责打菜,乙负责打饭,丙负责买汽水,其余的负责准备场地,那么什么时候开饭,应该要等到甲乙丙任务都完成了才行。可以约定时间,也可以让每个人报告。如果有一辆自行车可以用,那么甲乙丙三个人都可以骑,同时骑,也就相当与出现了三辆,谁的骑坏了都与别人的没关系。为了更好更快的完成人物,甲乙丙三人都可以同时拉剩

12、下的人帮忙,比如丁,也会变成三个人,每个丁分身都与其他分身无关。好吧,不闲扯了,代码也不多贴,把我总结的规律直接写出来吧。 (一)首先要弄明白变量的作用域这个问题:在按键里,有这些规律: 1.在主体代码最前面(最好这么干,你非要在中间写一句dim,我也没办法)用dim定义的变量(统称外部变量),作用范围为全脚本,但是如果在子程序里面出现用dim显式定义的同名变量或者在子程序参数列表里的同名变量,那么在该子程序体内所用到的该变量,是内部变量,与外部变量无关; 2.子程序中可以用dim关键字定义内部变量,如果未定义的变量直接使用,默认为外部变量。 3.外部变量如果出现在子程序中,并且子程序中没有定义过同名的内部变量,在正常的调用中,按外部变量处理,但是如果在多线程中调用这个子程序,那么该变量会自动变成内部变量初始化掉,具体情况如下:1. Dim a /此处是否定义对多线程内部的变量a无影响2. BeginThread cd3. Sub cd4. Dim a5. /此处如果定义了,变量a为子程序cd的内部变量,6. /否则如果此处为定义,且子程序cs中未定义,则变量a为整个多线程的外部变量7. a = 238. Call cs(a)9. TracePrint a10. Call cs(a)11

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号