多次调用TCanvas方法失败

zxx015 2007-12-27 05:10:33
while(1)
{
Form1->Image1->Canvas->LineTo(0,0);
Form1->Image1->Canvas->MoveTo(600,200);
Sleep(10);
}

刚开始能够正常画,运行一段时间之后就没画面了,请问是不是需要设置什么属性,谢谢
...全文
109 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cczlp 2007-12-28
  • 打赏
  • 举报
回复
这样试试, 我这里没有问题
DWORD WINAPI func(void *p)
{
Graphics::TBitmap* bitmap = new Graphics::TBitmap();
bitmap-> LoadFromFile("d:/pic/1.bmp");
while (Form1-> Image1)
{
Form1->Image1->Canvas->Lock();
Form1->Image1->Canvas->Draw(0, 0, bitmap);
Form1->Image1->Canvas->Unlock();
Sleep(100);
}
delete bitmap;
}
cczlp 2007-12-28
  • 打赏
  • 举报
回复
把bmp和bmp1挪动一下, 问题出在资源泄漏, 怀疑是TBitmap的BUG
DWORD   WINAPI   func(void   *p)
{
char pic_name[2][256];
strcpy(pic_name[0], "d:/pic/1.bmp");
strcpy(pic_name[1], "d:/pic/2.bmp");

int index = 0;

Graphics::TBitmap *bmp1 = new Graphics::TBitmap;


b = true;
while (b && Form1-> Image1)
{
Graphics::TBitmap *bmp = new Graphics::TBitmap;
bmp-> Width = Form1-> Image1-> Width;
bmp-> Height = Form1-> Image1-> Height;
index = index == 0 ? 1 : 0;

// 防止失真
SetStretchBltMode(bmp-> Canvas-> Handle, COLORONCOLOR);
//*
bmp1-> LoadFromFile(pic_name[index]);
StretchBlt(bmp-> Canvas-> Handle,
0,
0,
bmp-> Width,
bmp-> Height,
bmp1-> Canvas-> Handle,
0,
0,
bmp1-> Width,
bmp1-> Height,
SRCCOPY
);
//*/

Form1-> Image1-> Canvas-> Lock();
Form1-> Image1-> Canvas-> Draw(0, 0, bmp);
Form1-> Image1-> Canvas-> Unlock();

delete bmp;
Sleep(100);
}
delete bmp1;
}
zxx015 2007-12-28
  • 打赏
  • 举报
回复
你试按住鼠标左键,然后在image上移几下,画面又会停止。
我还是使用定时器得了。
如果能告知原因就更好了。
ydlchina 2007-12-28
  • 打赏
  • 举报
回复
兄弟给你测试了一下将 Sleep(100);
改值大点即可 Sleep(200); 测试了2分钟没问题,可能值太小要造成了死循环,还有你那个while条件改为while(1)即可
zxx015 2007-12-28
  • 打赏
  • 举报
回复

需要开一个线程。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
//
CreateThread(0,0,func,0,0,0);
}
ydlchina 2007-12-28
  • 打赏
  • 举报
回复
问一下,你上面那段代码,是否本身就有错误,我一运行就死机。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
func(this);
}
不知是否这样使用,每次运行总是死机,是否是个死循环。
zxx015 2007-12-28
  • 打赏
  • 举报
回复
加上锁还不能完全解决问题。
如果两个图片进行切换,到后来就停留在一张图片上了(可以试下下面的代码)。
使用定时器就没有该问题了,但我想知道开一个线程的话有没有办法做到。


DWORD WINAPI func(void *p)
{
char pic_name[2][256];
strcpy(pic_name[0],"d:/pic/1.bmp");
strcpy(pic_name[1],"d:/pic/2.bmp");

int index = 0;

Graphics::TBitmap *bmp = new Graphics::TBitmap;

bmp->Width = Form1->Image1->Width;
bmp->Height = Form1->Image1->Height;

b = true;
while(b && Form1->Image1)
{
Graphics::TBitmap *bmp1 = new Graphics::TBitmap;
index = index == 0 ? 1 : 0;

// 防止失真
SetStretchBltMode(bmp->Canvas->Handle,COLORONCOLOR);
//*
bmp1->LoadFromFile(pic_name[index]);
StretchBlt(bmp->Canvas->Handle,
0,
0,
bmp->Width,
bmp->Height,
bmp1->Canvas->Handle,
0,
0,
bmp1->Width,
bmp1->Height,
SRCCOPY
);
//*/

Form1->Image1->Canvas->Lock();
Form1->Image1->Canvas->Draw(0,0,bmp);
Form1->Image1->Canvas->Unlock();

delete bmp1;

Sleep(100);
}
delete bmp;
}
zxx015 2007-12-27
  • 打赏
  • 举报
回复
//如果你对窗体做鼠标点击移动等操作,就会有问题。要么等更长的时间(这个时间比较随机)。
//如果显示图片的话 效果更明显

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
DoubleBuffered = true;
}
//---------------------------------------------------------------------------

DWORD WINAPI func(void *p)
{
Graphics::TBitmap* bitmap = new Graphics::TBitmap();
while(Form1->Image1){
bitmap->LoadFromFile("d:/pic/1.bmp");
Application->ProcessMessages();
Form1->Image1->Canvas->Draw(0, 0, bitmap);
Sleep(100);
}
delete bitmap;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
//
CreateThread(0,0,func,0,0,0);
}
stherix 2007-12-27
  • 打赏
  • 举报
回复
我运行没问题 3分钟
zxx015 2007-12-27
  • 打赏
  • 举报
回复
死循环只是举个例子。
加上 Application-> ProcessMessages(); 之后还是不能解决问题。。。
cczlp 2007-12-27
  • 打赏
  • 举报
回复
好久没见到死循环了
stherix 2007-12-27
  • 打赏
  • 举报
回复
无线循环...
循环体内 Application->ProcessMessages();

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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