TC官方合作论坛

标题: 做2个子窗口都各有一个线程,同时开启。怎么才能不相互... [打印本页]

作者: 1525299008    时间: 2013-11-17 15:42
标题: 做2个子窗口都各有一个线程,同时开启。怎么才能不相互...
本帖最后由 1525299008 于 2013-11-17 16:03 编辑

每个线程都是几个按键,而且第一个线程是123,那第2个线程就是456.代码很简单,我就不贴了。我现在做的效果是要么第一个线程运行,要么是第二线程运行,不同时的效果很明显。都是同时用热键启动的。如何构建思路?现在的效果做不到按键精灵那种同时进行的效果。我简单的看了下临界区的知识,好像不对路,因为我不是同时按下一个相同的键,谈不上抢不抢的问题吧

作者: kaixindexifan    时间: 2013-11-17 16:14
思路不清楚,第一,临界区是干什么用的你要明白,比如 线程1在操作鼠标的时候,线程2也在操作鼠标 这样就不行啦,关键的地方不是线程,而是操作鼠标会不会干扰,再选择用临界区。

你需要的目的很简单,此开彼停,那么你就定义一个全局变量 线程开关=0,定义两个全局线程句柄,线程句柄1 线程句柄2

  1.     如果(线程开关==0)
  2.         线程.关闭(线程句柄2)
  3.         线程句柄1=线程.开启("","")
  4.         线程开关=1
  5.     否则        
  6.         线程.关闭(线程句柄1)
  7.         线程句柄2=线程.开启("","")
  8.         线程开关=0
  9.         
  10.     如果结束
复制代码



作者: 进击的巨人a    时间: 2013-11-17 16:48
帮顶下。                                                                                                                                                                                                                                                                                                                                                                                                                  
作者: 1525299008    时间: 2013-11-17 17:12
kaixindexifan 发表于 2013-11-17 16:14
思路不清楚,第一,临界区是干什么用的你要明白,比如 线程1在操作鼠标的时候,线程2也在操作鼠标 这样就不 ...

我不是让2个线程,一个开,另一个关。而是2个线程同时开。有人说2个线程同时开,不互相影响。问题是在游戏,显示的效果就是要么第一个开了,第二个不动。等好一会第二才开一次。比如说,我同时按下1键和8键,他们应该做2个不同的技能,1是打怪,8是加个血。应该在游戏是可以几乎同时进行的。可实际情况代码显示不出来。
(注:第一个线程按键的次数比较多,第二个线程按键次数比较少,而且两个线程都是无限循环的)
作者: 1525299008    时间: 2013-11-17 17:42
我再打个比方,一个线程是无限循环按1,一个线程是无限循环按2.我说同时启动,2个线程一起开始按。当然我明白不管是人还是机器,都不可能同时按下,肯定是有先后,只是肉眼看不出来而已。可我做的2个线程,当启动时要么是第1个线程开始循环,等好一会第2个线程才按了几下,第1个线程又开始了。我在形容一下,我要的效果是12121212.不是要按1后 等1分钟后,2才出来。开始我以为是少了延迟,加了后,效果依旧。
(注:第一个线程按键有1234567,循环。)(注:第二个线程按键是890,循环)
作者: dshp4050    时间: 2013-11-17 18:20
你是不是用的控件.模态窗口?,,如果是的话,改成 控件.打开窗口,,

回答正确,请采纳
作者: kaixindexifan    时间: 2013-11-17 20:38
1525299008 发表于 2013-11-17 17:12
我不是让2个线程,一个开,另一个关。而是2个线程同时开。有人说2个线程同时开,不互相影响。问题是在游 ...

开始有点明白你的意思了,不过还是不太理解你的想法,好像貌似你是要弄组合技能键,然后自带加血。但是目的相同,方法可以有很多不是?我们可以选择好的方法实现。

线程同步问题 需要临界区 或者事件  你用临界区试试

最好你说下你的具体思路和需要的要求,欢迎交流!

作者: 1525299008    时间: 2013-11-18 09:17
本帖最后由 1525299008 于 2013-11-18 09:25 编辑
kaixindexifan 发表于 2013-11-17 20:38
开始有点明白你的意思了,不过还是不太理解你的想法,好像貌似你是要弄组合技能键,然后自带加血。但是目 ...


