菜鸟求助多线程

时间:2021-07-08 21:12:36
我创建了两个线程

thread1和thread2

thread1的Execute()函数里代码是Synchronize(BitBtn1->Click());
thread2的Execute()  函数里代码是Synchronize(BitBtn2->Click());

我在主窗口里写上

thread1 *newthread1 = new thread1(false);
thread2 *newthread2 = new thread2(false);

好像BitBtn1->Click()和BitBtn2->Click()不是同时触发的

我以前以为是BitBtn->Click()和BitBtn2->Click()里有公共的VCL控件和资源导致
thread1和thread2结束后使用的时间很长(我用多线程就是为了把事情分开做然后结束后合并以节省时间)

可我把公共的东西全部去了还是一样

我怀疑BitBtn2->Click()是在BitBtn1->Click()结束后才触发的

我找了多线程的源码的 BCB自带的例子也看得不怎么懂 貌似是同一件事情并发出多次

而我要的是不同事情同时触发

请高手解惑

18 个解决方案

#1


补充:我CPU是单核的  跟CPU有没有关系

#2


2在1之后执行不奇怪,线程2开始创建的时候线程1可能都执行了一会了,跟CPU没啥关系,这点时间差几乎不会有影响

#3


(我用多线程就是为了把事情分开做然后结束后合并以节省时间)

这个是不行的,只会更慢的

Synchronize函数是把操作提升到主线程操作,实际上他们是串行操作,并非并行操作。btn1和btn2肯定有一个先执行,一个后执行的

#4


那我该怎么办?

#5


线程里不用VCL  不用Synchronize  能不能实现

#6


线程里面执行的是什么东西?是计算,还是什么?

#7


线程里是从硬件里读数据 计算  线程1大概就是测量一个LED的电压 电流 亮度 极性  漏电 什么的

线程2就测量 那个LED灯的颜色  读出来的数据显示到窗口上

我把VCL控件全部去除  在线程外把数据传送到VCL控件里

#8


有没有并行操作的例子?我这里有几本书都是写的一个线程并行的

网上的例子也没找到我能用的

实在是没办法

要怎样才能让两个线程并发执行?

#9


绝对并行不太现实,也没太大意义,不妨设法协调好,让需要同时做的事尽量安排在一起,使其看上去是“同步”的,如果有些工作不一定非要同时做,还不如用异步的,效率还高

#10


楼主的需求应该不复杂的,可以考虑线程给主窗体发送消息。

线程计算出结果,然后把结果通过消息发送给主窗体,主窗体只负责显示,不参与计算,这样用户的体验更好点

至于如何发送消息等,可以搜索论坛

SendMessage是发消息并等待消息的处理结果,然后再执行一下句,线程在等待的时候,是不工作的
PostMessage是把消息放到消息队列里就返回继续执行下一句。

#11


楼上说的对,还有个办法是用公共变量,复杂点的可以用容器,线程不断把要显示的东西往里填充,窗体不断从里面提取并显示,访问时用临界区锁死,这样工作线程和窗体的耦合度也能降低

#12


你希望是同时触发还是分开触发呢?
你的代码明显是两个不同的线程,相互没有影响,也没有关系。

#13


引用 12 楼 jonix 的回复:
你希望是同时触发还是分开触发呢?
你的代码明显是两个不同的线程,相互没有影响,也没有关系。


同时!

#14


引用 11 楼 hind24 的回复:
楼上说的对,还有个办法是用公共变量,复杂点的可以用容器,线程不断把要显示的东西往里填充,窗体不断从里面提取并显示,访问时用临界区锁死,这样工作线程和窗体的耦合度也能降低


这两线程里用了太多的VCL了  一个函数接一个函数里用

你是说用VECTOR么

#15


如果对VCL操作非常频繁,或者要求非常即时,在机器性能满足的情况下按部就班的用同步也没什么不对,如果性能跟不上,就得考虑一下设计思路,是不是某些显示要折衷一下,比如批量显示以减少冲突的机会,或者干脆减少显示(因为某些可能不是必要的),这个只能具体情况具体分析

vector可以,也可以用deque作队列,一头进一头出更清晰一些

同时也可以用串行来逼近嘛,到底要有多同时?

#16


就显示个界面,为什么一定要同时触发呢? 这是不可能的

#17


引用 15 楼 hind24 的回复:
如果对VCL操作非常频繁,或者要求非常即时,在机器性能满足的情况下按部就班的用同步也没什么不对,如果性能跟不上,就得考虑一下设计思路,是不是某些显示要折衷一下,比如批量显示以减少冲突的机会,或者干脆减少显示(因为某些可能不是必要的),这个只能具体情况具体分析

