//---------------------------------------------------------------------------
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 );
}
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 );
}
void __fastcall TADcj::Execute()
{
do {
Synchronize(cj);
Sleep(1); // 加这一句代码,就切换到主线程了,主线程就有机会执行其它的代码了
}while( !Terminated );
}
#7
偶没什么说的了,顶一个
#8
先谢谢季大哥,我再去试试
#9
效果不错,谢谢季大哥。