我在wxWidgets中遇到了关于可连接线程的问题。
当用户想要它时,我想阻止一个线程做一些工作。出于这个原因,我调用这个工作线程TestDestroy()来检查线程是否应该被停止。但我只能通过调用Delete()来停止线程,不应该为可连接线程调用它。
我是否有可能停止线程(使用TestDestroy)或者我是否必须完全更改我的代码?
提前致谢,
TIBO
答案 0 :(得分:1)
您必须从工作线程调用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;
}
希望它有所帮助。
P.S。 :这是我在Stack Overflow上的第一个答案。我不知道怎么能自动写一些自动缩进的代码?
答案 1 :(得分:0)
您不必重写代码。
通常最好通过从主函数返回来终止线程,如文档所示。
实现这一目标的一种方法,也许是最简单的方法是抛出一些将在主线程函数中捕获的对象。
例如:
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.
}
}
答案 2 :(得分:0)
wxThread::Delete()的当前文档说:
此函数适用于可连接线程,但在这种情况下,使线程的TestDestroy()函数返回true,然后等待其完成(即它与Wait()不同,因为它要求线程在等待之前终止)。
因此,您似乎可以在可连接线程上使用Delete()
。