TEvent的问题,100分求教

psh 2002-04-25 11:33:39
下面程序是要主线程根据后台线程对TEvent事件置为有信号后进行循环体中的操作,由于主线程先执行到while(AEvt->WaitFor(10000)==wrSignaled)语句后,后台线程才执行AEvt->SetEvent()故未进入循环体中。若在其前加ShowMessage(),则能。为什么?
急!!!请高人指点迷津,谢谢!

void __fastcall TMainForm::bbnTestClick(TObject *Sender)
{
//...
BgThread->WriteBuffer(mCmd,mCmdLen); //BgThread为TBackgroundThread的对象

//ShowMessage("Wait for Signaled"); //若有该句,则能进行循环体执行

while(AEvt->WaitFor(10000)==wrSignaled)
{

Sample();
break;
}
//...
}

void __fastcall TBackgroundThread::Execute()
{

while (!Terminated)
{
//...
if(BytesRead)
{
MainForm->AEvt->SetEvent(); //AEvt为全局TEvent变量
}

//...
}
}
...全文
44 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
invalid 2002-04-26
  • 打赏
  • 举报
回复
设置两个断点,一个一步一步执行主线程,一个在SetEvent设置断点。
分别在ShowMessage和不ShowMessage状态下观察。
psh 2002-04-26
  • 打赏
  • 举报
回复
在后台设断点跟踪,F8后未执行断点的下一句,不知跑哪了?
psh 2002-04-26
  • 打赏
  • 举报
回复
再谢谢invalid兄的关注。
waitfor的返回值为1(TimeOut)
psh 2002-04-26
  • 打赏
  • 举报
回复
是主线程的等待使后台线程受阻???
主线程、后台线程的state都为stoped,主线程的status为Unknown,后台线程为
Init
invalid 2002-04-26
  • 打赏
  • 举报
回复
显示一下waitfor的返回值看看。
psh 2002-04-26
  • 打赏
  • 举报
回复
WaitFor的TimeOut改大也试过,不起作用。
没道理啊!!!!!!
psh 2002-04-26
  • 打赏
  • 举报
回复
谢谢invalid兄。
1.子线程在bbnTestClick()前已执行
2.若不执行bbnTestClick(),而先执行后台线程,系统能马上响应置AEvt为有信号(用不了10秒),但只要是先执行bbnTestClick()中WaitFor,则后台线程就响应不了,为什么?
3.后台线程的Priority = tpHigher;
急!!!请高手续继支招,先谢。
invalid 2002-04-25
  • 打赏
  • 举报
回复
看看你的程序执行方式:
1。设置子线程执行
2。showMessage,showMessage时主线程阻塞,这时候子线程可以执行到SetEvent。
3。如果不ShowMessage,程序马上就执行到了WaitFor,WaitFor等待10秒钟,10秒钟,子线程可能还来不及设置SetEvent呢。
4。你尝试把WaitFor的TimeoUt改大一点试试。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