看你的代码,当该线程给suspend后,就不会继续执行,除非你在线程外部resume它。
我的做法是,用主线程去控制所有其它线程的suspend、resume、priority等情况。
我的做法是,用主线程去控制所有其它线程的suspend、resume、priority等情况。
解决方案 »
- 点击按扭向edit中添加文本时,如何让其在当前光标位置添加?
- 进销存财务一体化管理软件
- 单元与单元之间变量传递,送你十分、祝你十分健康,谢谢参与
- 加急,加急,加急。关于TREEVIEW多选。
- delphi窗体之间怎样传递值?
- 在sql server中,如何创建一个字增自段?(最好用可视化方法!)
- 用还是不用第三方控件(工程高手请进)
- 记录集传递显示问题。请帮忙,解决定有高分相送。应该不是难的,可是我比较笨!!!
- 如何开发一个带运行参数的应用程序?
- 请问:如何解决关于263.net等Email提供商增设的“smtp认证”功能?
- Table组件的RecNo怎么老是-1?
- 如何在点击表单的标题栏时不让表单击活?因为我不想让用户移动表单的位置!
当线程挂起后,edit中的值不再改变,但是当线程resume后,edit中的值仍不变.
按道理它应该继续增加才对.其实,我也只是一个主线程,一个计算edit中显示值的线程.我想实现当主线程中某一条件触发时.另一个线程能够挂起,然后当条件中的代码执行完,它再继续.
mythread:=TTestthread.create(false); //执行一个自加,并在mainform中显示
mythread.suspend;
mythread.resume;
程序能够实现.
但是如果
mythread:=TTestthread.create(false); //执行一个自加,并在mainform中显示
mythread.suspend;
其他的代码
mythread.resume
主窗体中的edit 不再变化了 . ??????
我看过原先关于线程的文章.有许多你的发言,望多加指点.
我在怀疑我上网的时间是不是超过斑竹 :)
为什么过了许天,还是这个样子呢????
是否我自己该多加学习才是,但csdn是一个提供解决问题,大家把经验共享的地方,对于我这个初学者,你们的回答会让我更仔细思考.怎么……………………
线程间的通信最好用信号量,如Tevent
其他的代码
mythread.resume中的"其他代码"也贴出来,否则我感觉象猜迷语一样
如果这样写
mythread:=TTestthread.create(false); //执行一个自加,并在mainform中显示
*********************** 这之间的时间足够短,使得线程还不足以运行到影响结果运算的代码
mythread.suspend;
mythread.resume;
程序能够实现.
但是如果
mythread:=TTestthread.create(false); //执行一个自加,并在mainform中显示
*********************** 此处耽误了时间,难说了:(
mythread.suspend;
其他的代码
mythread.resume
主窗体中的edit 不再变化了 .
----------------------------------------------------------------------------修改后: mythread:=TTestthread.create(TRUE); // TRUE,TRUE and TRUE
其他的代码 // 做任何与线程有关的操作(比如赋值)
mythread.resume; // 确保从线程初始点运行
如果这样写
。以下全是废话
----------------------------------------------------------------------------修改后: mythread:=TTestthread.create(TRUE); // TRUE,TRUE and TRUE
其他的代码 // 做任何与线程有关的操作(比如赋值)
mythread.resume; // 确保从线程初始点运行
事件点 Event
信号量 Semaphore
临界区 CriticalSection但是这些操作一般需要在线程内部才能使用,一般情况下Delphi提供封装的TCriticalSection和TEvent已经足够了,但是有些时候为了完成“不可能”的任务(mission impossible),这些“九阴真经”级别的操作还是必须的。呵呵
另外更正airhorse一下:TEvent不是信号量
但我用一个全局变量模拟了内核对象,实现了他们的功能,而且极其简单。
我觉得这样更好。
如果要的话,流个mail。我给你寄个我刚编的代码。
通过一个全局变量,完全操纵两个线程顺次运行。
请问一下,你的两个线程是不是时刻轮询这个全局变量来判断当前的运行状态?(运行、阻塞)
我不得不告诉你,你的设计存在着非常严重的缺陷!
你的基本原理和内核对象是一样的,但是两者差异的地方要远远大于相同的地方,因为:
如果采用内核对象的话,在线程阻塞等待调度时,系统将撤回此线程的CPU调度时间,并将这些多余的CPU调度时间用于其他线程的调度,从而对CPU的利用率提高,并且客观上加速了其他线程的运行。
但是你的方法效果刚好相反,采用人工线程阻塞时,不断地轮询同步、信号量,不仅没有节省出线程阻塞时多余的CPU调度时间,反而系统会为你的代码中的密集循环轮询分配更多的CPU调度时间,显而易见,势必影响了系统中其他线程的运行效率;而且此时线程处于阻塞态,没有有效代码运行,所以整体效率为0%。
你可以在Win2000下面打开任务管理器的CPU使用图对比一下上面的差别:同样一个线程阻塞,用内核对象时,线程(所在进程)CPU占用率为0%;而使用人工阻塞时,线程(所在进程)CPU占用率立刻到了接近100%,几乎所有的CPU动力都被作成了无用功。使用系统内核对象的调度控制,线程受控于系统内核,而系统内核负责调度整个系统中所有的线程,会优化分配CPU调度时间,整个系统都会收益;而人工调度……我想没有比这更糟糕的了 :)
其实WindowsAPI的内核对象非常容易操作,难道几条API指令都难么?
:)
事件点 Event
临界区 CriticalSection 的底层封装都是,信号量,他们都只是信号量的一个简单使用,看看有关操作系统的书吧,
对,你讲得很好,这个方面我是欠考虑了。我只是实现了内核的功能。
但微软肯定自家作了优化。那还是用内核对象。也很简单。