求热心人帮忙

时间:2021-02-15 21:23:47
问题:
在我程序的主对话框里面的 某个按钮消息函数里面
AfxGetMainWnd()->BeginWaitCursor();
SetCapture();
SetTimer(109,15000,NULL);
ResumeThread(hrdHandle);
这段代码正确执行...(hrdHandle为主对话框的一个成员——线程的句柄)
而在hrdHandle的线程函数里面

p->KillTimer(109);
ReleaseCapture();
AfxGetMainWnd()->EndWaitCursor();
SuspendThread(p->hrdHandle);
这段代码不能执行(p为主对话框的this指针)
一定要等到定时器时间到了,然后执行
ReleaseCapture();
AfxGetMainWnd()->EndWaitCursor();
SuspendThread(hrdHandle);
才可以将线程挂起。。。。。

为什么不能在现成函数里面挂起我的线程,提前干掉主对话框的定时器。。。。
如果可以这样,要怎么做。。。。

跪求高手解答

24 个解决方案

#1


调整你的线程优先级到最高试下.

#2


你确定你的线程运行了吗?

#3


我的线程绝对运行了

#4


我想在我的线程函数里面挂起自己.......
并且干掉主对话框的定时器

#5


谢谢一楼二楼的

#6


跨线程界限调用MFC成员函数:
--即使是一些好像是没问题的函数,如AfxGetMainWnd,当在应用程序的主线程以外的任何地方调用它们时,它们都不会正常工作。   --摘自《MFC Windows程序设计》
MFC不是线程安全 GDI对象以及其他对象应该使用句柄而不是指针在线程之间传递

供参考^_^

#7


SetThreadPriority(hrdHandle,THREAD_PRIORITY_HIGHEST);设置了线程优先级为最高还是一回时,不能干掉定时器.照样时间一到就执行定时器函数中的代码

#8


引用 7 楼 wudeshou82666 的回复:
SetThreadPriority(hrdHandle,THREAD_PRIORITY_HIGHEST);设置了线程优先级为最高还是一回时,不能干掉定时器.照样时间一到就执行定时器函数中的代码

当需要终止定时器, 即执行KillTimer时, 先设置标志变量, 然后, 在Timer响应函数中判断这个标志变量,跳出不执行即可.

#9


引用 8 楼 yjgx007 的回复:
引用 7 楼 wudeshou82666 的回复:
SetThreadPriority(hrdHandle,THREAD_PRIORITY_HIGHEST);设置了线程优先级为最高还是一回时,不能干掉定时器.照样时间一到就执行定时器函数中的代码 
 
当需要终止定时器, 即执行KillTimer时, 先设置标志变量, 然后, 在Timer响应函数中判断这个标志变量,跳出不执行即可.

我试试吧.谢谢
顺便再问一下:
AfxGetMainWnd()->BeginWaitCursor(); 
SetCapture(); 
这两句代码是可以使程序处于忙的状态,可是当切换任务栏从新回到这个程序上面之后,虽然定时的时间没有到.可是鼠标自动回到箭头状态...为什么会这样呢....如果我想自如地来控制鼠标的状态要怎么做.

#10


为什么不能在现成函数里面挂起我的线程,提前干掉主对话框的定时器。。。。 
如果可以这样,要怎么做。。。。 
--------------------------------------------------------

既然你是要在设置定时器后,立即让另一个线程停止该定时器。那为什么非要设置这个定时器呢?

不设置定时器就不存在干掉定时器的问题,然后该挂起线程就挂起线程就好了

#11


EndWaitCursor只能在本线程中调用,你可以改成在线程中p->SendMessage(WM_TIMER, 109);

#12


引用 10 楼 coding_hello 的回复:
为什么不能在现成函数里面挂起我的线程,提前干掉主对话框的定时器。。。。 
如果可以这样,要怎么做。。。。 
-------------------------------------------------------- 

既然你是要在设置定时器后,立即让另一个线程停止该定时器。那为什么非要设置这个定时器呢? 

不设置定时器就不存在干掉定时器的问题,然后该挂起线程就挂起线程就好了

