为什么函数一放到多线程里执行时间就变长了

时间:2021-10-29 18:11:43
Synchronize(Form4->BitBtn1->Click);

这一句代码用的时间是Form4->BitBtn1->Click()的三四倍时间

由于我做的项目要用到多线程

又要求时间越短越好

但是函数一放到我创建的线程里执行时间就从30MS左右窜到140MS左右了

9 个解决方案

#1


如果OnClick事件里有费时的处理,并且涉及到同步,变慢是有可能的,看看临界区互锁等地方,还有可能是debug模式引起的,如果是请换成release再试试
如果仅仅是点一下没有别的处理,那应该是瞬时的,不应该这么慢

#2


OnClick里没有涉及到同步,就原先的一个函数我在多线程里调用的,

debug模式换成了release还是一样 

#3


还有可能是多线程并发处理时CPU资源占用较多,每个线程里的函数执行时分到的时间片就少了,执行就变慢了。有时候发现一个线程执行狂慢,检查半天发现是别的线程忙个不停引起的,没事的时候让不忙的线程Sleep,都省着点用

#4


发现问题  程序里面总共就创建了两个线程

把另外一个线程注释掉后时间就变正常了

这两个线程是同时触发的

两个线程里有几个控件可能在同时使用

怎么解决呢

#5


还是同步引起的,比如操作一个VCL对象的时候另一个线程也想操作就得等。这个说白了就是一个调度问题,尽量减少对公共对象的访问,每次访问时间尽量缩短,实在不行就用专门的线程去操作VCL,变同步为异步,有个跟Synchronize对应的函数Queue就是异步的,不过我也没怎么用过不好说

#6


这样子啊      

thread1 *newthread1 = new thread1(false);
BitBtn1->Click();



thread1里的函数是BitBtn2->Click();
  这样写代码的话

BitBtn1 和BitBtn2里的函数是不是同时执行的?

#7


严格的讲单核不可能同时执行(多核我也不知道,应该也不能吧),因为windows会把这些操作分开穿插执行的,而且两个按钮的响应顺序也不一定,因为thread1即使一开始就去按按钮,其构造函数也是可能花一定时间的,这样按按钮会被推迟。总之把所有操作理解为一个队列就行了,你的工作就是给它们排队

#8


谢谢  我仔细研究下我的两个线程应该怎么合作 

#9


楼主考虑下能不能把处理和显示分开?线程只管处理数据,然后把数据保存到队列中,然后主窗体定时显示队列中的内容,这样可能速度会快点。。

#1


如果OnClick事件里有费时的处理,并且涉及到同步,变慢是有可能的,看看临界区互锁等地方,还有可能是debug模式引起的,如果是请换成release再试试
如果仅仅是点一下没有别的处理,那应该是瞬时的,不应该这么慢

#2


OnClick里没有涉及到同步,就原先的一个函数我在多线程里调用的,

debug模式换成了release还是一样 

#3


还有可能是多线程并发处理时CPU资源占用较多,每个线程里的函数执行时分到的时间片就少了,执行就变慢了。有时候发现一个线程执行狂慢,检查半天发现是别的线程忙个不停引起的,没事的时候让不忙的线程Sleep,都省着点用

#4


发现问题  程序里面总共就创建了两个线程

把另外一个线程注释掉后时间就变正常了

这两个线程是同时触发的

两个线程里有几个控件可能在同时使用

怎么解决呢

#5


还是同步引起的,比如操作一个VCL对象的时候另一个线程也想操作就得等。这个说白了就是一个调度问题,尽量减少对公共对象的访问,每次访问时间尽量缩短,实在不行就用专门的线程去操作VCL,变同步为异步,有个跟Synchronize对应的函数Queue就是异步的,不过我也没怎么用过不好说

#6


这样子啊      

thread1 *newthread1 = new thread1(false);
BitBtn1->Click();



thread1里的函数是BitBtn2->Click();
  这样写代码的话

BitBtn1 和BitBtn2里的函数是不是同时执行的?

#7


严格的讲单核不可能同时执行(多核我也不知道,应该也不能吧),因为windows会把这些操作分开穿插执行的,而且两个按钮的响应顺序也不一定,因为thread1即使一开始就去按按钮,其构造函数也是可能花一定时间的,这样按按钮会被推迟。总之把所有操作理解为一个队列就行了,你的工作就是给它们排队

#8


谢谢  我仔细研究下我的两个线程应该怎么合作 

#9


楼主考虑下能不能把处理和显示分开?线程只管处理数据,然后把数据保存到队列中,然后主窗体定时显示队列中的内容,这样可能速度会快点。。