运行线程时死机?

zz997788 2005-12-01 05:01:32
我在程序运行时,用一个线程不断的读dll中的数据,代码如下:

//---------------------------------------------------------------------------
void __fastcall TADcj::Execute()
{
do
{
// Application->ProcessMessages();

Synchronize(cj);
} while( !Terminated );
}
//---------------------------------------------------------------------------
void _fastcall TADcj::cj(){
float dat;

dat= VacGetLoadat(); //读取dll中的数值
Frmain->syID.g_ln=dat;
Frmain->LDp->Caption=FormatFloat("0.00",Frmain->syID.g_ln);
}

但总是死机,程序总是在执行线程中,根本跳不到主程序中去,但在线程的do...while中加上Application->ProcessMessages();后又可以正常运行。
我现在不想通,为什么我在《c++builder5编程实例与技巧》的一例子上不加Application->ProcessMessages();线程总能自己跳回主程序,而不会死机,书中部分代码如下:

void __fastcall TSquareThread::Execute()
{
Step = 1;
do
{
X1 = X2;
X2 = X2+Step;
if( X2<160 )
Step = 1;
else if( X2>(Form1->ClientWidth-15) )
Step = -1;

Synchronize(Paint);
// Paint();
} while( !Terminated );
}
//---------------------------------------------------------------------------

void __fastcall TSquareThread::Paint()
{
// 使用窗体的颜色在老地方画一个正方形
Form1->Canvas->Pen->Color = Form1->Color;
Form1->Canvas->Brush->Color = Form1->Color;
Form1->Canvas->Rectangle(X1-5,Y-5,X1+5,Y+5);/**/
// 使用窗体的颜色在老地方画一个正方形
Form1->Canvas->Pen->Color = EColor;
Form1->Canvas->Brush->Color = EColor;
Form1->Canvas->Rectangle(X2-5,Y-5,X2+5,Y+5);
}
...全文
232 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zz997788 2005-12-12
  • 打赏
  • 举报
回复
先谢谢季大哥,我再去试试
zz997788 2005-12-12
  • 打赏
  • 举报
回复
效果不错,谢谢季大哥。
zz997788 2005-12-06
  • 打赏
  • 举报
回复
这个问题很难吗?up
LhSky916 2005-12-06
  • 打赏
  • 举报
回复
偶没什么说的了,顶一个
jishiping 2005-12-06
  • 打赏
  • 举报
回复
要解决这儿的假死,只要在线程的循环中加上一句Sleep(1);就可以了,也就是:
void __fastcall TADcj::Execute()
{
do {
Synchronize(cj);
Sleep(1); // 加这一句代码,就切换到主线程了,主线程就有机会执行其它的代码了
}while( !Terminated );
}
jishiping 2005-12-06
  • 打赏
  • 举报
回复
首先需要说明,线程中使用Synchronize(cj);时,那么函数cj()中的代码,是由主线程来执行的,此时子线程在等待组线程执行完这个函数cj()。而你这儿的线程,除了一句Synchronize(cj);外,没有其它的代码,所以这儿使用线程,没有任何用处。你这儿线程的代码,就相当于在主线程的某个地方,不停的执行一个循环,循环中不断执行cj()这个函数。因为你这儿不停的调用cj(),程序没有时间来做其它的事情,就造成了程序的假死状态。
zz997788 2005-12-02
  • 打赏
  • 举报
回复
大家来说说嘛,分少还可以加。
空中猎手 2005-12-02
  • 打赏
  • 举报
回复
说不清,偶也关注
zz997788 2005-12-02
  • 打赏
  • 举报
回复
有人能解释一下,为什么运行线程时,有的鼠标移动也困难,有的却可以?

1,221

社区成员

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

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