我也不知道在TC里叫不叫组合键,应该不是那种的。打个比方说,就是在第一个线程(按下123)不停的打怪同时,第二个线程(按下890)不停的给自身加血。可实际效果是,一启动就打怪,但血不加。要么就是一开始加血,但不打怪。等过了一会,才开始一次加血或者一次打怪。好像就是非要等第一个线程完成的差不多,才开始第二线程,而且这第二线程循环的还不痛快。循环一次就不动了。代码很简单就是热键启动,2个线程,每个线程里有许多按键代码而已。如果说需要用到临界区,我到是研究了一下,问题是
第一个线程,第二个线程,代码的思路如下:
进入临界区
按键
退出临界区
进入临界区
按键
退出临界区
。。。

这个对不,因为根据游戏的需要,我不能让一个循环后,才让另一个循环进去临界区。这样不行。所以我只能让一个按键进去后,退出后,在让另一个按键进去。这个思路总感到不对路。
还有什么叫事件?
作者: 1525299008    时间: 2013-11-18 09:24
dshp4050 发表于 2013-11-17 18:20
你是不是用的控件.模态窗口?,,如果是的话,改成 控件.打开窗口,,

回答正确,请采纳 ...

我没有用控件。打开i窗口。
我应该是用的控件。模拟窗口。因为我只是用前台就够了,没有用去找什么窗口句柄的知识。
我用一个线程的时候,感觉不错,很流畅。所以我就没用过找窗口句柄的代码。
我想问下这2个函数,有什么区别?难道问题真在这了?
作者: kaixindexifan    时间: 2013-11-18 13:02
1525299008 发表于 2013-11-18 09:17
我也不知道在TC里叫不叫组合键,应该不是那种的。打个比方说,就是在第一个线程(按下123)不停的打怪同 ...

你创建一个临界区句柄 这个变量定为全局变量 然后就按刚才说的 进入临界区句柄 按键 离开临界区句柄  两个线程可以同时开启的 肯定没问题。如果是后台按键,你可以测试下 分别给两个线程定义两个临界区句柄 然后让他们各使用各的,主要是看如果同时在按键,会不会有问题,如果有问题。就定义个临界区句柄,这样就不会感染,速度也不会很慢多少的
作者: 1525299008    时间: 2013-11-18 13:32
本帖最后由 1525299008 于 2013-11-18 13:33 编辑
kaixindexifan 发表于 2013-11-18 13:02
你创建一个临界区句柄 这个变量定为全局变量 然后就按刚才说的 进入临界区句柄 按键 离开临界区句柄  两 ...


第一个线程         第二个线程
进入临界区         进入临界区
按键1                    按键8
退出临界区         退出临界区
进入临界区         进入临界区
按键2                     按键9
退出临界区         退出临界区
进入临界区         进入临界区
按键3                     按键0
退出临界区         退出临界区

每个线程是无限循环的。是这个样子吗?
作者: kaixindexifan    时间: 2013-11-18 17:53
1525299008 发表于 2013-11-18 13:32
第一个线程         第二个线程
进入临界区         进入临界区
按键1                    按键8

差不多了是这样,还有个细节就是 临界区句柄,根据你的需要 看是创建几个临界区句柄  你可以自己调试调试  有什么问题再贴出来
作者: 1525299008    时间: 2013-11-19 09:36
本帖最后由 1525299008 于 2013-11-19 09:46 编辑
kaixindexifan 发表于 2013-11-18 17:53
差不多了是这样,还有个细节就是 临界区句柄,根据你的需要 看是创建几个临界区句柄  你可以自己调试调试 ...


思考了半天,当我明白临界区的原理时,我到不会写代码了。什么时候1键进去,什么时候8键进去,怎么个写法?还有个问题,控件.模态窗口和控件.打开窗口  的区别?


作者: kaixindexifan    时间: 2013-11-19 11:48
1525299008 发表于 2013-11-19 09:36
思考了半天,当我明白临界区的原理时,我到不会写代码了。什么时候1键进去,什么时候8键进去,怎么个写法 ...

临界区是这样一种意思,它好比一个空着的电话亭,当你有代码需要进入的临界区的时候,他会先判断电话亭里面是否已经有人(就好比看是否有代码已经进入临界区),如果没人,就进去打电话,然后按照你设计的代码,在正确的时候离开电话亭(离开临界区);当判断电话亭里面有人在打电话的时候,他会在外面等待,(你的程序就会停止在进入临界区那里)一直到里面的人出来后,他才会进入临界区。所以我说了,有时候根据需要,你可以多建设几个电话亭(临界区),让你的代码运行更加流畅。

