当前位置:文档之家› 多线程同步操作多个窗口

多线程同步操作多个窗口

多线程同步操作多个窗口RunApp "notepad.exe"RunApp "notepad.exe"RunApp "notepad.exe"Delay 2000Dimenv temp_Hwndtemp_Hwnd = 0Dim str, arr, istr = Plugin.Window.Search("无标题- 记事本")arr = Split(str, "|")For i = 0 To UBound(arr) - 1temp_Hwnd = Plugin.Window.FindEx(arr(i), 0, "Edit", 0)BeginThread WriteStringWhile temp_Hwnd <> 0'判断多线程已经启动完毕,继续循环下一个。

Delay 500WendNextEndScriptFunction WriteString()Dim str, HwndHwnd = temp_Hwndtemp_Hwnd = 0Dostr = WaitKeyIf Hwnd <> Plugin.Window.GetKeyFocusWnd ThenCall Plugin.Bkgnd.KeyPress(Hwnd, str)End IfLoopEnd Function多线程多开窗口同步执行与子线程间的数值如何传递:1.Dimenv IsThread, i2.Dim arr_Thread()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. 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 While 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. TracePrint "线程启动成功!"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_Hwnd = vbNullString'记录都有哪些窗口句柄在运行4.DimEnv IsHwnd5.IsHwnd = 06.For i_win = 0 To 47. Do8. RunApp "notepad.exe"9. 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 = str_Hwnd & arr(i) & "|"16. Exit For17. End If18. 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.EndScript31.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一、多线程是什么,可以干什么一般来说,我们编写的脚本都是一条道走到黑,最多加点循环、判断和跳转,程序始终是按部就班的执行指定的命令,只能同时干一件工作,让它取色就取色,让它单击就单击,不能同时完成两项以上的工作。

多线程的出现,是让脚本可以同时开展几项工作,在单击时,可以通过环境变量传过来取色子程序获得的坐标,而无需在每次单击命令前执行调用取色子程序。

当然这只是一个很简单的例子,像这样简单的情况,是没必要弄个多线程的,如果非要弄出多线程处理,反而要考虑到同步的问题:这边要单击了,那边取色命令传过来的坐标值,是多长时间以前的?或者直接取色命令还没执行完,这边到底单击哪里呢?有人说按键精灵的多线程是伪多线程,其实不管是真假多线程,对于电脑的CPU来说,同时只会做一件事情,只是说把各个线程传过来需要处理的东西按照时间先后和优先级的关系,排个队列挨个执行而已。

就像你去食堂打饭,很多人排队打,但是打饭的师傅只有一个,关系好的可能能插个队。

多核CPU大概是食堂有好几个窗口,这样的话,倒是有可能同时有几个同学在打饭。

那么,我们假设要做的工作是让一个寝室的同学聚餐,可以派一个人去打饭(单线程),或者派几个人去打饭(多线程)。

假设班长下达了命令:甲负责打菜,乙负责打饭,丙负责买汽水,其余的负责准备场地,那么什么时候开饭,应该要等到甲乙丙任务都完成了才行。

可以约定时间,也可以让每个人报告。

如果有一辆自行车可以用,那么甲乙丙三个人都可以骑,同时骑,也就相当与出现了三辆,谁的骑坏了都与别人的没关系。

为了更好更快的完成人物,甲乙丙三人都可以同时拉剩下的人帮忙,比如丁,也会变成三个人,每个丁分身都与其他分身无关。

好吧,不闲扯了,代码也不多贴,把我总结的规律直接写出来吧。

(一)首先要弄明白变量的作用域这个问题:在按键里,有这些规律: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. TracePrint a12.End Sub13.Sub cs(b)14. Dim a15. //此处如果定义了,变量a在子程序cs内部永远都是内部变量16. //或者把b改成a,也是隐式的定义了一个内部变量a17. a=a+b18.End Sub复制代码4.在主题代码最前面用Global定义的是全局变量,作用范围多说同DimEnv环境变量,我猜这两个有一个可以在脚本之间交换数据。

如果只是用于单脚本的多线程,可以看成一样的。

相关主题