我的线程函数是查询数据库的.如果查到了就显示查到的适时的数据.如果在规定的时间里面没有查到则需要提示用户查询失败

#13


自定义一个消息
在on消息中
KillTimer(109); 
ReleaseCapture(); 
EndWaitCursor(); 
SuspendThread(hrdHandle); 

在线程中Sendmessage(hwnd,消息.......)

#14


引用 11 楼 cnzdgs 的回复:
EndWaitCursor只能在本线程中调用,你可以改成在线程中p->SendMessage(WM_TIMER, 109);

问老师:
这样只是发送一个消息到主线程吧...
并没有kill掉定时器.那样时间到了,同样会执行定时器响应函数里面的代码.
.............................................................
我现在想得到的效果是启动我的查询线程以后程序处于忙的状态,同时设置定时器...
然后在数据库中查到相关数据,则干掉定时器.提示用户查询的结果.并挂起查询线程
如果在规定时间内没有查到数据,则提示用户操作失败,同样也挂起线程......
..............................................................

#15


引用 13 楼 dirdirdir3 的回复:
自定义一个消息 
在on消息中 
KillTimer(109); 
ReleaseCapture(); 
EndWaitCursor(); 
SuspendThread(hrdHandle); 

在线程中Sendmessage(hwnd,消息.......) 


这个是一个方法
谢谢
可是我想知道为什么不能在我的线程函数里面干掉我的定时器.要怎么样提前干掉......
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
AfxGetMainWnd()->BeginWaitCursor(); 
SetCapture(); 
这两句代码是可以使程序处于忙的状态,可是当切换任务栏从新回到这个程序上面之后,虽然定时的时间没有到.可是鼠标自动回到箭头状态...为什么会这样呢....如果我想自如地来控制鼠标的状态要怎么做. 

#16


顶上,搞定后马上结帖啊
王老师下线了????

#17


如果不需要再定时,当然要KillTimer了,可以在线程中执行,也可以在OnTimer中执行。

#18


p->SendMessage就是给p所在的线程发消息。

#19


我现在想得到的效果是启动我的查询线程以后程序处于忙的状态,同时设置定时器... 
然后在数据库中查到相关数据,则干掉定时器.提示用户查询的结果.并挂起查询线程 
如果在规定时间内没有查到数据,则提示用户操作失败,同样也挂起线程...... 
///////////////////////////////
在线程中p->SendMessage(WM_TIMER,109)这样来发送消息跟定时器时间到触发消息有什么区别啊.根本就达不到我说的那样的功能
而且KillTimer()以后消息队列里面还是有WM_TIMER这个消息
查MSDN说:Pending WM_TIMER messages associated with the timer are not removed from the message queue.
////////////////////////////////
而且AfxGetMainWnd()->BeginWaitCursor(); 
SetCapture(); 
这样的代码使得程序根本就是一种假装忙碌的状态,因为当切换任务栏从新回到这个程序上面之后,虽然定时的时间没有到.可是鼠标自动回到箭头状态...
谢谢老师

#20


处理WM_SETCURSOR消息, 改变光标...

#21


自己发WM_TIMER消息就是不需要等到定时器触发就可以执行OnTimer中的代码,我是按照你现有的思路来考虑的,可以达到你的目的。
按你描述的需求,应该在主线程中用WaitForSingleObject等待线程完成,并设置超时时间。

#22


王老师能给个详细点的思路吗?
线程函数里面查到信息以后发送消息p->SendMessage(WM_TIMER,109);
然后在OnTimer函数里面挂起线程,发送消息以后是不是马上就跳到消息响应函数里面执行还是要等当前的线程执行完毕.
那定时的时间到了还会不会触发消息函数?

那我的查询失败又从哪里体现出来呢


现在一头雾水..

#23


