这样会死锁,请解释原因。并使其不会死锁。(已经解决问题, 散分) (300分)

既然是同一个问题,那先前给你的办法好用吗?
你不说清楚,没法再继续给你解释
 
你的办法是让主线程偷偷的给你执行一下你所创建的线程。
这好象能解决问题。
治标不治本,我还是没弄懂。
就象我刚刚在上面发的一段CODE,TmR(v) 和 直接用 mr 两者是不同的,我也不知道为什么。
 
什么叫好象能解决问题?能就是能,不能就是不能!
什么叫“治标不治本”?这就是从解决线程死锁的原理出发,给出的根本解决之道!
你,让我怎么说你!
 
>>就象我刚刚在上面发的一段CODE,TmR(v) 和 直接用 mr 两者是不同的,我也不知道为什么
这是另外一个问题!
你怎么说“这好象是同一个问题哦”?
况且,function threadfunc(P: Pointer): LongInt;
stdcall
这个函数里面并没有mr变量,你怎么能用它?!
再说一遍,这是另外一个问题!
 
>>就象我刚刚在上面发的一段CODE,TmR(v) 和 直接用 mr 两者是不同的,我也不知道为什么
怎么不同法?你说来听听呀
 
>>就象我刚刚在上面发的一段CODE,TmR(v) 和 直接用 mr 两者是不同的,我也不知道为什么
靠,当然不同了,大大的不同,根本就不是一回事,没死机算你运气!
 
呵呵,大侠的打字速度好快啊。
用TmR(p) 则Caption 为1
用mr 则Caption 为10
我提这个问题的目的是弄清线程与线程之间到底存在着什么样的关系(当然是处在同一进程下)
为什么会死机呢?
 
你记着给我加分!
Tmr(P).v := 10;
//mr.v := 10;
这一句和上面的那一句有什么区别?
这两句的区别在于
第一句是把P指针变成TMR类型,再给它的成员v赋值。
第二句当然就是直接给mr的v赋值了。
你说这两句有没有区别?当然是天大的区别!
你在整个程序上犯了个概念上的大错误(与线程无关)
P指针通常强制变换应该是32位的类型。如果要达到你想要的效果,
应该均为指针类型变换才行,可你把它当成值变换了。
正确的是
第一:
thrd := CreateThread(nil, 0, @threadfunc, Pointer(mr), 0, id);
改为
thrd := CreateThread(nil, 0, @threadfunc, Pointer(@mr), 0, id);

第二:
Tmr(P).v := 10;
改为
PTMR(P).v := 10

其中PTMR = ^TMR;

所以说你要一个问题一个问题解决,否则冒出其他N多无关问题,还以为是线程问题!
 
楼上说得好,高手!
 
哦,好象又清醒了不少。
thrd := CreateThread(nil, 0, @threadfunc, Pointer(@mr), 0, id);

thrd := CreateThread(nil, 0, @threadfunc, Pointer(form1), 0, id);
//form1: TForm1;
又有什么区别?
 
我在吃饭
thrd := CreateThread(nil, 0, @threadfunc, Pointer(@mr), 0, id);

thrd := CreateThread(nil, 0, @threadfunc, Pointer(form1), 0, id);
有可比性?
你怎么总是不告诉前面的结果,就又出新问题,这样很不好。
给人的感觉你在忽视别人的劳动,对别人的劳动不值一提。这样的话,我也不想再说什么话了,感觉没意思。
 
to wlmmlw;
应该给 SS2000 分了。
 
谢谢 sunnyahniu,分当然我想要,但更重要的是感觉。分其实是虚拟的,重要的是大家
互相帮助!
to: wlmmlw,你的最后的问题涉及到 class 和 record 在使用上的一些区别,
你是一个问题接一个问题,可每个问题都没有告诉结果。
所以,这次我就不想再说了,等前面的结果都出来了再说。
就算你是考我们,我们答完题,也该告诉我们对不对呀 :(
 
呵,大侠,没耐心了?
我承认我是扯得远了点。
我为了找这个问题的答案,搜了一个星期的资料,到现在还是一点结果都没有。
当然,你们都说的很好。我也很感谢你们的帮助。
回到最开始的地方。创建了线程后主线程就WaitForSingleObjects(thrd, INFINITE)
如果在线程里调用了CoUnInitialize则会锁住。你们谁帮我解答一下?
分不是问题,我还有几千分,而且不吝啬。呵[:D]
 
难道把主线程的以下一句
WaitForSingleObject(thrd.Handle, INFINITE);
改为
while truedo
begin
if WaitForSingleObject(thrd.Handle, 100) = WAIT_OBJECT_0 then
break;
Application.ProccessMessage;
end;

没有用?!
要是没有用,扯那么多闲话干吗?!

 
我是想知道它的原因。
 
那到底是否解决了你的问题?
难道你承认
while truedo
begin
if WaitForSingleObject(thrd.Handle, 100) = WAIT_OBJECT_0 then
break;
Application.ProccessMessage;
end;
这段代码能解决你的问题,很让你丢面子?
 
>>我为了找这个问题的答案,搜了一个星期的资料,到现在还是一点结果都没有。
明明已经有了答案,答案就在眼前,何以说“到现在还是一点结果都没有”。
如果你不屑于我的答案,我无话可说。
 
不是D,大侠,你误会了,我已经对你的贡献做了肯定。
从我最先提问题的标题就可知道,一解锁,二解释原因。
大侠功力深厚,两下子就搞定了解锁,只是这第二个嘛,
还劳大侠你费点心,帮帮小虾米我[:D]
 
我可不敢称大侠。
你的分有10499分,我才2176分。
你是大侠,我是小虾米。
死锁的原因我认为已经说了。不过,我的解锁方法在你看来,“这好象能解决问题。
治标不治本”,“到现在还是一点结果都没有”,因此,我的解释恐怕也未入你大侠的眼。
 
顶部