vector可以,也可以用deque作队列,一头进一头出更清晰一些

同时也可以用串行来逼近嘛,到底要有多同时?



很麻烦

是一个for循环

一次for循环检测是要检测哪个项目检测出来再把结果存到一个数组里然后显示在VCL上

#18


问题已经解决了  谢谢CppFile提示用了Synchronize就不是一起执行的

谢谢hind24耐心回答  虽然没按你的提示解决  但也让我学到了知识

#1


补充:我CPU是单核的  跟CPU有没有关系

#2


2在1之后执行不奇怪,线程2开始创建的时候线程1可能都执行了一会了,跟CPU没啥关系,这点时间差几乎不会有影响

#3


(我用多线程就是为了把事情分开做然后结束后合并以节省时间)

这个是不行的,只会更慢的

Synchronize函数是把操作提升到主线程操作,实际上他们是串行操作,并非并行操作。btn1和btn2肯定有一个先执行,一个后执行的

#4


那我该怎么办?

#5


线程里不用VCL  不用Synchronize  能不能实现

#6


线程里面执行的是什么东西?是计算,还是什么?

#7


线程里是从硬件里读数据 计算  线程1大概就是测量一个LED的电压 电流 亮度 极性  漏电 什么的

线程2就测量 那个LED灯的颜色  读出来的数据显示到窗口上

我把VCL控件全部去除  在线程外把数据传送到VCL控件里

#8


有没有并行操作的例子?我这里有几本书都是写的一个线程并行的

网上的例子也没找到我能用的

实在是没办法

要怎样才能让两个线程并发执行?

#9


绝对并行不太现实,也没太大意义,不妨设法协调好,让需要同时做的事尽量安排在一起,使其看上去是“同步”的,如果有些工作不一定非要同时做,还不如用异步的,效率还高

#10


楼主的需求应该不复杂的,可以考虑线程给主窗体发送消息。

线程计算出结果,然后把结果通过消息发送给主窗体,主窗体只负责显示,不参与计算,这样用户的体验更好点

至于如何发送消息等,可以搜索论坛

SendMessage是发消息并等待消息的处理结果,然后再执行一下句,线程在等待的时候,是不工作的
PostMessage是把消息放到消息队列里就返回继续执行下一句。

#11


楼上说的对,还有个办法是用公共变量,复杂点的可以用容器,线程不断把要显示的东西往里填充,窗体不断从里面提取并显示,访问时用临界区锁死,这样工作线程和窗体的耦合度也能降低

#12


你希望是同时触发还是分开触发呢?
你的代码明显是两个不同的线程,相互没有影响,也没有关系。

#13


引用 12 楼 jonix 的回复:
你希望是同时触发还是分开触发呢?
你的代码明显是两个不同的线程,相互没有影响,也没有关系。


同时!

#14


引用 11 楼 hind24 的回复:
楼上说的对,还有个办法是用公共变量,复杂点的可以用容器,线程不断把要显示的东西往里填充,窗体不断从里面提取并显示,访问时用临界区锁死,这样工作线程和窗体的耦合度也能降低


这两线程里用了太多的VCL了  一个函数接一个函数里用

你是说用VECTOR么

#15


如果对VCL操作非常频繁,或者要求非常即时,在机器性能满足的情况下按部就班的用同步也没什么不对,如果性能跟不上,就得考虑一下设计思路,是不是某些显示要折衷一下,比如批量显示以减少冲突的机会,或者干脆减少显示(因为某些可能不是必要的),这个只能具体情况具体分析

vector可以,也可以用deque作队列,一头进一头出更清晰一些

同时也可以用串行来逼近嘛,到底要有多同时?

#16


就显示个界面,为什么一定要同时触发呢? 这是不可能的

#17


引用 15 楼 hind24 的回复:
如果对VCL操作非常频繁,或者要求非常即时,在机器性能满足的情况下按部就班的用同步也没什么不对,如果性能跟不上,就得考虑一下设计思路,是不是某些显示要折衷一下,比如批量显示以减少冲突的机会,或者干脆减少显示(因为某些可能不是必要的),这个只能具体情况具体分析

vector可以,也可以用deque作队列,一头进一头出更清晰一些

同时也可以用串行来逼近嘛,到底要有多同时?



很麻烦

是一个for循环

一次for循环检测是要检测哪个项目检测出来再把结果存到一个数组里然后显示在VCL上

#18


问题已经解决了  谢谢CppFile提示用了Synchronize就不是一起执行的

谢谢hind24耐心回答  虽然没按你的提示解决  但也让我学到了知识