T tscc Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-11 #1 我的主程序中运行了两个与主线程一同运行的线程,程序运行后,用任务管理器察看,cpu 100% 被占用,我的程序占用了97%-99%,此时运行其他程序非常慢,是不是与线程的优先级有关,怎样解决,如果线程死了,请问如何使它重新启动?
我的主程序中运行了两个与主线程一同运行的线程,程序运行后,用任务管理器察看,cpu 100% 被占用,我的程序占用了97%-99%,此时运行其他程序非常慢,是不是与线程的优先级有关,怎样解决,如果线程死了,请问如何使它重新启动?
D delnew Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-11 #3 barton说的对,线程的代码有问题,好好检查一下。
T thx1180 Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-11 #4 你的线程的代码有问题,可以考虑使用Sleep还是或者WaitForSingleObject函数。
T tscc Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-12 #6 各位我因有事没即时上来,请原谅, 我的线程是个循环 FreeOnTerminate:=True; while not Terminateddo begin sleep(0); //监视一链表,有数据处理 end; 你们说的WaitForSingleObject,如何用,那有例子,在线等待
各位我因有事没即时上来,请原谅, 我的线程是个循环 FreeOnTerminate:=True; while not Terminateddo begin sleep(0); //监视一链表,有数据处理 end; 你们说的WaitForSingleObject,如何用,那有例子,在线等待
P Pipi. Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-12 #7 sleep(0);不能对cpu降低%有帮助 要不就sleep大一点,要不就看“监视一链表,有数据处理”是什么触发条件 可以用waitmessage、waitforsingleobject等对付
B barton Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-12 #8 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则会发生两次,这需要根据你的逻辑来判断。
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则会发生两次,这需要根据你的逻辑来判断。
T tscc Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-12 #9 感谢 barton 是不是 每ReleaseSemaphore(Semaphore);一次,线程就执行一次,我的程序有很多地方修改链表,而且是两个链表(a,b),两个线程(A,B),A负责处理a,B负责将b中符合条件的之存到 a中再处理,主线程负责向b中存数,同时还有其他地方要用到链表和线程,是不是所有地方都 ReleaseSemaphore(Semaphore), 我还是不太明白,明天是礼拜在家好好研究研究,如果你有这方面的例子就好了
感谢 barton 是不是 每ReleaseSemaphore(Semaphore);一次,线程就执行一次,我的程序有很多地方修改链表,而且是两个链表(a,b),两个线程(A,B),A负责处理a,B负责将b中符合条件的之存到 a中再处理,主线程负责向b中存数,同时还有其他地方要用到链表和线程,是不是所有地方都 ReleaseSemaphore(Semaphore), 我还是不太明白,明天是礼拜在家好好研究研究,如果你有这方面的例子就好了
A Aiirii Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-12 #10 你用的操作系统??感觉,还是应该代码处理部分出问题!因为,线程,一般不但不会影响其它程序,就连自己的主线程,都能得到更多的处理时间,如果出现你说的情况,要么就是死锁,要么就是打开网络资源或其它会带来阻塞的操作!
你用的操作系统??感觉,还是应该代码处理部分出问题!因为,线程,一般不但不会影响其它程序,就连自己的主线程,都能得到更多的处理时间,如果出现你说的情况,要么就是死锁,要么就是打开网络资源或其它会带来阻塞的操作!
T tscc Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-12 #11 在win98中没太大影响,win2000中cpu占用99%,我的程序用indyserver监测一端口,请帮忙 我不想太改动程序了,时间!!!!!!!!
B barton Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-12 #12 to tscc:是的,每释放一次信标就执行一次线程中的代码。两个线程就设两个Semaphore。 任何一个地方修改链表就得秋放一次信标。 不过,如果每个线程跟踪一个链表那就没有必要用线程了,用一个函数就行了。所有修改 链表的地方调用一次函数。
to tscc:是的,每释放一次信标就执行一次线程中的代码。两个线程就设两个Semaphore。 任何一个地方修改链表就得秋放一次信标。 不过,如果每个线程跟踪一个链表那就没有必要用线程了,用一个函数就行了。所有修改 链表的地方调用一次函数。
T tscc Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-12 #13 非常感谢各位,我明天试试,星期一给分,如果各位有个八例子,在下不胜感激!
N Net200 Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-13 #14 98不惧备完全意义上的多线程,所以你的程序不会完全占用cpu; 2k中你的代码把sleep(0)改成sleep(1)结果就不一样了; 我曾经测试过,线程中加sleep(0)和sleep(1); sleep(0),cpu全部占用; sleep(1),cpu资源几乎不占用; sleep(X)中的X似乎小于125就不准了; 你可以试试
98不惧备完全意义上的多线程,所以你的程序不会完全占用cpu; 2k中你的代码把sleep(0)改成sleep(1)结果就不一样了; 我曾经测试过,线程中加sleep(0)和sleep(1); sleep(0),cpu全部占用; sleep(1),cpu资源几乎不占用; sleep(X)中的X似乎小于125就不准了; 你可以试试
G gongxingg Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-13 #15 你用了线程的同步函数? 那个以S开头的忘记叫什么的函数了
T tscc Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-14 #16 非常感谢 barton 用你的方法可以,不过程序改动的地方很多,我正在加油干, sleep(X)根本没用,
B barton Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-14 #18 嗯? >>你用的操作系统??感觉,还是应该代码处理部分出问题!因为,线程,一般不但不会影响其它 >>程序,就连自己的主线程,都能得到更多的处理时间,如果出现你说的情况,要么就是死锁, >>要么就是打开网络资源或其它会带来阻塞的操作! 这是你要的答案?
嗯? >>你用的操作系统??感觉,还是应该代码处理部分出问题!因为,线程,一般不但不会影响其它 >>程序,就连自己的主线程,都能得到更多的处理时间,如果出现你说的情况,要么就是死锁, >>要么就是打开网络资源或其它会带来阻塞的操作! 这是你要的答案?