C++ wxWidgets wxThread可连接线程的删除
我有一个关于wxWidgets中可连接线程的问题 当用户需要它时,我想停止一个线程做一些工作。因此,我调用这个工作线程TestDestroy()来检查该线程是否应该停止。但是我只能通过调用Delete()来停止线程,对于可连接的线程不应该调用Delete() 我是否有可能停止线程(使用TestDestroy)或者必须完全更改代码 提前感谢,C++ wxWidgets wxThread可连接线程的删除,c++,multithreading,wxwidgets,C++,Multithreading,Wxwidgets,我有一个关于wxWidgets中可连接线程的问题 当用户需要它时,我想停止一个线程做一些工作。因此,我调用这个工作线程TestDestroy()来检查该线程是否应该停止。但是我只能通过调用Delete()来停止线程,对于可连接的线程不应该调用Delete() 我是否有可能停止线程(使用TestDestroy)或者必须完全更改代码 提前感谢, TiBo您不应该重写代码 正如文档所示,通常最好是线程通过从其主函数返回来终止 实现这一点的一种方法,可能是最简单的方法,就是抛出一些将在主线程函数中捕获的
TiBo您不应该重写代码 正如文档所示,通常最好是线程通过从其主函数返回来终止 实现这一点的一种方法,可能是最简单的方法,就是抛出一些将在主线程函数中捕获的对象 例如:
struct ThreadEndingException { };
void DoSomeWork() {
...
if (TestDestroy())
throw ThreadEndingException();
...
}
void ThreadFunction() {
try {
DoSomeWork();
}
catch (const ThreadEndingException&) {
// Do nothing, the function will return after leaving this catch.
}
}
当前的文档说明: 此函数适用于可接合线程,但在这种情况下,会使线程的TestDestroy()函数返回true,然后等待其完成(即,它不同于Wait(),因为它要求线程在等待之前终止) 因此,您似乎可以在可连接线程上使用
Delete()
。您必须从工作线程调用Exit()方法,或者从Run方法返回并调用MyThread->Wait()方法,然后删除线程对象
声明线程:
class MyThread : public wxThread {
virtual void * run();
};
线程实现:
MyThread::run()
{
while(1)
{
if(TestDestroy())
{
this.Exit(); // or return;
}
// Do some work
}
}
声明线程指针:
MyThread * pMyThread;
创建、启动和停止线程
void launchThread{
pMyThread = new wxThread(wxTHREAD_JOINABLE);
pMyThread->Create();
pMyThread->Run();
}
void stopThread(){
pMyThread->Delete();
pMyThread->Wait();
delete pMyThread;
}
希望它能有所帮助
这是我关于堆栈溢出的第一个答案。我不知道如何轻松地编写一些自动缩进的代码?谢谢您的回答;但我遇到的问题是,我不知道如何设置“TestDestroy()-标志”。似乎只可能使用Delete(),但正如纪录片中所说,可连接线程不应该使用Delete()。。我相信在可连接线程上调用
Delete()
会导致它等待线程退出,因此在stopThread()
中的Delete()
之后不需要wait()
。Wait()
可能只是优雅地返回,但它是多余的,尽管我没有测试您的代码。不,它会告诉线程删除。唯一的问题是TestDestroy()将返回true,然后线程应该退出()。稍后,您必须从调用线程调用Wait()(以释放“它使用的系统资源”),然后您可以删除运行该线程的对象。哦,是的。。只是最新的稳定文档说,您不应该在可连接的线程上执行此操作:(文档中说不要使用delete操作符,即delete m_-thread
,但您始终可以使用m_-thread->delete()