如何用TTread的方法在线程函数里开辟新线程

zhangwuji156 2008-11-05 05:35:29
有如此一段VC代码
unsigned int mythread(void * p)
{
if(...)
{
AfxBeginThread(mythread, 0);
...
}
...
用AfxEndThread(0);
return 0;
}
那么相应的,如果在CB里做的话,当然可以用API或标准C++的_beginthread来实现,但我想知道,怎么用TMyThread::TThread的方法来实现.
因为TThread的线程函数是放在Exectue里的.
又或者先写一个函数mythread,然后将mythread放在Exectue里的里,mythread函数里写?
mythread()
{
if(...)
{
TMyThread myThread;
myThread.Resume();
}
}
这样行吗,总觉得myThread是个局部变量,出了if它已经不存在了,那这个线程怎么办?
...全文
150 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangwuji156 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jxw1987628 的回复:]
你把线程对象的FreeOnTerminate设置为true,当你的线程
Excute中代码执行完后,线程就会自动释放

如果你想用TerminateThread api来结束线程,你可以得到它的ThreadID

然后来操作!。
[/Quote]
FreeOnTerminate设置为true
是可以在线程结束的时候结束,但难道用户一定要等到线程结束才能关闭程序吗?
直接点关闭form这种情况怎么办?
jxw1987628 2008-11-06
  • 打赏
  • 举报
回复
你把线程对象的FreeOnTerminate设置为true,当你的线程
Excute中代码执行完后,线程就会自动释放

如果你想用TerminateThread api来结束线程,你可以得到它的ThreadID

然后来操作!。

zhangwuji156 2008-11-06
  • 打赏
  • 举报
回复
这就是我要问的,这种情况,怎么
Terminate myThread;
因为myThread是个局部变量,当我想close form1的时候,它已经不存在了,但这个线程还在。
我用一个全局变量externThread 来表示它,不行
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(1)
{
TMyThread *myThread = new TMyThread(true);
myThread->Resume();
externThread = new TMyThread(myThread);
}
ShowMessage("OK");
//delete myThread;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
externThread->Suspend();
externThread->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
externThread->Suspend();
}
//
jxw1987628 2008-11-06
  • 打赏
  • 举报
回复
直接关闭form,也可以结束线程啊!

线程的Excute函数如下!

void __fastcall TXXThread::Excute()
{
if(!Terminated)
{
//do what you want to do do
}
}

当你要关闭Form时 记得调用线程对象的 (比如你是TXXThread *p =new TXXThread(false) )

p->Terminate();
//这个时候就把Terminate标志置成true了

另外记得再创建线程后把它的FreeOnTerminate=true,否则你退出后还有手动释放这个thread对象!
jxw1987628 2008-11-05
  • 打赏
  • 举报
回复
你的怀疑。。。。?

首先Thread是个线程类,你用它实例化1个对象后,就创建了1个线程。

如果他不被挂起,线程对象的Excute方法里面的代码就会被执行到。

不知道你是怎么理解的?,另外这种VCL对象只能在堆上实例化,所以

TMyThread myThread; 你这种在栈上

构建实例的做法是不对的,当然你可以在某个线程对象的Excute方法中

再去创建新的线程(新的线程对象)

13,871

社区成员

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

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