netease-im / NIM_Duilib_Framework

网易云信Windows应用开发框架。
MIT License
2.08k stars 833 forks source link

RichEdit控件InsertText时,发生访问冲突 #198

Closed eternalmr closed 3 years ago

eternalmr commented 4 years ago

问题现象

我用了一个RichEdit控件作为日志显示输出框,但是输出几条日志信息后,程序就会崩溃。 大概的调用顺序:MyFun() -> MyDisplayLog() -> RichEdit::InsertText() -> RichEdit::SetSel() -> RichEdit::TxSendMessage(),在RichEdit::TxSendMessage()就会发生异常,一般提示的是msftedit.dll处引发的异常:0xC000000005: 读取位置时发生访问冲突。 我调试了过后,觉得应该不是输入参数的问题,网上查了下,说可以是内存泄漏或者线程冲突的问题导致的。不知道还有没有人碰到过这个问题,你们是怎么解决的啊?

预期结果

重现步骤

chengjianxi commented 4 years ago

试试在下面的方法中调用UI资源

Post2UI(this->ToWeakCallback([this]() {
// youFun
}));
peilinok commented 3 years ago

问题现象

我用了一个RichEdit控件作为日志显示输出框,但是输出几条日志信息后,程序就会崩溃。 大概的调用顺序:MyFun() -> MyDisplayLog() -> RichEdit::InsertText() -> RichEdit::SetSel() -> RichEdit::TxSendMessage(),在RichEdit::TxSendMessage()就会发生异常,一般提示的是msftedit.dll处引发的异常:0xC000000005: 读取位置时发生访问冲突。 我调试了过后,觉得应该不是输入参数的问题,网上查了下,说可以是内存泄漏或者线程冲突的问题导致的。不知道还有没有人碰到过这个问题,你们是怎么解决的啊?

预期结果

重现步骤

这边也是,做了个安装包界面插件,输出一些日志,基本上是必崩的。 请问有解决或者相关方案吗? post2ui用了仍然崩溃

fengshen4399 commented 3 years ago

问题现象

。我用了一个的RichEdit控件作为日志显示输出框,但是输出几条日志信息后,就会程序崩溃 大概的调用顺序:MyFun() - > MyDisplayLog() - >的RichEdit :: InsertText() - >的RichEdit: :SetSel()-> RichEdit :: TxSendMessage(),在RichEdit :: TxSendMessage()会发生异常,一般提示的是msftedit.dll处引发的异常:0xC000000005:读取位置时发生访问冲突。 我调试了过后,觉得应该不是输入参数的问题,网上查了下,说可以是内存泄漏或线程冲突的问题导致的。不知道还有没有人碰到过这个问题,你们是怎么解决的啊?

预期结果

重现步骤

这边也是,做成一个安装包界面插件,输出一些日志,基本上是必崩的。请问 有解决或相关方案吗? post2ui用了仍然崩溃

使用线程互斥锁尝试一下 如果没有问题请答复

peilinok commented 3 years ago

问题现象

。我用了一个的RichEdit控件作为日志显示输出框,但是输出几条日志信息后,就会程序崩溃 大概的调用顺序:MyFun() - > MyDisplayLog() - >的RichEdit :: InsertText() - >的RichEdit: :SetSel()-> RichEdit :: TxSendMessage(),在RichEdit :: TxSendMessage()会发生异常,一般提示的是msftedit.dll处引发的异常:0xC000000005:读取位置时发生访问冲突。 我调试了过后,觉得应该不是输入参数的问题,网上查了下,说可以是内存泄漏或线程冲突的问题导致的。不知道还有没有人碰到过这个问题,你们是怎么解决的啊?

预期结果

重现步骤

这边也是,做成一个安装包界面插件,输出一些日志,基本上是必崩的。请问 有解决或相关方案吗? post2ui用了仍然崩溃

使用线程互斥锁尝试一下 如果没有问题请答复

试了没用。。。

peilinok commented 3 years ago

尝试了下在RichEdit中所有访问CTxtWinHost的地方加锁,目前看起来可以了

eternalmr commented 3 years ago

尝试了下在RichEdit中所有访问CTxtWinHost的地方加锁,目前看起来可以了

我开始也是在多个线程中调用RichEdit的,但是会有随机的小概率发生访问冲突,从而导致上述问题。后来,我干脆把所有的跟RichEdit相关的更新都放在一个线程中处理,好像就没有问题了

fengshen4399 commented 3 years ago

操作UI应该放在一个线程里面操作 防止多线程冲突

eternalmr commented 3 years ago

操作UI应该放在一个线程里面操作 防止多线程冲突

是的,这也是我最后总结出的经验。必须掉进这个坑里了,才知道这是一个坑......

peilinok commented 3 years ago

已经解决,其实一直有用Posttask将操作挂到UI线程中,回头仔细看了一下。。。。在最早的APP注册线程的时候,注册错了,感谢诸位

fengshen4399 commented 3 years ago

有没有在学习的,带带弟弟