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栈
所以,不建议这么做
- 2 回答
- 0 关注
- 295 浏览
添加回答
举报
0/150
提交
取消