请问线程挂起是一个什么样的概念?(50分)

  • 主题发起人 主题发起人 LuckyJackie
  • 开始时间 开始时间
L

LuckyJackie

Unregistered / Unconfirmed
GUEST, unregistred user!
也就是SuspendThread到底做了些什么,比如说我在线程中从1加到10,加到3时,把线程Suspend,然后再Resume,这时,是从4开始还是重新从1开始,还是。。。
再拓展到我的应用中,因为我的一个后台运行的线程平时是在不断‘冒犯’我主进程中的一个对象,当我需要在进程中使用这个对象时,我就把这个线程先Suspend,处理完后再Resume,可行吗?
问题的症结在于:当我把这个线程Suspend后,它有可能仍然会冒犯我的那个对象吗?
 
挂起的可以理解为暂停,resume后,从暂停的地方继续运行。
一般在线程中修改进程中的对象,用Synchronize保证同步。
 
flamboyant,
Synchronize是很耗资源的,平常我并不需要使用那个对象。
我的目的是当我需要在进程中使用那个对象时,能获得优先权并不被线程干扰。
 
再拓展到我的应用中,因为我的一个后台运行的线程平时是在不断‘冒犯’我主进程中的一个对象,当我需要在进程中使用这个对象时,我就把这个线程先Suspend,处理完后再Resume,可行吗?
其实不用这样.这样无谓增加了很多线程的控制操作.
可以把这个对象的操作用临界区封装一下,然后线程的调用用自定义事件(事件的执行代码为主窗体的函数) 这样主窗体和线程就各自干活也不会产生冲突了,也不用去控制线程了.
 
to 晚起的小虫,
你可能未理解我的意图。
我的线程有可能是始终都在程序中运行着,不停的处理着相关数据。如果照你的思路,主程序可能都动不了了,因为你把所有的东西都放到了进程中。
我不想用临界区,因为这样一来,当我需要在进程中使用那个对象时,基于上面的陈述,这可能需要相当的等待,而我的目的是这时应该跨过线程的干扰,立即兑现。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3450724
大家看看我的问题啊
 
线程挂起就是cpu不再分配时间片给这个线程,行当于暂停吧
挂起之后不会再冒犯你的对象。
用临界区保护似乎比较合适,不会出现你说的问题
 
------------------------------------------------------
用临界区保护似乎比较合适,不会出现你说的问题
------------------------------------------------------
我的问题是:如果使用了临界区,而且这个对象在临界区中被处理的时间相对较长,一旦当我需要在进程中使用这个对象时,就需要排队。
 
1. 使用临界区是比较合适的
2. 凡是不要太死板.谁也没有规定临界区必须对应真实对象.你完全可以用临界区控制一个全局变量.
static bool bIsBusy;
bool GetObject()
{
bool bOK;
EnterXXX_OF_IsBufy();
if(bIsBusy)
bOK = false;
else
{
bOK = true;
bIsBusy = true;
}
LeaveXXX_OF_IsBusy();
}
这样就可以互斥此对象的访问.如果这不能满足你的要求,也就是说主线程需要访问的时候必须访问,那么你只能和占用县城进行通信,请求其释放.在不同线程中访问同一对象是必须互斥的.(当然也不是绝对,比如其他线程仅仅是读取对象的一个简单变量,且只有一个单独的线程才会写它.)
 
>>而且这个对象在临界区中被处理的时间相对较长,一旦当我需要在进程中使用这个对象时,就需要排队.
一个线程没有离开临界区时,另外一个线程要访问临界区中的对象,那就是所谓的“脏读”吧,临界区本来就是避免这种情况的,如果你非要“脏读”,那很简单,不用取得临界区标志,直接访问就行了。
比如十字路口的红绿灯,不是说非要红灯停绿灯行,只要你不怕出意外,直接不用看红绿灯,生闯就是了。
 
挂起就是不运行,也就是暂停.
你应该学一下操作系统
 
//而且这个对象在临界区中被处理的时间相对较长
出现这种情况,我想多半是你的程序设计问题,比如是否 颗粒太大.(对象太过于庞大,可以拆分成若干个小对象).
 
使用消息解决吧
需要用到主线程的对象的时候给主线程发一个消息
执行消息的过程在主线程完成。
说到耗费时间
不停的Suspend,Resume更耗费时间
 
再说明一下,对象大部份时间只是线程在使用(只有一个线程),主线程只是偶尔需要它,所以我不想用同步或其他机制,但我希望主线程在使用它的时候,能够得到优先,所以想使用Suspend与Resume。
希望后来的人能看一下前面的再发言,谢谢关注。
 
//来自:zjan521, 时间:2006-5-25 19:02:15, ID:3453391 | 编辑
//也就是说主线程需要访问的时候必须访问,那么你只能和占用线程进行通信,请求其释放
这已经回答了你的问题,因此也希望您在继续更新的时候,看一看前边的回答.
//所以我不想用同步或其他机制
裸奔我是支持的,因为我不是警察.您可以类比思考.
 
偶现在的目的是:在主线程使用那个对象的时候,能够得到优先权,也就是能够马上执行对它的处理,不管线程是否正在运行,不管是否使用了同步机制。
再具体一点,不使用同步机制的情况下该怎么做,使用了同步机制的情况下又该怎么做?
再次谢谢大家的关注。
如果能得到解决方法,我会酌情增加分数。
 
如果只用Suspend,然导致线程停留在任何地方,有可以资源被你的主线程改变,而子线程重新启动后并不知道,比如count等属性就会产生异常。
我有个想法,用EVENT,主线程要得到资源的时候,不如想办法让子线程快速知道(比如让子线程产生一个异常),立刻放出EVENT,主线程就可以立即执行。原理还是同步。
 
本来可以用一个Event与WaitFor来控制子线程中实际动作的执行,具体一点说是:
在子线程的Execute中执行实际动作前WaitFor(INFINITE),需要执行子线程时在主线程中SetEvent,当主线程需要控制权时则ResetEvent,但这里有一个问题,在ResetEvent的一瞬间,子线程可能正处于执行上一次实际动作的过程中,这样的话冲突仍不可避免。。。
感觉用Suspend是不行,问题更多。
 
后退
顶部