运行线程时死机?

时间:2022-05-15 17:40:40
我在程序运行时,用一个线程不断的读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);
}

9 个解决方案

#1


有人能解释一下,为什么运行线程时,有的鼠标移动也困难,有的却可以?

#2


说不清,偶也关注

#3


大家来说说嘛,分少还可以加。

#4


这个问题很难吗?up

#5


首先需要说明,线程中使用Synchronize(cj);时,那么函数cj()中的代码,是由主线程来执行的,此时子线程在等待组线程执行完这个函数cj()。而你这儿的线程,除了一句Synchronize(cj);外,没有其它的代码,所以这儿使用线程,没有任何用处。你这儿线程的代码,就相当于在主线程的某个地方,不停的执行一个循环,循环中不断执行cj()这个函数。因为你这儿不停的调用cj(),程序没有时间来做其它的事情,就造成了程序的假死状态。

#6


要解决这儿的假死,只要在线程的循环中加上一句Sleep(1);就可以了,也就是:
void __fastcall TADcj::Execute()
{
    do {
        Synchronize(cj);
        Sleep(1); // 加这一句代码,就切换到主线程了,主线程就有机会执行其它的代码了
    }while( !Terminated );
}

#7


偶没什么说的了,顶一个

#8


先谢谢季大哥,我再去试试

#9


效果不错,谢谢季大哥。

#1


有人能解释一下,为什么运行线程时,有的鼠标移动也困难,有的却可以?

#2


说不清,偶也关注

#3


大家来说说嘛,分少还可以加。

#4


这个问题很难吗?up

#5


首先需要说明,线程中使用Synchronize(cj);时,那么函数cj()中的代码,是由主线程来执行的,此时子线程在等待组线程执行完这个函数cj()。而你这儿的线程,除了一句Synchronize(cj);外,没有其它的代码,所以这儿使用线程,没有任何用处。你这儿线程的代码,就相当于在主线程的某个地方,不停的执行一个循环,循环中不断执行cj()这个函数。因为你这儿不停的调用cj(),程序没有时间来做其它的事情,就造成了程序的假死状态。

#6


要解决这儿的假死,只要在线程的循环中加上一句Sleep(1);就可以了,也就是:
void __fastcall TADcj::Execute()
{
    do {
        Synchronize(cj);
        Sleep(1); // 加这一句代码,就切换到主线程了,主线程就有机会执行其它的代码了
    }while( !Terminated );
}

#7


偶没什么说的了,顶一个

#8


先谢谢季大哥,我再去试试

#9


效果不错,谢谢季大哥。