[20160216] 自带中断点的线程模型

本文介绍了一种尝试解决C++标准线程无法在运行时被其他线程强制结束的问题的方法。通过创建自定义线程管理类procx,并利用宏定义来支持线程的取消操作。但目前该实现仍存在问题,尤其是在模板和变长参数方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于std::thread无法在运行时被其他线程强制结束, 鉴于业务需要,不得不拐弯抹角换一种新方式来实现。于是今天写了点关于这个的代码

(然而仍然存在一些问题)

class procx /** HC TECH : MutableThread Version 0.1 ( build 1 , 20160216 )*/
{
public:
    procx(auto a)
    {
        func=a;
        cancel=false;
        done=false;
        status_code=0;
        s=nullptr;
    }
    ~procx()
    {
        delete s;
    }
    template <typename ... ARG>
    void start(ARG ... arg)
    {
        s=new std::thread(func,arg...);
    }
    void join()
    {
        if(s!=nullptr&&s->joinable())
        {
            s->join();
        }
    }
    void detach()
    {
        if(s!=nullptr&&s->joinable())
        {
            s->detach();
        }
    }
    bool isdone()
    {
        return done;
    }
    bool iscanceled()
    {
        return cancel;
    }
    int getcancelcode()
    {
        return status_code;
    }
    /// return: true : Thread is canceled. false: Thread is over. else will be blocked.
    bool trycancel()
    {
        cancel=true;
        join();
        return done;
    }
private:
    void* func;
    std::thread* s;
    bool cancel;
    bool done;
    int status_code;
};

procx类就是一个线程管理的类。

如果一个线程函数希望能够被cancel,那么这个方法在编写时需要使用如下的宏定义

#define DECLX bool* doneflag,bool* cancelflag,int* _hc_status_code
#define SETUNDONE *doneflag=false;
#define SETDONE *doneflag=true;
#define CANCELPOINT(x) if(*cancelflag){*_hc_status_code=x;return;}

一个比较正规的写法如下

void proc_a(DECLX,int* ret)
{
    SETUNDONE
    CANCELPOINT(1);
    SETDONE
}

如果整个代码能够工作,那么使用方法应该是这样的

int main()
{
    int ret=0;
    procx s(proc_a,&ret);
    /// Start Job "s"
    s.start();
    /// Try to cancel Job "s"
    s.trycancel();
}


然而目前还是无法通过编译,看来通过C++模板方式支持函数参数转发,变长参数这些知识我还是掌握的不太好。继续努力!


### 解决 PyCharm 运行深度学习模型时程序闪退的方法 当遇到 PyCharm 运行深度学习模型时发生闪退的情况,通常是因为存在未捕获的异常或内存访问冲突等问题。针对此类问题,建议采取以下措施: 对于特定于 PyQt 和 PyTorch 的集成场景,在执行图像预测并显示结果的过程中遇到了错误代码 `-1073741819 (0xC0000005)`,这表明可能存在非法内存访问的问题[^4]。 为了防止这种情况的发生,可以在加载图片以及将其传递给模型之前确保所有的数据都处于预期的状态,并且在处理完图像之后再进行界面更新操作前加入短暂延时以稳定UI线程。具体实现如下所示: ```python import time from PIL import Image, ImageQt from PyQt5.QtGui import QPixmap img = Image.open(self.fname) img = img.convert('RGB') self.pred = self.model.detect_image(img) # 将PIL图像转换为适合PyQt使用的格式 self.pred_qt = ImageQt.ImageQt(self.pred) pixmap = QPixmap.fromImage(self.pred_qt) time.sleep(1) # 延迟一秒让界面有时间刷新 self.label.setPixmap(pixmap) self.label.setScaledContents(True) ``` 此外,如果仍然存在问题,则应考虑增加更多的调试信息以便更好地定位问题所在。可以通过设置断点逐步跟踪变量的变化情况;也可以利用 Python 自带的日志模块 `logging` 来记录重要事件日志,从而帮助排查潜在隐患。 最后值得注意的是,使用 Anaconda 创建独立的虚拟环境来进行开发和部署是非常推荐的做法,这样可以有效避免不同项目之间的依赖关系相互干扰[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值