定时器与多线程 SetTimer and Multi-Thread 每个线程独立使用一个定时器
来源:互联网 发布:mac的手绘软件 编辑:程序博客网 时间:2024/05/17 02:22
前几天,一个同学让我帮他做操作系统课程里的 生产者——消费者 模拟程序,需求如下:
希望各位大侠提供一个更好的解决方案。
将生产者和消费者模拟算法封装在一个动态链接库中,主程序调用相关函数。生产者放入产品和消费者取走产品的速度可调节。
分别用循环队列和栈实现。
一般模拟这个算法都是生产这,消费者各开一个线程,同步访问一个共享缓冲区。但是需求要求能调节速度,我的思路是在
每个线程里单独创建一个定时器,但是Windows下定时器特性是:
每隔定时时间,Windows系统放入一个 WM_TIMER 消息到应用程序的消息队列中。
所以我的解决方案如下:
- /* 更改定时器的消息 */
- #define WM_SETTIMER WM_USER + 100
- /* 生产者线程函数 */
- DWORD WINAPI ProducerFunc(LPVOID lpParameter)
- {
- MSG msg;
- UINT producerTimerId;
- /* Create a message queue for this thread */
- PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
- producerTimerId = SetTimer(NULL, 0, g_uProducerTimer, NULL);
- while(GetMessage(&msg, NULL, 0, 0))
- {
- if(msg.message == WM_TIMER)
- {
- WaitForSingleObject(g_hEmptySemaphore, INFINITE);
- WaitForSingleObject(g_hMutex, INFINITE);
- Producer();
- ReleaseMutex(g_hMutex);
- ReleaseSemaphore(g_hFullSemaphore, 1, NULL);
- }
- else if(msg.message == WM_SETTIMER)
- {
- KillTimer(NULL, producerTimerId);
- producerTimerId = SetTimer(NULL, 0, g_uProducerTimer, NULL);
- }
- else
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- KillTimer(NULL, producerTimerId);
- return 0;
- }
- /* 消费者线程函数 */
- DWORD WINAPI ConsumerFunc(LPVOID lpParameter)
- {
- MSG msg;
- UINT consumerTimerId;
- PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
- consumerTimerId = SetTimer(NULL, 0, g_uConsumerTimer, NULL);
- while(GetMessage(&msg, NULL, 0, 0))
- {
- if(msg.message == WM_TIMER)
- {
- WaitForSingleObject(g_hFullSemaphore, INFINITE);
- WaitForSingleObject(g_hMutex, INFINITE);
- Consumer();
- ReleaseMutex(g_hMutex);
- ReleaseSemaphore(g_hEmptySemaphore, 1, NULL);
- }
- else if(msg.message == WM_SETTIMER)
- {
- KillTimer(NULL, consumerTimerId);
- consumerTimerId = SetTimer(NULL, 0, g_uConsumerTimer, NULL);
- }
- else
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- KillTimer(NULL, consumerTimerId);
- return 0;
- }
完整的源代码在这里:
http://download.csdn.net/source/880262
- 定时器与多线程 SetTimer and Multi-Thread 每个线程独立使用一个定时器
- 定时器与多线程 SetTimer and Multi-Thread 每个线程独立使用一个定时器
- 在线程里面使用SetTimer定时器
- 在线程里面使用SetTimer定时器
- 定时器:SetTimer与timeSetEvent
- SetTimer() ---定时器的使用
- SetTimer 定时器的使用
- SetTimer 定时器
- 定时器:SetTimer
- 独立按键与定时器的使用练习
- 自己写一个简单的定时器settimer
- 小白学c++之Thread、定时器、定时器线程
- SetTimer定时器与WM_TIMER窗口消息详解
- SetTimer定时器与WM_TIMER窗口消息详解
- MFC中的定时器SetTimer的使用
- MFC定时器使用(CWnd::SetTimer)
- SetTimer定时器的用法
- SetTimer定时器的用法
- ETM 数据分析
- 1.5 Flex的事件机制
- 公布一些常用的WebServices,希望对大家的应用有帮助~
- 1.6 使用Adobe Flex Builder
- code point
- 定时器与多线程 SetTimer and Multi-Thread 每个线程独立使用一个定时器
- 中内容上对齐的属性 valign="top"
- Oracle Database Vault安装过程中遇到的几个问题及解决
- 关键字: oracle分页就用这一句
- 1.7 在Flex中操作XML
- “只要你真有能力,公司会给你很大的发展空间!”
- myeclipse中分配tomcat启动时所占内存大小
- centos 英文环境下安装中文输入法
- JSP页面去掉缓存的方法