为什么线程不运行???

vbcrack 2007-08-31 04:37:54
在窗体1(Form1)建立新线程:
TDrawThread *pdraw=new TDrawThread(false);

在TDrawThread内执行
void __fastcall TDrawThread::Execute()
{
//---- Place thread code here ----
do
{
Synchronize(draw);
}while(!Terminated);
}
void __fastcall TDrawThread::draw()
{
i++;
Form1->Edit1->Text=i;
}

在不点击窗体1的标题栏和拖拉窗体1的标题栏时,线程运行正常(Form1->Edit1的内容在变化),但点击或拖拉标题栏时,线程TDrawThread好像就没有运行了(Form1->Edit1的内容无变化),请问有遇到相似情况的吗??该怎么解决呢???

请达人指教一下,困扰我很久了阿!
...全文
177 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Waiting4you 2007-09-05
  • 打赏
  • 举报
回复
你的Draw后面用了Terminate();?
vbcrack 2007-09-05
  • 打赏
  • 举报
回复
怎么判断是否间接调用了ProcessMessage呢?
这个不太懂
僵哥 2007-09-04
  • 打赏
  • 举报
回复
情况有可能是在你的代码当中有间接地调用了ProcessMessage,如果是那样的话,就有可能产生问题。
vbcrack 2007-09-04
  • 打赏
  • 举报
回复
像楼上的这么写确实没有停止刷新,但我的线程代码运行怎么没有刷新呢??
Waiting4you 2007-09-04
  • 打赏
  • 举报
回复
我的代码,在XP+BCB6下测试没有问题,点击拖拉Form1的标题栏Edit1没有停止更新。

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
class TDrawThread: public TThread{

public:
__fastcall TDrawThread()
:TThread(false){;}
void __fastcall Execute(){
do{
Synchronize(draw);
}while(!Terminated);
}

void __fastcall draw(){
static i=0;
Form1->Edit1->Text=i++;
}
};
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClick(TObject *Sender)
{
static TDrawThread *pThread = NULL;

if(pThread == NULL)
{
pThread = new TDrawThread;
}
else
{
pThread->Terminate();
pThread->WaitFor();
delete pThread;
pThread = NULL;
}
}
//---------------------------------------------------------------------------

vbcrack 2007-09-04
  • 打赏
  • 举报
回复
线程源代码:

//---------------------------------------------------------------------------
//功能:在指定的窗体的Image控件上绘制功率图,在Chart上绘制频谱图
//时间: 2007-07-03
//参数:提供创建位图的长,宽,绘制的高度,绘制门限,通过全局变量g_GetNum[]获得数据
//编写:chdybl
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Draw.h"
#include "main.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------

// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall TDrawThread::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//---------------------------------------------------------------------------

