目录
1.通过设置共享退出标记
定义一个退出变量bool stop = false;
表示线程是否应该停止。在主线程中设置标记stop=true,然后join一直等待,然后线程循环检测到stop是否为true,为true则表示线程该退出了。示例代码如下:
IThread.h
#ifndef _I_THREAD_H_
#define _I_THREAD_H_
#include "LinkGlobal.h"
#include <Thread>
#include <memory>
LINK_CORE_NAMESPACE_BEGIN
class IThread
{
public:
explicit IThread();
virtual ~IThread() = default;
public:
void start();
void join();
protected:
virtual void run() = 0;
private:
std::unique_ptr<std::thread> m_thread;
bool m_bStarted;
};
LINK_CORE_NAMESPACE_END
#endif
IThread.cpp
#include "IThread.h"
LINK_CORE_NAMESPACE_BEGIN
IThread::IThread()
:m_bStarted(false)
, m_thread(nullptr)
{
}
void IThread::start()
{
if (m_bStarted) {
join();
return;
}
m_thread.reset(new std::thread(&IThread::run, this));
m_bStarted = true;
}
void IThread::join()
{
if (m_bStarted && m_thread) {
if (m_thread->joinable()) {
m_thread->join();
}
}
m_bStarted = false;
}
LINK_CORE_NAMESPACE_END
QueryDataCmdThread.h
#pragma once
#include "IThread.h"
#include "DataType.h"
#include <string>
#include <QByteArray>
using namespace xyLinkCore;
class CQueryDataCmdThread : public IThread
{
public:
CQueryDataCmdThread (PUInt64 chaissID, PUInt64 signalID);
virtual ~CQueryDataCmdThread ();
public:
int start();
int stop();
private:
void run() override;
void sendQueryCmd();
void encodeDa