可以认为调用SendMessage时就转到了主线程的OnTimer函数,执行完返回线程继续执行,KillTimer和SuspendThread可以在线程中执行,也可以在OnTimer中执行,关键就是EndWaitCursor不能在线程中执行。只要不KillTimer,时间到了还会触发OnTimer函数。这是按照你最初的思路的做法。
你这种需求应该在主线程中用WaitForSingleObject等待线程完成,并设置超时时间,不需要设置光标,也不需要定时,这样处理更好一些。

#24


因为我是通过一个按钮来启动线程的,如果不设光标
那重复点击按钮,造成多次ResumeThread(),那样会行不通吧。。。
谢谢了,我试着按你的意思去做。看能不能实现
再次谢谢

#1


调整你的线程优先级到最高试下.

#2


你确定你的线程运行了吗?

#3


我的线程绝对运行了

#4


我想在我的线程函数里面挂起自己.......
并且干掉主对话框的定时器

#5


谢谢一楼二楼的

#6


跨线程界限调用MFC成员函数:
--即使是一些好像是没问题的函数,如AfxGetMainWnd,当在应用程序的主线程以外的任何地方调用它们时,它们都不会正常工作。   --摘自《MFC Windows程序设计》
MFC不是线程安全 GDI对象以及其他对象应该使用句柄而不是指针在线程之间传递

供参考^_^

#7


SetThreadPriority(hrdHandle,THREAD_PRIORITY_HIGHEST);设置了线程优先级为最高还是一回时,不能干掉定时器.照样时间一到就执行定时器函数中的代码

#8


引用 7 楼 wudeshou82666 的回复:
SetThreadPriority(hrdHandle,THREAD_PRIORITY_HIGHEST);设置了线程优先级为最高还是一回时,不能干掉定时器.照样时间一到就执行定时器函数中的代码

当需要终止定时器, 即执行KillTimer时, 先设置标志变量, 然后, 在Timer响应函数中判断这个标志变量,跳出不执行即可.

#9


引用 8 楼 yjgx007 的回复:
引用 7 楼 wudeshou82666 的回复:
SetThreadPriority(hrdHandle,THREAD_PRIORITY_HIGHEST);设置了线程优先级为最高还是一回时,不能干掉定时器.照样时间一到就执行定时器函数中的代码 
 
当需要终止定时器, 即执行KillTimer时, 先设置标志变量, 然后, 在Timer响应函数中判断这个标志变量,跳出不执行即可.

我试试吧.谢谢
顺便再问一下:
AfxGetMainWnd()->BeginWaitCursor(); 
SetCapture(); 
这两句代码是可以使程序处于忙的状态,可是当切换任务栏从新回到这个程序上面之后,虽然定时的时间没有到.可是鼠标自动回到箭头状态...为什么会这样呢....如果我想自如地来控制鼠标的状态要怎么做.

#10


为什么不能在现成函数里面挂起我的线程,提前干掉主对话框的定时器。。。。 
如果可以这样,要怎么做。。。。 
--------------------------------------------------------

既然你是要在设置定时器后,立即让另一个线程停止该定时器。那为什么非要设置这个定时器呢?

不设置定时器就不存在干掉定时器的问题,然后该挂起线程就挂起线程就好了

#11


EndWaitCursor只能在本线程中调用,你可以改成在线程中p->SendMessage(WM_TIMER, 109);

#12


引用 10 楼 coding_hello 的回复:
为什么不能在现成函数里面挂起我的线程,提前干掉主对话框的定时器。。。。 
如果可以这样,要怎么做。。。。 
-------------------------------------------------------- 

既然你是要在设置定时器后,立即让另一个线程停止该定时器。那为什么非要设置这个定时器呢? 

不设置定时器就不存在干掉定时器的问题,然后该挂起线程就挂起线程就好了

我的线程函数是查询数据库的.如果查到了就显示查到的适时的数据.如果在规定的时间里面没有查到则需要提示用户查询失败

#13


自定义一个消息
在on消息中
KillTimer(109); 
ReleaseCapture(); 
EndWaitCursor(); 
SuspendThread(hrdHandle); 

在线程中Sendmessage(hwnd,消息.......)

#14


