死循环线程怎么结束?

nuaatanjun 2006-06-07 09:18:09
在主窗口FormContainer中创建一个线程用于对数据库的维护
FormShow()
{
pDBMain = new TDBMaintanceThread(true);
pDBMain->Resume();
}
void __fastcall TDBMaintanceThread::Execute()
{
while(true)
{

...
bool NetStatus1,NetStatus2;
NetStatus1 = SysTool->FrmCheckNet1->NetStatus;
::Sleep(3000);
NetStatus2 = SysTool->FrmCheckNet1->NetStatus;
if(!NetStatus1 && !NetStatus2 && !FormContainer->FlashTimer->Enabled)
FormContainer->FlashTimer->Enabled = true;
::Sleep(10000);
}
在 FormClose()
{
pDBMain->Terminate();
delete pDBMain;//没有这行时系统能够正常关闭,加上系统死机!
}
利用线程不停判断系统连接状态,从而设置定时器开关,使系统具备闪烁功能。
怎样结束pDBMain这个线程
图片的闪烁功能是否一定要用定时器,有什么其它方法。
...全文
442 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
我不懂电脑 2006-06-08
  • 打赏
  • 举报
回复
BOOL TerminateThread(

HANDLE hThread, // handle to the thread
DWORD dwExitCode // exit code for the thread
);
cczlp 2006-06-08
  • 打赏
  • 举报
回复
设个标志退出, 任何时候都不要用死循环
nuaatanjun 2006-06-07
  • 打赏
  • 举报
回复
while(true)我的本意就是让这个线程一直执行,只有在程序退出的时候才终止。

现在明白了,sczyq(我又...........) 的改法能够具备同样的功能,谢谢!

还有个问题,按照线程注释
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize,

如果将Execute()中的代码移到函数A()中,利用Synchronize(A)执行,程序在开始时就死机,怎么解决?
sczyq 2006-06-07
  • 打赏
  • 举报
回复
?1、 while(!True) 又不见退出点,不死机才怪!退出线程时 Terminated = true.
?2、Sleep(3000);,Sleep(10000);挺恐怖的,Sleep 怎么用这么大的数字,我通常是使用比较小的数据,以使线程能够正常结束!


void __fastcall TDBMaintanceThread::Execute()
{
while(!Terminated) // 改掉了
{
...
bool NetStatus1,NetStatus2;

NetStatus1 = SysTool->FrmCheckNet1->NetStatus;
// ::Sleep(3000); 改成以下
for (int i=0; i<60 && !Terminated; i++) Sleep(50);

    if (!Terminated)
{
NetStatus2 = SysTool->FrmCheckNet1->NetStatus;
if(!NetStatus1 && !NetStatus2 && !FormContainer->FlashTimer->Enabled)
FormContainer->FlashTimer->Enabled = true;
    for (int i=0; i<200 && !Terminated; i++) Sleep(50);
// ::Sleep(10000); // 改成以上
}
Sleep(50);
}
}

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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