至于你的第二个问题,希望你参考tc官方手册,你打开tc编程软件,右上角有个问号,你点击就会弹出手册的,看来你是从按键过来的,你没事先多看看tc手册,你把基础学会了后,你会发现tc比按键简单好用多了


作者: 1525299008    时间: 2013-11-19 12:23
kaixindexifan 发表于 2013-11-19 11:48
临界区是这样一种意思,它好比一个空着的电话亭,当你有代码需要进入的临界区的时候,他会先判断电话亭里 ...

原理我是知道的,我是想说,把一个循环作为一个单位,这个我到可以理解,也知道做好后,软件是怎么运行的。先是运行第一个线程里的循环,当第一个线程循环结束后,在进行第2个线程的循环。可是我要的是2个循环里每个按键,要类似同步。
我把循环里的每个按键,都加了临界区后,我想知道,他到底怎么运行呀。是先运行按键1,然后跑到第2个线程里的循环里执行按键8,然后又蹦回到第一个线程里的循环里执行下一个按键吗?能明白我的想法吗?呵呵
作者: 1525299008    时间: 2013-11-19 12:24
kaixindexifan 发表于 2013-11-19 11:48
临界区是这样一种意思,它好比一个空着的电话亭,当你有代码需要进入的临界区的时候,他会先判断电话亭里 ...

原理我是知道的,我是想说,把一个循环作为一个单位,这个我到可以理解,也知道做好后,软件是怎么运行的。先是运行第一个线程里的循环,当第一个线程循环结束后,在进行第2个线程的循环。可是我要的是2个循环里每个按键,要类似同步。
我把循环里的每个按键,都加了临界区后,我想知道,他到底怎么运行呀。是先运行按键1,然后跑到第2个线程里的循环里执行按键8,然后又蹦回到第一个线程里的循环里执行下一个按键吗?能明白我的想法吗?呵呵
作者: kaixindexifan    时间: 2013-11-19 12:45
1525299008 发表于 2013-11-19 12:24
原理我是知道的,我是想说,把一个循环作为一个单位,这个我到可以理解,也知道做好后,软件是怎么运行的 ...

先运行谁,后运行谁,是你编写代码说了算,看你怎么编写;线程开启后,就在运行了,两个线程两个循环同时在运行,至于你说的什么先运行线程1再跑线程2那是不对的,我说的很清楚了,假如你现在只有一个临界区,那么线程1和线程2都需要使用这个共同的临界区的时候,当需要进入临界区的时候,他们就会依次排队等待。

你可以测试

比如线程1 你把循环频率调到 没10秒执行一次循环

线程2 你把循环调到没2秒执行一次循环

你试下 就清楚了

如果用键盘按键在游戏里面不容易分别

你就弄两个记事本

分别向里面写东西




作者: kaixindexifan    时间: 2013-11-19 12:48
1525299008 发表于 2013-11-19 12:24
原理我是知道的,我是想说,把一个循环作为一个单位,这个我到可以理解,也知道做好后,软件是怎么运行的 ...

你直接说 你需要实现怎么样的按键  说清楚点 我看看能不能帮你写出来


作者: 1525299008    时间: 2013-11-19 17:01
kaixindexifan 发表于 2013-11-19 12:45
先运行谁,后运行谁,是你编写代码说了算,看你怎么编写;线程开启后,就在运行了,两个线程两个循环同时 ...

首先不是让2个线程里的2个循环,通过时间间隔分别进入临界区,来依次执行。
而是让2个线程里的2个循环,同时执行。关键点在于让每个循环里的每个按键,尽量同时按下(理论上是不可能的),只是我们肉眼看不出来而已。(按键精灵里的效果是,我建个打怪F1启动,F2停止。在建个加血F3启动,F4停止。当都启动时,在打怪的同时,也在同时加血)
而现在我用TC能做的代码效果是,按下热键后,让2个线程同时启动,要么是第一个线程里的循环在运行,要么是第二个线程在运行。
比如我的第一个线程循环里是按下A,50次。按下B,50次,在按下1键,50次。
第二个线程循环里是按下8,2次,按下9,2次,按下0,3次。关键点是在打怪的同时,还不停的加血.
作者: kaixindexifan    时间: 2013-11-19 20:12
1525299008 发表于 2013-11-19 17:01
首先不是让2个线程里的2个循环,通过时间间隔分别进入临界区,来依次执行。
而是让2个线程里的2个循环, ...

