关于WaitForSingleObject的一个设计问题

wutaihua 2009-09-11 05:04:24
如果我用WaitForSingleObject实现了下面的代码


while(WaitForSingleObject(hExitEvent, 30000) != wait_object_0)
{
...//将调用封装SDK的函数,但是这些函数大约耗费8秒左右
}


这个函数是在一个单独的线程中执行的。最后我退出的时候,有什么方法可以让我迅速退出呢(不用去执行8秒,或者困死 )? 我关闭线程的时候,函数有可能在等待,也有可能在执行那8秒的函数。

希望成熟专业的办法,目前我直接把Event变量signal,然后我直接TerminateThread的。不知道有什么好的办法。不胜赐教
...全文
124 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ok1234567 2009-09-14
  • 打赏
  • 举报
回复
在8秒钟的执行体代码中,增加退出检查
曾经的董胖 2009-09-13
  • 打赏
  • 举报
回复
WaitForSingleObject(hExitEvent, 30000)这里的问题相信楼主应该可以搞定,可以缩短等待的时间,考虑到人机交互时,人的反应还是比较慢的,小于1秒的时间通常都会被无视。

如果处于你那SDK的8秒等待中时,由于这里不受你控制,所以基本是没有什么好办法,除非你强行退出该线程,那样可能会导致不可预期的问题,一般不予使用。当响应到用户退出请求时,立刻先给你的工作线程发送退出可能的信号,以便能够在下一个8秒循环开始前处于随时退出的可能,此时增加一个与用户交互的画面,让用户确认退出。一般这种过程可以消耗掉用户的一定的等待时间,如果你的执行线程不是刚好处于最坏时间点,用户就基本感觉不出等待了。
oLINo 2009-09-13
  • 打赏
  • 举报
回复
只能在进入前多进行条件判断,如果已经进入函数处理了,那就没办法了
yinshisike 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wutaihua 的回复:]
引用 8 楼 fengrx 的回复:
引用 7 楼 wutaihua 的回复:
引用 6 楼 xylicon 的回复:
直接把Event变量signal,就退出循环了吧,还需要调用TerminateThread吗。

如果这时候刚好进入了执行阶段呢?不就是8秒吗?


这样处理:在执行八秒的代码里边判断是否执行了退出,根据程序结构加在合适的位置。
强制结束线程一般不用,内存释放是问题,有时还会异常。


引用的SDK,无法进行判定,我愁的就是这个。直接等返回值。如果执行的慢,8秒还是轻的
[/Quote]

设计有问题.既然那个SDK无法判定,那么在执行这个SDK前就需要判定是否要退出,如果要退出就跳过,
如果不退出就执行,在执行前就要禁止一切可退出操作,执行后恢复.这样就不存在那个8秒的问题了.
wutaihua 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fengrx 的回复:]
引用 7 楼 wutaihua 的回复:
引用 6 楼 xylicon 的回复:
直接把Event变量signal,就退出循环了吧,还需要调用TerminateThread吗。

如果这时候刚好进入了执行阶段呢?不就是8秒吗?


这样处理:在执行八秒的代码里边判断是否执行了退出,根据程序结构加在合适的位置。
强制结束线程一般不用,内存释放是问题,有时还会异常。
[/Quote]

引用的SDK,无法进行判定,我愁的就是这个。直接等返回值。如果执行的慢,8秒还是轻的
fengrx 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wutaihua 的回复:]
引用 6 楼 xylicon 的回复:
直接把Event变量signal,就退出循环了吧,还需要调用TerminateThread吗。

如果这时候刚好进入了执行阶段呢?不就是8秒吗?
[/Quote]

这样处理:在执行八秒的代码里边判断是否执行了退出,根据程序结构加在合适的位置。
强制结束线程一般不用,内存释放是问题,有时还会异常。
wutaihua 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xylicon 的回复:]
直接把Event变量signal,就退出循环了吧,还需要调用TerminateThread吗。
[/Quote]
如果这时候刚好进入了执行阶段呢?不就是8秒吗?
xylicon 2009-09-11
  • 打赏
  • 举报
回复
直接把Event变量signal,就退出循环了吧,还需要调用TerminateThread吗。
SlamAI 2009-09-11
  • 打赏
  • 举报
回复
顶LS的
可以强制结束,但很容易崩溃
candeabc123 2009-09-11
  • 打赏
  • 举报
回复
如果吃饭要吃饱的必要条件是吃8秒。
有人强制不让你吃8秒,请问你能吃饱饭吗?

想快速返回就开个等待线程吧
强制退出是推荐的做法,你的程序有很可能就挂掉了
chenyu2202863 2009-09-11
  • 打赏
  • 举报
回复
你觉得你不通过强制手段,它能退出来吗?

就像recv阻塞一样,你不设置超时,它能继续吗?
vagrantisme 2009-09-11
  • 打赏
  • 举报
回复
等待函数中加开关变量。

如果函数没法改变就没有办法了。
bragi523 2009-09-11
  • 打赏
  • 举报
回复
等待
实验一 生产者-消费者模型模拟进程调度 一、实验任务 1、在WINDOWS 2000环境下,创建一个控制台进程,此进程包括4个线程:2个生产者线程和2个消费者线程。 2、用信号量机制解决进程(线程)的同步与互斥问题。 二、实验目的 1.掌握基本的同步互斥算法,理解生产者和消费者模型。 2.了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。 3.学习使用Windows 2000/XP中基本的同步对象,掌握相应的API。 三、实验要求 1.生产者消费者对缓冲区进行互斥操作。 2.缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。 3.生产者消费者各循环操作50次。 四、设计思路和采取的方案 1.利用windows提供的API函数CreateSemaphore()创建信号量对象; CreateThread()创建线程; WaitForSingleObject()执行P操作; ReleaseSemaphore()执行V操作; WaitForMultipleObjects()主进程等待线程的结束等函数进行设计。 2.在Windows中,常见的同步对象有:信号量(Semaphore)、互斥量(Mutex) 。 使用这些对象都分为三个步骤,一是创建或者初始化; 接着请求该同步对象,随即进入临界区,这一步对应于互斥量的上锁;最后释放该同步对象,这对应于互斥量的解锁。这些同步对象在主进程中创建,在其子线程中都可。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