这么多种线程怎么协调工作呢,Semaphore WaitFor等好像都用不上。重谢。(100分)

  • 主题发起人 tianzhen
  • 开始时间
1
我在线程中用Application.ProcessMessages;
也不是为了降低CUP,这两种写法
if WaitForSingleObject(h_list2e, INFINITE) <> WAIT_OBJECT_0 then
Application.ProcessMessages;
。。。//功能模块

if WaitForSingleObject(h_list2e, INFINITE) = WAIT_OBJECT_0 then
。。。 //功能模块
没区别吧?
另外问一下, if WaitForSingleObject(h_list2e, INFINITE) <> WAIT_OBJECT_0 then
Application.ProcessMessages;

while WaitForSingleObject(h_list2e, INFINITE) <> WAIT_OBJECT_0do
Application.ProcessMessages;
有区别吗?

2
读取是永远取list第一行(读后立即删除);
写入是永远写入list最后;这种情况可以不用临界区吧?
程序中list空临界取得更大些,不是1而是100,这样即使有坏读写(不进出临界区),也不会有大碍吧?
用信号方式主要是保证t3持续不断地输出结果,不然轮流resume,别的都suspend也不至于这么麻烦

3
因为list并不需要很精确的控制(比如,list.count小于100左右就算空,大于10000左右就算满),不用临界区也不会有大碍吧?
4
t1,t2,t3用挂起与换醒方式来执行的话,如何能保证t3持续不断地输出结果(客户要求)?
t2一直在判断list1.count吗? WaitForSingleObject不是消息机制吗,有信号才发消息的,所以才比sleep省CPU,是吗?
应该是WaitForSingleObject没信号的话,就=在那里等信号,并不继续结束进程,触发进程。。。吧?
难道应该用while WaitForSingleObject() = WAIT_OBJECT_0do
... ? 代替for结构?
5
t3可以开少些,对程序思路不会有影响吧
 
lqcros 线程池怎么用啊
 
1、可以说没区别。
2、除非你的指令可以在一个cpu周期内执行完毕(而且你在高级语言中好像无法保证,因为还有编译器),否则多线程对非线程安全对象的访问必须使用同步。
3、你目前的情款比较适合使用限制队列长度的方法,而不是等待,因为你等待也是要丢数据的,所以你不如限制队列长度,大于长度就将最先保存的数据替换为当前数据。
4、你的线程数量可以1、2、4的方式分布。不需要那么多,没有用,不会提高效率,反而会使效率、性能、安全下降。
 
线程池 盒子有下载,下面是地址
http://www.2ccc.com/article.asp?articleid=3454
 
1
另外问一下, if WaitForSingleObject(h_list2e, INFINITE) <> WAIT_OBJECT_0 then
Application.ProcessMessages;

while WaitForSingleObject(h_list2e, INFINITE) <> WAIT_OBJECT_0do
Application.ProcessMessages;
有区别吗?
2
对于临界区一直不太理解:
我不在乎共享数据的精确性,共享数据也不会出现共享违例错,为什么还要用临界区?
换句话说,不用临界区还能导致别的什么问题?
3
限制队列长度的方式,好像经常被用,但是前面取到的数据被冲掉不是浪费了网络资源么?
这种方式比等待队列空余的优点在哪里呢?
4
&quot;你的线程数量可以1、2、4的方式分布。 &quot;
是指5,10,40还是确指1,2,4
因为线程t3的处理是本地的,几乎不耗时间,所以才开很多线程t1,t2,t3.

5另外有个郁闷的问题,用了上面代码程序无法退出,以前用sleep控制的时候还只是退出有延迟,现在程序中一个sleep也没了,点X后程序完全忽略我,继续工作,等多久也不退。
另外点X后,在可能锁死的地方下了断点都不断,应该也没有锁死。
想问题一下:除了sleep还有什么导致这种情况呢
 
1、有区别,如果在线程里运行,第二种情况可能无法退出。
2、临界不是为了精准,而是必须。
3、如果你的队列限制的比较合理,丢掉的数据一定比你SLEEP时丢掉的少。
4、是说第一个线程数量为1,第二个为2,第三个为4。我只是举个例子,具体数量你可以测试一下,但比例应该差不多。
5、与你的
while WaitForSingleObject(h_list2e, INFINITE) <> WAIT_OBJECT_0do
Application.ProcessMessages;
以及线程数量过多有关。
 
还是不知道我程序的思路有没有绕弯路,有没有别的捷径来实现, 难道要揭帖了?
 
这种程序如果是我做的话, 我会给list加队列长度改变的事件。
队列长度改变的话暂停或者启动处理线程t2(如>1时启动第一个t2处理线程反则关闭>100时启动第二个t2处理线程反则关闭,并且关闭一个t1线程。。。。)
 
用event来调度线程时比较合理的方法
另外TList不是线程安全,建议用TThreadlist
 
原来用sleep挺好的,现在用event运行几小时后就未知异常错,郁闷。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
423
import
I
顶部 底部