我在某dialog的command事件的实现中启动了一个子线程,比如点Run按钮就执行
HANDLE TaskThrd = (HANDLE)_beginthreadex(NULL, 0, runthread, NULL, 0, &TaskthreadId);
然后在另一个command事件比如点stop按钮的实现中会检测一个值,如果值不对则sleep一会后重新检测该值。比如:
while(IsRuning){
Sleep(1000);
}
该值是在runthread子线程中进行改动的。
本来是想要保证runthread子线程中某操作完成才能stop,但是发现虽然在command事件中调用了Sleep阻塞当前线程,但是runthread这个线程却并不能够运行,
求问怎么回事啊?
runthread的内容更详细点是
while(runstate){
isruning = true;
for (int i = 0; i < 20; i++) {
OutputDebugString(L"do job");
...dosomething
}
isrunning = false;
}
现在在do job几次的时候按stop,之后就不会运行后面的do job了
stop更具体点的代码是
runstate = false;
while(IsRuning){
Sleep(1000);
}
调用 _beginthreadex(NULL, 0, runthread, NULL, 0, &TaskthreadId) 后,runthread 执行了吗?
执行了
@Jingle Guo: 那你为什么说:但是runthread这个线程却并不能够运行
到底是执行了,还是没执行?
@Launcher: 调用beginthread执行线程了。
然后点stop按钮,运行后面的代码里面的sleep,想把时间片还给runthread线程,但是虽然sleep了,runthread线程却没法执行了
@Jingle Guo: 把你的 runthread 改成这样,然后告诉我运行结果:
static unsigned __stdcall runthread(void * p)
{
Sleep(5000);
IsRunning = TRUE;
}
@Launcher: 你理解错我的问题了吧,这样runthread运行完不就退出了吗?
@Jingle Guo: 你理解错我的回答了,你告诉说点stop后阻塞了 runthread 的运行,因此我让你测试下,用这个简单回调函数,当你 _beginthreadex 后,立即点 stop,你看看 runthread 会运行不?
因为我没看过你的代码,我只能告诉你用什么代码来测试,然后根据你的反馈,我来猜你写了什么代码。
@Launcher: 我把问题补充详细了一些,大哥帮我再看看,谢谢
@Jingle Guo: 这也叫详细啊!
...dosomething
do 啥了?
@Launcher: dosomething里面没有做什么会影响主线程的事情啊,可以忽略。主要就是按照设想stop之后,会sleep直到将那子线程里面的20次OutputDebugString(L"do job");输出完的,但是sleep后不再继续执行子线程了,导致没法执行完20次OutputDebugString(L"do job");而一直的反复sleep
@Jingle Guo: 你把 doshomehing 的代码贴出来,由我来判断。
或者你来告诉我,你通过什么来判断出 dosomething 中的代码不会影响主线程?
@Launcher: 你说得对,是我想错了,我把dosomething改成Sleep(200);果然是会继续执行的,我先一步步试试到底哪段代码导致的阻塞看看,谢谢
@Jingle Guo: 你的 dosomething 中肯定有访问 UI 控件的操作,也就是本质上使用了 SendMessage。你可以了解下 Windows 窗体程序的消息机制。
@Launcher: 高人出手果然不一般啊,确实是因为有SendMessage,解决了,万分感谢!