这一句代码用的时间是Form4->BitBtn1->Click()的三四倍时间
由于我做的项目要用到多线程
又要求时间越短越好
但是函数一放到我创建的线程里执行时间就从30MS左右窜到140MS左右了
9 个解决方案
#1
如果OnClick事件里有费时的处理,并且涉及到同步,变慢是有可能的,看看临界区互锁等地方,还有可能是debug模式引起的,如果是请换成release再试试
如果仅仅是点一下没有别的处理,那应该是瞬时的,不应该这么慢
如果仅仅是点一下没有别的处理,那应该是瞬时的,不应该这么慢
#2
OnClick里没有涉及到同步,就原先的一个函数我在多线程里调用的,
debug模式换成了release还是一样
debug模式换成了release还是一样
#3
还有可能是多线程并发处理时CPU资源占用较多,每个线程里的函数执行时分到的时间片就少了,执行就变慢了。有时候发现一个线程执行狂慢,检查半天发现是别的线程忙个不停引起的,没事的时候让不忙的线程Sleep,都省着点用
#4
发现问题 程序里面总共就创建了两个线程
把另外一个线程注释掉后时间就变正常了
这两个线程是同时触发的
两个线程里有几个控件可能在同时使用
怎么解决呢
把另外一个线程注释掉后时间就变正常了
这两个线程是同时触发的
两个线程里有几个控件可能在同时使用
怎么解决呢
#5
还是同步引起的,比如操作一个VCL对象的时候另一个线程也想操作就得等。这个说白了就是一个调度问题,尽量减少对公共对象的访问,每次访问时间尽量缩短,实在不行就用专门的线程去操作VCL,变同步为异步,有个跟Synchronize对应的函数Queue就是异步的,不过我也没怎么用过不好说
#6
这样子啊
thread1 *newthread1 = new thread1(false);
BitBtn1->Click();
thread1里的函数是BitBtn2->Click();
这样写代码的话
BitBtn1 和BitBtn2里的函数是不是同时执行的?
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还是一样
debug模式换成了release还是一样
#3
还有可能是多线程并发处理时CPU资源占用较多,每个线程里的函数执行时分到的时间片就少了,执行就变慢了。有时候发现一个线程执行狂慢,检查半天发现是别的线程忙个不停引起的,没事的时候让不忙的线程Sleep,都省着点用
#4
发现问题 程序里面总共就创建了两个线程
把另外一个线程注释掉后时间就变正常了
这两个线程是同时触发的
两个线程里有几个控件可能在同时使用
怎么解决呢
把另外一个线程注释掉后时间就变正常了
这两个线程是同时触发的
两个线程里有几个控件可能在同时使用
怎么解决呢
#5
还是同步引起的,比如操作一个VCL对象的时候另一个线程也想操作就得等。这个说白了就是一个调度问题,尽量减少对公共对象的访问,每次访问时间尽量缩短,实在不行就用专门的线程去操作VCL,变同步为异步,有个跟Synchronize对应的函数Queue就是异步的,不过我也没怎么用过不好说
#6
这样子啊
thread1 *newthread1 = new thread1(false);
BitBtn1->Click();
thread1里的函数是BitBtn2->Click();
这样写代码的话
BitBtn1 和BitBtn2里的函数是不是同时执行的?
thread1 *newthread1 = new thread1(false);
BitBtn1->Click();
thread1里的函数是BitBtn2->Click();
这样写代码的话
BitBtn1 和BitBtn2里的函数是不是同时执行的?
#7
严格的讲单核不可能同时执行(多核我也不知道,应该也不能吧),因为windows会把这些操作分开穿插执行的,而且两个按钮的响应顺序也不一定,因为thread1即使一开始就去按按钮,其构造函数也是可能花一定时间的,这样按按钮会被推迟。总之把所有操作理解为一个队列就行了,你的工作就是给它们排队
#8
谢谢 我仔细研究下我的两个线程应该怎么合作
#9
楼主考虑下能不能把处理和显示分开?线程只管处理数据,然后把数据保存到队列中,然后主窗体定时显示队列中的内容,这样可能速度会快点。。