Comments (3)
WebSocketClient 是随手写的玩意,代码乱的我自己都看不懂了。
我检查了下,应该不会有这种问题。
在 WebSocketClient 库里,每到调用 LostConnectionCallback 的分支,都会跟着 break;
(这个 break 看起来应该改成 return? ) 或者 return;
。这就意味着,LostConnectionCallback 返回之后,逻辑上保证了 RecvLoop 也会返回(所以不会因为检测到 WebSocketClient::Status 再次变成 Open 就没法退出了,根本没有检测了,直接break或者return了 )。所以在这个库的 LostConnectionCallback 里调用 Connect 是安全的。
在 mirai-cpp 里,好像真的会有大问题。每次执行 MiraiBot::Connect 都会销毁掉原来的 pimpl 对象。pimpl 对象里包含一个 WebSocketClient 对象。但是此时这个对象的 WebSocketClient::LostConnectionCallback 还在执行 MiraiBot::Connect。
有点绕,大概就是自己销毁了自己。(应该不会导致程序崩溃,因为 WebSocketClient::LostConnectionCallback 是在一条 detached 线程(WebSocketClient::RecvLoop所在的线程)里执行的,但是这个线程的 thread 对象肯定是被析构了)
如果执行 MiraiBot::Reconnect,应该不会有问题,因为它只是重新验证,并执行 WebSocketClient::Connect(前面提到在 WebSocketClient::LostConnectionCallback 里调用 WebSocketClient::Connect 是安全的)。
当初这么搞,是我不想创建那么多线程,因为有了多线程就要处理更多的细节😢。创建新线程执行 LostConnectionCallback 可能是最容易的方法?但是我不知道会不会引入新的问题(如果有人知道,可以直接告诉我吗,省得我去查资料了,手动滑稽)。
现在这些代码的逻辑很绕,但是我多线程编程经验极少,还不知道该怎么处理这些问题,可能需要再学习一下才能搞定它。
from mirai-cpp.
好的,谢谢大佬回复。我自己这块也不是很熟😂得再多看看学习学习了。
(另外您的WebsocketClient库我觉得写的挺好的,轻量级Client侧应用完全够了,之前试图用websocketpp库发现完全搞不懂(什
from mirai-cpp.
好像找到了问题所在:Mirai Console在执行exit后很短一段时间内仍然可以调用wsClient->Connect连接成功,但在执行RecvLoop时又会立马报错回调LostConnectionCallback返回。我因为多加了几个throw catch所以之前负责调用Reconnect的那个LostConnectionCallback同样会因为RecvLoop的问题而试图重新连接,从而导致同时有两个Callback在跑(我以为是之前的RecvLoop没退出导致的😂)
感觉解决办法就是LostConnectionCallback调用Reconnect前先用SleepSeconds等待一段时间直到服务端确定完全关闭了再试图重新连接。另外我在MiraiBot::Connect里的OnLostConnection中把直接执行回掉函数改成了
pmem->threadPool->enqueue([&](){ this->lostConnectionCallback(result);});
感觉好像只要不在回调函数里调用MiraiBot::Connect销毁旧的pmem应该就不会出事(全代码好像就这里会销毁pimpl对象x)
(好像问了一个XY问题,爬了x
from mirai-cpp.
Related Issues (20)
- 发送语音消息时VoiceMessage::length_未初始化导致mirai-api-http可能返回400
- websocket 连接正常,但是无法触发事件处理函数 HOT 11
- 希望能给GroupMessage添加一个GroupId HOT 2
- 新增一系列无异常的 Try* 模式的接口
- 目前的项目在使用mirai-cpp,可否在readme做下推广呢? HOT 1
- 关于MessageChain == 比较的问题 [Bug?] HOT 1
- 更新cpp-httplib以保证线程安全 HOT 1
- 拼写错误,解析json失败 HOT 1
- 将 const std::string& 替换为 std::string_view 以简化代码
- 在使用httplib::Client时出现错误 HOT 6
- 有时QQ客户端收不到消息 HOT 2
- 有关VoiceMessage的问题 HOT 2
- Command.Member->Group.GID 可能为空 HOT 3
- MFC开发 HOT 1
- 分享一个非常蒻的Bot HOT 1
- 关于VoiceMessage.Url() HOT 3
- 关于MessageChain().Add<VoiceMessage>(); HOT 9
- 无法上传文件 HOT 3
- mirai-cpp-template的main函数中的端口设置似乎不起作用
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from mirai-cpp.