线程问题 急(100分)

T

tscc

Unregistered / Unconfirmed
GUEST, unregistred user!
我的主程序中运行了两个与主线程一同运行的线程,程序运行后,用任务管理器察看,cpu 100% 被占用,我的程序占用了97%-99%,此时运行其他程序非常慢,是不是与线程的优先级有关,怎样解决,如果线程死了,请问如何使它重新启动?
 
线程的代码有问题,线程负荷过重,与优先级无关。
 
barton说的对,线程的代码有问题,好好检查一下。
 
你的线程的代码有问题,可以考虑使用Sleep还是或者WaitForSingleObject函数。
 
你看他真的急吗?发布完再没上来过。
 
各位我因有事没即时上来,请原谅,
我的线程是个循环
FreeOnTerminate:=True;
while not Terminateddo
begin
sleep(0);
//监视一链表,有数据处理
end;

你们说的WaitForSingleObject,如何用,那有例子,在线等待
 
sleep(0);不能对cpu降低%有帮助
要不就sleep大一点,要不就看“监视一链表,有数据处理”是什么触发条件
可以用waitmessage、waitforsingleobject等对付
 
1.在线程还未运行时建立一个信标(或事件)
Semaphore := CreateSemaphore(nil, 0, 10, nil);
Semaphore变量可设置成对象成员变量或者单元静态变量,保证修改链表的函数和线程都能
访问到;
2.在修改链表的函数中加入一个给信标发信号的函数:
ReleaseSemaphore(Semaphore);
3.然后在线程中用等待函数阻塞线程。
if WaitForSingleObject(Semaphore, INFINITE) = WAIT_OBJECT_0 then
if not Terminated then
//处理链表已被修改;
4.注意必须通过先设置线程的Terminated=True后ReleaseSemaphore关闭线程;
5.可以使用事件,只是注意两点小小的问题:
a.使用事件对象时最好手工复位,并且在处理时用ResetEvent复位;
b.如果在事件被触发尚未ResetEvent前又一个线程触发了事件这时线程只可能发生一次
阻塞,而Semaphore则会发生两次,这需要根据你的逻辑来判断。
 
感谢 barton
是不是 每ReleaseSemaphore(Semaphore);一次,线程就执行一次,我的程序有很多地方修改链表,而且是两个链表(a,b),两个线程(A,B),A负责处理a,B负责将b中符合条件的之存到
a中再处理,主线程负责向b中存数,同时还有其他地方要用到链表和线程,是不是所有地方都
ReleaseSemaphore(Semaphore),
我还是不太明白,明天是礼拜在家好好研究研究,如果你有这方面的例子就好了
 
你用的操作系统??感觉,还是应该代码处理部分出问题!因为,线程,一般不但不会影响其它程序,就连自己的主线程,都能得到更多的处理时间,如果出现你说的情况,要么就是死锁,要么就是打开网络资源或其它会带来阻塞的操作!
 
在win98中没太大影响,win2000中cpu占用99%,我的程序用indyserver监测一端口,请帮忙
我不想太改动程序了,时间!!!!!!!!
 
to tscc:是的,每释放一次信标就执行一次线程中的代码。两个线程就设两个Semaphore。
任何一个地方修改链表就得秋放一次信标。
不过,如果每个线程跟踪一个链表那就没有必要用线程了,用一个函数就行了。所有修改
链表的地方调用一次函数。
 
非常感谢各位,我明天试试,星期一给分,如果各位有个八例子,在下不胜感激!
 
98不惧备完全意义上的多线程,所以你的程序不会完全占用cpu;
2k中你的代码把sleep(0)改成sleep(1)结果就不一样了;
我曾经测试过,线程中加sleep(0)和sleep(1);
sleep(0),cpu全部占用;
sleep(1),cpu资源几乎不占用;
sleep(X)中的X似乎小于125就不准了;
你可以试试
 
你用了线程的同步函数?
那个以S开头的忘记叫什么的函数了
 
非常感谢 barton 用你的方法可以,不过程序改动的地方很多,我正在加油干,
sleep(X)根本没用,
 
接受答案了.
 
嗯?
>>你用的操作系统??感觉,还是应该代码处理部分出问题!因为,线程,一般不但不会影响其它
>>程序,就连自己的主线程,都能得到更多的处理时间,如果出现你说的情况,要么就是死锁,
>>要么就是打开网络资源或其它会带来阻塞的操作!
这是你要的答案?
 
顶部