求一个多线程的例程C++(API)

我是想在函数中等待键盘消息的传入,如果没有传入,就等待,如果传入后就继续程序最开始我想用sleep()但用后发现,我其他正运行函数也都sleep了后来我写了一个等待函数大... 我是想在函数中等待键盘消息的传入,
如果没有传入,就等待,如果传入后就继续程序
最开始我想用sleep()
但用后发现,我其他正运行函数也都sleep了
后来我写了一个等待函数
大概就是
while( 1 )
{
if ( keydown )
break;
}
但内存耗损达到50%以上
现在想用多线程中的
WaitForMultipleObjects()
根据MSDN上面的信息,还有网上的信息
我试着编了几个
但不是无法运行,就是中途异常中断,或是没有效果
求高手给个多线程的简单例程

或者给个可以解决我这种不占耗内存的等待方法
展开
 我来答
北风微风
2009-10-10 · TA获得超过1094个赞
知道小有建树答主
回答量:411
采纳率:0%
帮助的人:0
展开全部
#include <stdio.h>
#include <windows.h>

typedef HANDLE HSEMAPHORE;

#define P(hHandle) ::WaitForSingleObject(hHandle, INFINITE)
#define V(hHandle) ::ReleaseSemaphore(hHandle, 1, NULL)
#define Semaphore(lInitial, lMaximum) ::CreateSemaphore(NULL, lInitial, lMaximum, NULL)
#define Thread(lpProc, lpParam) ::CreateThread(NULL, 0, lpProc, (LPVOID)lpParam, 0, NULL)
#define Wait(nCount, lpHandles) ::WaitForMultipleObjects(nCount, lpHandles, TRUE, INFINITE)

HSEMAPHORE n = Semaphore(0, 1);
HSEMAPHORE s = Semaphore(1, 1);
HSEMAPHORE e = Semaphore(100, 100);

UINT count = 0;

void Produce(){Sleep(1);}
void Consume(){Sleep(100);}

DWORD WINAPI Producer(LPVOID lpParameter)
{
while (true)
{
Produce();
P(e);
P(s);
count++;
printf("Producer: %d\n", count);
V(s);
V(n);
}
return 0;
}

DWORD WINAPI Consumer(LPVOID lpParameter)
{
while (true)
{
P(n);
P(s);
count--;
printf("Consumer: %d\n", count);
V(s);
V(e);
Consume();
}
return 0;
}

int main()
{
HANDLE hThreads[2];

hThreads[0] = Thread(Producer, (LPVOID)NULL);
hThreads[1] = Thread(Consumer, (LPVOID)NULL);

Wait(2, hThreads);
return 0;
}
找一种感觉
2009-10-10
知道答主
回答量:28
采纳率:0%
帮助的人:22.9万
展开全部
msdn上讲的很清楚,例程也有.你把代码发上来,我帮你看看.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友079a595a5
2009-10-10 · 超过19用户采纳过TA的回答
知道答主
回答量:69
采纳率:0%
帮助的人:46.3万
展开全部
建一个辅助线程,优先级可以设低一些,把检查输入的循环放到线程里,再添加一个全局事件变量,线程中有输入就set一下,这样主程序中的waitfor...()函数就解锁了继续运行
可以直接把while和后面的所有代码都放到线程里,主线程就可以进行其它操作不会阻塞
最简单的可以在if keydown后面加上sleep(5);试试,应该就不太占资源了

参考资料: 如果您的回答是从其他地方引用,请表明出处

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bean244
2009-10-10 · TA获得超过248个赞
知道小有建树答主
回答量:220
采纳率:0%
帮助的人:236万
展开全部
用 bioskey 吧。

#include<stdio.h>
#include<bios.h>
void main()
{
int key;
for(;;)
{
printf("Go on:\n");
sleep(1);
if(bioskey(1))
{
key=bioskey(0);
printf("%d\n",key);
if(key==7777) /*这里要加这个控制,来控制只有输入a才跳出循环*/
break;
}
}
printf("over!");
}

int bioskey(int cmd)的返回值解释:
cmd=0,返回ASCII码
cmd=1,返回非0值,表示有键按下,若为0表示没键按下
cmd=2,将返回一些控制键是否被按过.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式