首页 新闻 会员 周边 捐助

sleep的问题

0
悬赏园豆:20 [已解决问题] 解决于 2014-06-26 09:36

我在某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);
}

Jingle Guo的主页 Jingle Guo | 初学一级 | 园豆:134
提问于:2014-06-25 16:21
< >
分享
最佳答案
0

调用 _beginthreadex(NULL, 0, runthread, NULL, 0, &TaskthreadId) 后,runthread 执行了吗?

收获园豆:20
Launcher | 高人七级 |园豆:45050 | 2014-06-25 16:31

执行了

Jingle Guo | 园豆:134 (初学一级) | 2014-06-25 16:32

@Jingle Guo: 那你为什么说:但是runthread这个线程却并不能够运行

到底是执行了,还是没执行?

Launcher | 园豆:45050 (高人七级) | 2014-06-25 16:34

@Launcher: 调用beginthread执行线程了。

然后点stop按钮,运行后面的代码里面的sleep,想把时间片还给runthread线程,但是虽然sleep了,runthread线程却没法执行了

Jingle Guo | 园豆:134 (初学一级) | 2014-06-25 16:39

@Jingle Guo: 把你的 runthread 改成这样,然后告诉我运行结果:

static unsigned __stdcall runthread(void * p)

{

    Sleep(5000);

    IsRunning = TRUE;

}

Launcher | 园豆:45050 (高人七级) | 2014-06-25 16:52

@Launcher: 你理解错我的问题了吧,这样runthread运行完不就退出了吗?

Jingle Guo | 园豆:134 (初学一级) | 2014-06-25 17:06

@Jingle Guo: 你理解错我的回答了,你告诉说点stop后阻塞了 runthread 的运行,因此我让你测试下,用这个简单回调函数,当你 _beginthreadex 后,立即点  stop,你看看 runthread 会运行不?

因为我没看过你的代码,我只能告诉你用什么代码来测试,然后根据你的反馈,我来猜你写了什么代码。

Launcher | 园豆:45050 (高人七级) | 2014-06-25 17:09

@Launcher: 我把问题补充详细了一些,大哥帮我再看看,谢谢

Jingle Guo | 园豆:134 (初学一级) | 2014-06-25 17:15

@Jingle Guo: 这也叫详细啊!

...dosomething

do 啥了?

Launcher | 园豆:45050 (高人七级) | 2014-06-25 17:17

@Launcher: dosomething里面没有做什么会影响主线程的事情啊,可以忽略。主要就是按照设想stop之后,会sleep直到将那子线程里面的20次OutputDebugString(L"do job");输出完的,但是sleep后不再继续执行子线程了,导致没法执行完20次OutputDebugString(L"do job");而一直的反复sleep

Jingle Guo | 园豆:134 (初学一级) | 2014-06-25 17:25

@Jingle Guo: 你把 doshomehing 的代码贴出来,由我来判断。

或者你来告诉我,你通过什么来判断出 dosomething 中的代码不会影响主线程?

Launcher | 园豆:45050 (高人七级) | 2014-06-25 17:31

@Launcher: 你说得对,是我想错了,我把dosomething改成Sleep(200);果然是会继续执行的,我先一步步试试到底哪段代码导致的阻塞看看,谢谢

Jingle Guo | 园豆:134 (初学一级) | 2014-06-25 17:47

@Jingle Guo: 你的 dosomething 中肯定有访问 UI 控件的操作,也就是本质上使用了 SendMessage。你可以了解下 Windows 窗体程序的消息机制。

Launcher | 园豆:45050 (高人七级) | 2014-06-25 17:57

@Launcher: 高人出手果然不一般啊,确实是因为有SendMessage,解决了,万分感谢!

Jingle Guo | 园豆:134 (初学一级) | 2014-06-26 09:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册