引用 11 楼 cnzdgs 的回复:
EndWaitCursor只能在本线程中调用,你可以改成在线程中p->SendMessage(WM_TIMER, 109);

问老师:
这样只是发送一个消息到主线程吧...
并没有kill掉定时器.那样时间到了,同样会执行定时器响应函数里面的代码.
.............................................................
我现在想得到的效果是启动我的查询线程以后程序处于忙的状态,同时设置定时器...
然后在数据库中查到相关数据,则干掉定时器.提示用户查询的结果.并挂起查询线程
如果在规定时间内没有查到数据,则提示用户操作失败,同样也挂起线程......
..............................................................

#15


引用 13 楼 dirdirdir3 的回复:
自定义一个消息 
在on消息中 
KillTimer(109); 
ReleaseCapture(); 
EndWaitCursor(); 
SuspendThread(hrdHandle); 

在线程中Sendmessage(hwnd,消息.......) 


这个是一个方法
谢谢
可是我想知道为什么不能在我的线程函数里面干掉我的定时器.要怎么样提前干掉......
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
AfxGetMainWnd()->BeginWaitCursor(); 
SetCapture(); 
这两句代码是可以使程序处于忙的状态,可是当切换任务栏从新回到这个程序上面之后,虽然定时的时间没有到.可是鼠标自动回到箭头状态...为什么会这样呢....如果我想自如地来控制鼠标的状态要怎么做. 

#16


顶上,搞定后马上结帖啊
王老师下线了????

#17


如果不需要再定时,当然要KillTimer了,可以在线程中执行,也可以在OnTimer中执行。

#18


p->SendMessage就是给p所在的线程发消息。

#19


我现在想得到的效果是启动我的查询线程以后程序处于忙的状态,同时设置定时器... 
然后在数据库中查到相关数据,则干掉定时器.提示用户查询的结果.并挂起查询线程 
如果在规定时间内没有查到数据,则提示用户操作失败,同样也挂起线程...... 
///////////////////////////////
在线程中p->SendMessage(WM_TIMER,109)这样来发送消息跟定时器时间到触发消息有什么区别啊.根本就达不到我说的那样的功能
而且KillTimer()以后消息队列里面还是有WM_TIMER这个消息
查MSDN说:Pending WM_TIMER messages associated with the timer are not removed from the message queue.
////////////////////////////////
而且AfxGetMainWnd()->BeginWaitCursor(); 
SetCapture(); 
这样的代码使得程序根本就是一种假装忙碌的状态,因为当切换任务栏从新回到这个程序上面之后,虽然定时的时间没有到.可是鼠标自动回到箭头状态...
谢谢老师

#20


处理WM_SETCURSOR消息, 改变光标...

#21


自己发WM_TIMER消息就是不需要等到定时器触发就可以执行OnTimer中的代码,我是按照你现有的思路来考虑的,可以达到你的目的。
按你描述的需求,应该在主线程中用WaitForSingleObject等待线程完成,并设置超时时间。

#22


王老师能给个详细点的思路吗?
线程函数里面查到信息以后发送消息p->SendMessage(WM_TIMER,109);
然后在OnTimer函数里面挂起线程,发送消息以后是不是马上就跳到消息响应函数里面执行还是要等当前的线程执行完毕.
那定时的时间到了还会不会触发消息函数?

那我的查询失败又从哪里体现出来呢


现在一头雾水..

#23


可以认为调用SendMessage时就转到了主线程的OnTimer函数,执行完返回线程继续执行,KillTimer和SuspendThread可以在线程中执行,也可以在OnTimer中执行,关键就是EndWaitCursor不能在线程中执行。只要不KillTimer,时间到了还会触发OnTimer函数。这是按照你最初的思路的做法。
你这种需求应该在主线程中用WaitForSingleObject等待线程完成,并设置超时时间,不需要设置光标,也不需要定时,这样处理更好一些。

#24


因为我是通过一个按钮来启动线程的,如果不设光标
那重复点击按钮,造成多次ResumeThread(),那样会行不通吧。。。
谢谢了,我试着按你的意思去做。看能不能实现
再次谢谢