把你代码直接贴出来

作者: 1525299008    时间: 2013-11-19 20:42
kaixindexifan 发表于 2013-11-19 20:12
把你代码直接贴出来

代码很简单,问题怎么才能让2个线程里每个按键接近同步按下

空间 杀怪并加血
//默认空间
线程句柄
线程句柄1
功能 杀怪()
    循环(真)
        键盘.按键(49,10)
        键盘.按键(65,10)
        键盘.按键(50,10)
        键盘.按键(66,10)
        键盘.按键(51,10)
        键盘.按键(67,10)
        键盘.按键(52,10)
        键盘.按键(68,10)
        键盘.按键(49,10)
        键盘.按键(65,10)
        键盘.按键(50,10)
        键盘.按键(66,10)
        键盘.按键(51,10)
        键盘.按键(67,10)
        键盘.按键(52,10)
        键盘.按键(68,10)
        键盘.按键(49,10)
        键盘.按键(65,10)
        键盘.按键(50,10)
        键盘.按键(66,10)
        键盘.按键(51,10)
        键盘.按键(67,10)
        键盘.按键(52,10)
        键盘.按键(68,10)      
    循环结束
功能结束
功能 加血()
    循环(真)
        键盘.按键(56,10)
        键盘.按键(57,10)
        键盘.按键(48,10)
        键盘.按键(56,10)
        键盘.按键(57,10)
        键盘.按键(48,10)
        键盘.按键(56,10)
        键盘.按键(57,10)
        键盘.按键(48,10)
        键盘.按键(56,10)
        键盘.按键(57,10)
        键盘.按键(48,10)        
    循环结束
功能结束
//开始按钮_点击操作
功能 开始_点击()
    线程句柄=线程.开启("杀怪并加血.杀怪","")
    线程句柄1=线程.开启("杀怪并加血.加血","")
功能结束

//退出按钮_点击操作
功能 退出_点击()
    线程.关闭(线程句柄)
    线程.关闭(线程句柄1)
   
功能结束

功能 热键0_热键()
    //这里添加你要执行的代码
    杀怪并加血.开始_点击()
      
功能结束

功能 热键1_热键()
    //这里添加你要执行的代码
    杀怪并加血.退出_点击()
功能结束

空间结束
//空间结束语句
作者: kaixindexifan    时间: 2013-11-20 02:20
1525299008 发表于 2013-11-19 20:42
代码很简单,问题怎么才能让2个线程里每个按键接近同步按下

空间 杀怪并加血
  1. 空间 杀怪
  2. 线程句柄1,线程句柄2,临界区句柄,hwnd



  3. 功能 初始化()
  4.     临界区句柄=线程.创建临界区()
  5. 功能结束




  6. 功能 打怪()
  7.     循环(真)
  8.         杀怪.按键(65)
  9.         杀怪.按键(66)
  10.         杀怪.按键(67)
  11.         杀怪.按键(68)
  12.         
  13.     循环结束
  14. 功能结束



  15. 功能 加血()  
  16.     循环(真)
  17.         杀怪.按键(49)
  18.         杀怪.按键(50)
  19.         杀怪.按键(51)
  20.         
  21.     循环结束
  22. 功能结束



  23. 功能 按键(键码)
  24.     线程.进入临界区(临界区句柄)
  25.     键盘.按键(键码,10)//这里频率如你定的10次
  26.     线程.离开临界区(临界区句柄)
  27. 功能结束




  28. 功能 热键0_热键()
  29.     hwnd=窗口.鼠标所在窗口句柄()
  30.     如果(hwnd==0)
  31.         辅助.消息框("请选择正确的窗口句柄!")
  32.         返回 假
  33.     如果结束
  34.     线程句柄1=线程.开启("杀怪.打怪","")
  35.     线程句柄2=线程.开启("杀怪.加血","")
  36. 功能结束


  37. 功能 热键1_热键()
  38.     线程.关闭(线程句柄1)
  39.     线程.关闭(线程句柄2)

  40. 功能结束



  41. 空间结束
复制代码



上图,我用记事本测试的

第一张图是频率我设置为 1 的图



[attach]12875[/attach]


第二张图是频率我设置为 10 的图

[attach]12876[/attach]


字母为打怪技能   数字为加血

你看看那个跑起来更符合你需要的,你就控制下频率就行了








欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/) Powered by Discuz! X3.1