这样用不用线程好像没什么区别!?

toney2002 2004-09-22 02:44:38
熟悉线程的朋友帮忙看看吧:

__fastcall TTest::TTest(bool CreateSuspended):TThread(CreateSuspended)
{

}

void __fastcall TTest::Execute()
{
Sleep(200);
Synchronize((TThreadMethod)&SpeedTest);
}

void __fastcall TTest::SetID(int value)
{
nID=value;
}
int __fastcall TTest::GetID()
{
return(nID);
}
void __fastcall TTest::SpeedTest(void)
{
Form1->Label1->Caption =IntToStr(ID);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender){
TTest *test;
TList *tt=new TList;

int tIndex=0;
for(int j=0;j<10;j++)
{
test=new TTest(false);
tt->Add(test);
}

for(int i=10;i<30;i++)
{
test=(TTest*)tt->Items[tIndex];
test->ID =i;
test->Execute();
Application->ProcessMessages();
tIndex++;
if(tIndex>9)tIndex=0;
}
ShowMessage("end!");
}
...全文
107 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
toney2002 2004-09-24
  • 打赏
  • 举报
回复
十分感谢各位的帮忙! 结帐了
jishiping 2004-09-22
  • 打赏
  • 举报
回复
Synchronize((TThreadMethod)&SpeedTest);
这儿使用Synchronize,那么函数SpeedTest的代码,实际上是在主线程中执行的,所以于没有使用
线程的效果基本一样,也就失去了线程的意义。仅仅当线程需要访问程序界面上的VCL可视化控件时
猜需要使用Synchronize。但是我的意思不是说整个线程的代码全部使用Synchronize,而只是线程
需要访问VCL的可视化控件时才使用Synchronize,其它代码仍然放在线程的Execute函数中执行。比
如,线程执行循环,在每一次循环时需要更新界面上的一个Label的Caption,那么可以这样写:
void __fastcall MyThread :: Execute()
{
while(1) {
//这儿是你的其它代码

Synchronize(UpdateLabel);
}
}

void __fastcall MyThread :: UpdateLabel()
{
Form1->Label1->Caption = xxx; //更新Form1上面的Label1的Caption
}
toney2002 2004-09-22
  • 打赏
  • 举报
回复
怎么我定义的 TThread 没有 FreeOnTerminate 属性呢?
jiangchun_xn 2004-09-22
  • 打赏
  • 举报
回复
楼上已经说得很清楚了,TThread类的构造函数的第一个参数表示生成后是否执行,当设置为执行后,所以Execute可能导致重入。


但 new 出来以后要不要 delete 释放资源呢?
//你可以delete,也可以使用FreeOnTerminate=true;来让其自动释放/

这样如何控制线程的数量呢
//方法很多,仅仅对Thread对象的话,任何一种对象技术的方法都能用,比如最简单的static变量
toney2002 2004-09-22
  • 打赏
  • 举报
回复
为什么new 出来以后,再次 Execute() 就不一样了呢?

就是要 new 的时候的那种执行效果

但 new 出来以后要不要 delete 释放资源呢?

这样如何控制线程的数量呢?
happyct 2004-09-22
  • 打赏
  • 举报
回复
TTest *Threads[100];
for(int i = 0; i < 100; i++)
Threads[i] = new TTest(false);
不需要在Execute()了 。因为用了new TTest(false); //false直接运行,true挂起
toney2002 2004-09-22
  • 打赏
  • 举报
回复
是的,这段代码只是为了说明问题,
不是说 new 出来多个 TThread 就是多线程了吗?

但按上面的代码,在 test->Execute(); 时, Button1Click() 中的循环要等 Execute() 完了才继续运行. Execute() 运行时,窗口处于停止响应状态啊
醉马不肖 2004-09-22
  • 打赏
  • 举报
回复
test->Execute();
如果它执行起来费时,就需要多线程,就这个程序来这样足以
sczyq 2004-09-22
  • 打赏
  • 举报
回复
程序很简单,好象只是为了说明问题,又不用花机器的多少运行时间,

13,822

社区成员

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

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