__fastcall TDrawThread::TDrawThread(int w,int h,float limit,int rule,int limity,bool CreateSuspended)
: TThread(CreateSuspended)
{
Dest_Width=w;
Dest_Height=h;
Dest_limit=limit;
Dest_Rulex=rule;
Dest_Limity=limity;

}
//---------------------------------------------------------------------------
void __fastcall TDrawThread::Execute()
{
//---- Place thread code here ----
do
{
Synchronize(Draw);
}while(!Terminated);
}
//---------------------------------------------------------------------------
void __fastcall TDrawThread::Draw()
{
TPoint points[WB_DRAW_LEN];
temp+=1;
Form1->Label13->Caption=temp;
//Water
if(g_ShowPause==false)
{
buffBmp->Canvas->CopyRect(Rect(0,1,buffBmp->Width, buffBmp->Height),buffBmp->Canvas,Rect(0,0,buffBmp->Width, buffBmp->Height-1));
for(int i=0;i<Dest_Width;i++)
{

if(DrawData[i]>Dest_limit)
{
// Form1->Edit10->Text=FloatToStr(DrawData[i]);
if(DrawData[i]>=-75) //跟定标有关
buffBmp->Canvas->Pixels[i][0]=RGB(255-510*abs(DrawData[i])/150,510*abs(DrawData[i])/150,0);

else
buffBmp->Canvas->Pixels[i][0]=RGB(0,510-510*abs(DrawData[i])/150,510*abs(DrawData[i])/150-255);
}
else
buffBmp->Canvas->Pixels[i][0]=RGB(0,0,0);
}
}
else
{
buffBmp->Canvas->CopyRect(Rect(0,0,buffBmp->Width, buffBmp->Height-1),buffBmp->Canvas,Rect(0,0,buffBmp->Width, buffBmp->Height-1));
for(int i=0;i<Dest_Width;i++)
{
buffBmp->Canvas->Pixels[i][0]=RGB(0,0,0);

}
}

//Spec


float keduy=(float)Form1->PaintBoxSpec->Height/RULE_SUM;
Bmp->Canvas->Brush->Color=clBlack;
Bmp->Canvas->FillRect(Rect(0,0,Bmp->Width,Bmp->Height));
for(int i=0;i<Dest_Width;i++)
{
points[i].x=i;
points[i].y=-DrawData[i]*keduy;

}
Bmp->Canvas->Pen->Color=clGreen;
Bmp->Canvas->Polyline(points,Dest_Width-1);
//清除数据
for(int i=0;i<WB_LEN;i++)
GetNum[i]=0;
//显示图形

if(g_ShowPause==false)
{
Form1->PaintBoxWater->Canvas->Draw(0,0,buffBmp);
//Form1->PaintBoxWater->Canvas->Brush->Bitmap=buffBmp;
//Form1->PaintBoxWater->Canvas->FillRect(Rect(0,0,Form1->PaintBoxWater->Width,Form1->PaintBoxWater->Height));
Form1->PaintBoxWater->Canvas->MoveTo(Dest_Rulex,0);
Form1->PaintBoxWater->Canvas->LineTo(Dest_Rulex,Dest_Height);
}

Form1->PaintBoxSpec->Canvas->Draw(0,0,Bmp);
Form1->PaintBoxSpec->Canvas->Pen->Color=clYellow;
Form1->PaintBoxSpec->Canvas->MoveTo(Dest_Rulex,0);
Form1->PaintBoxSpec->Canvas->LineTo(Dest_Rulex,Form1->PaintBoxSpec->Height);
Form1->PaintBoxSpec->Canvas->Pen->Color=clRed;
Form1->PaintBoxSpec->Canvas->MoveTo(0,Dest_Limity);
Form1->PaintBoxSpec->Canvas->LineTo(Form1->PaintBoxSpec->Width,Dest_Limity);
if(g_blnZoom==1)
{
Form1->PaintBoxWater->Canvas->Brush->Style=bsClear;
Form1->PaintBoxWater->Canvas->Rectangle(g_orgx,g_orgy,g_destx,g_desty);
}
else if(g_blnZoom==2)
{
Form1->PaintBoxSpec->Canvas->Brush->Style=bsClear;
Form1->PaintBoxSpec->Canvas->Rectangle(g_orgx,g_orgy,g_destx,g_desty);
}

Terminate();
}





僵哥 2007-09-03
  • 打赏
  • 举报
回复
先用任务管理器看一下你的进程当中有多少线程(在创建前和创建后都看一下)。
pig4210 2007-09-03
  • 打赏
  • 举报
回复
错了,动态图片不属于这个原因,我搞错了。
pig4210 2007-09-03
  • 打赏
  • 举报
回复
edit在窗口NC区被单击或拖动时应该是不会变化的,这貌似是Windows的重绘机制,当窗口位置变化完毕后才重绘窗口。
验证这个问题,你移动一下窗口,停。
1.看edit的内容是否增加了很多,如果是,说明线程有作用一直在运行,只不过Windows并没有及时重绘内容罢了。
2.如果edit的内容在窗口移动后仍然从窗口移动前的值接着开始计算,这才是线程暂停。
3.如果移动窗口后edit值不再变化,则是线程停止

其实这样的情况是,你打开一个有动态图片的网页,当你移动窗口时,动态图片会暂停动态变化的。
wanglovec 2007-09-03
  • 打赏
  • 举报
回复
从代码上看不出原因, 应该没有问题, 1 可能是线程的优先级的问题 2 windows重绘方面的问题

僵哥 2007-09-03
  • 打赏
  • 举报
回复
这个程序本身没有问题呀。最好贴出代码来,特别是那个线程实例被创建之后,是否有立即被释放掉,即Free/delete掉.
vbcrack 2007-09-03
  • 打赏
  • 举报
回复
不知道有谁解决过类似的问题???
望能者指教
vbcrack 2007-09-03
  • 打赏
  • 举报
回复
to unsigned :用任务管理器看了,线程是创建成功,
vbcrack 2007-09-03
  • 打赏
  • 举报
回复
to unsigned :线程创建后没有被释放;
to pig4210:属于你说的第一种情况;

由于代码比较乱,整理后发上来
jacknes009 2007-09-02
  • 打赏
  • 举报
回复
我也碰到过这样的情况哦,我感觉上程序好象停止任何操作哦,准备重新绘制,但可能有其他原因哦.
vbcrack 2007-09-02
  • 打赏
  • 举报
回复
还是没有变化
我感觉应该是线程已经启动了,但是没有运行

请高手指点一下,谢谢!
Waiting4you 2007-08-31
  • 打赏
  • 举报
回复
试试这样:
void __fastcall TDrawThread::draw()
{
i++;
Form1->Edit1->Text=i;
Form1->Edit1->Repaint();
}

13,825

社区成员

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

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