为了账号安全,请及时绑定邮箱和手机立即绑定

关于在VC++中的goto的问题。请看下面的例子

关于在VC++中的goto的问题。请看下面的例子

Go C
宝慕林4294392 2021-09-14 11:07:44
asd://这儿有一段代码……LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){PAINTSTRUCT ps;HDC hdc;switch (message){case WM_PAINT://内容省略break;case WM_DESTROY://内容省略break;case WM_LBUTTONDOWN://内容省略goto asd;break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;}这样有问题吗?能否从消息处理中转跳到消息处理外的内容?
查看完整描述

2 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

有问题的

goto就这个语句处理来看,可以这么执行,但是你这样做,是有风险的。

你的代码缺的太多,但是大体看了一下,
CALLBACK WndProc这是一个回调,
它的调用源位于一个线程,假设叫A,那么实际上从内部的调度机制来看,
CALLBACK WndProc这个回调函数当前是运行在线程A上的。

而此时你直接goto到asd: 这个地方,
如果asd运行于另一个线程(并且一般回调的调用源和定义源往往不在一起,所以这种可能性很大),假设叫B,那么会出现一些风险:
如果B优先级大于A,会造成调度发生,A被强制挂起
如果B优先级等于A,会造成调度发生,调度内部会进行时间片轮循
如果B优先级小于A,线程B会进入Active栈

所以,不建议这么做

查看完整回答
反对 回复 2021-09-23
?
哔哔one

TA贡献1854条经验 获得超8个赞

当左键按下去 要返回消息循环去确认左键按下是是点的哪儿是PAINT还是DESTROY 我是这样想的 因为这里面还有没有寄存鼠标当前位置的的那个参数

查看完整回答
反对 回复 2021-09-23
  • 2 回答
  • 0 关注
  • 295 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信