wxWidgets wxThread删除可连接线程
wxWidgets wxThread Delete for a Joinable Thread
我有一个关于wxWidgets中可连接线程的问题。
当用户需要它时,我想停止一个线程做一些工作。出于这个原因,我在这个工作线程中调用TestDestroy()来检查线程是否应该停止。但是我只能通过调用Delete()来停止线程,对于可接合的线程,不应该调用Delete()。
是否有可能让我停止线程(使用TestDestroy),或者我必须完全改变我的代码?
提前感谢,
提伯
wxThread::Delete()的当前文档说:
这个函数在一个可连接的线程上工作,但是在这种情况下,线程的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;
}
希望对你有帮助。
注:这是我在Stack Overflow上的第一个答案。我不知道如何编写自动缩进的代码?
你不应该重写你的代码。
正如文档所建议的那样,线程终止时最好从它的主函数返回。
实现这一点的一种方法,可能是最简单的,是抛出一些对象,这些对象将被主线程函数捕获。 例如: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.
}
}
相关文章:
- 提升 ASIO - io_service 不要等待连接到线程
- 如何在多个线程中创建 QSql数据库连接时防止名称冲突
- 如果两个线程相互依赖,则 cpp 线程连接应使用连接导致死锁
- 使来自线程的数据流对所有其他线程都可读
- 视频在唤醒其他线程时输入设备断开连接
- 正在连接的等待条件变量的线程会发生什么情况?
- 在可拆卸线程完成操作时取消分配内存
- 可中断线程类 C++11 - 遇到错误?
- 如何强制线程轮流连接到字符串?
- 将信号从工作线程类连接到控制器类 - QThreads
- 多个网络连接的线程与异步 I/O
- C++线程在完成执行后仍然"可连接()"?
- 矢量中的线程无法连接
- 如何与多个线程正确连接Wininet
- 如何线程可调用函数谁是类的方法
- 从多个线程请求连接到远程服务
- c++ 11线程不连接
- c++ 11线程是可连接的,但join()会引发异常
- C++ 提升::线程可升级互斥"try upgrade lock"?
- 一个线程可以连接多个套接字到相同的ip/端口吗?