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

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;
}

这样有问题吗?能否从消息处理中转跳到消息处理外的内容?

宝慕林4294392
浏览 296回答 2
2回答

慕斯709654

有问题的goto就这个语句处理来看,可以这么执行,但是你这样做,是有风险的。你的代码缺的太多,但是大体看了一下,CALLBACK WndProc这是一个回调,它的调用源位于一个线程,假设叫A,那么实际上从内部的调度机制来看,CALLBACK WndProc这个回调函数当前是运行在线程A上的。而此时你直接goto到asd: 这个地方,如果asd运行于另一个线程(并且一般回调的调用源和定义源往往不在一起,所以这种可能性很大),假设叫B,那么会出现一些风险:如果B优先级大于A,会造成调度发生,A被强制挂起如果B优先级等于A,会造成调度发生,调度内部会进行时间片轮循如果B优先级小于A,线程B会进入Active栈所以,不建议这么做

哔哔one

当左键按下去 要返回消息循环去确认左键按下是是点的哪儿是PAINT还是DESTROY 我是这样想的 因为这里面还有没有寄存鼠标当前位置的的那个参数
打开App,查看更多内容
随时随地看视频慕课网APP