求一个多线程的例程C++(API)
我是想在函数中等待键盘消息的传入,如果没有传入,就等待,如果传入后就继续程序最开始我想用sleep()但用后发现,我其他正运行函数也都sleep了后来我写了一个等待函数大...
我是想在函数中等待键盘消息的传入,
如果没有传入,就等待,如果传入后就继续程序
最开始我想用sleep()
但用后发现,我其他正运行函数也都sleep了
后来我写了一个等待函数
大概就是
while( 1 )
{
if ( keydown )
break;
}
但内存耗损达到50%以上
现在想用多线程中的
WaitForMultipleObjects()
根据MSDN上面的信息,还有网上的信息
我试着编了几个
但不是无法运行,就是中途异常中断,或是没有效果
求高手给个多线程的简单例程
或者给个可以解决我这种不占耗内存的等待方法 展开
如果没有传入,就等待,如果传入后就继续程序
最开始我想用sleep()
但用后发现,我其他正运行函数也都sleep了
后来我写了一个等待函数
大概就是
while( 1 )
{
if ( keydown )
break;
}
但内存耗损达到50%以上
现在想用多线程中的
WaitForMultipleObjects()
根据MSDN上面的信息,还有网上的信息
我试着编了几个
但不是无法运行,就是中途异常中断,或是没有效果
求高手给个多线程的简单例程
或者给个可以解决我这种不占耗内存的等待方法 展开
4个回答
展开全部
#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;
}
#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;
}
展开全部
msdn上讲的很清楚,例程也有.你把代码发上来,我帮你看看.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建一个辅助线程,优先级可以设低一些,把检查输入的循环放到线程里,再添加一个全局事件变量,线程中有输入就set一下,这样主程序中的waitfor...()函数就解锁了继续运行
可以直接把while和后面的所有代码都放到线程里,主线程就可以进行其它操作不会阻塞
最简单的可以在if keydown后面加上sleep(5);试试,应该就不太占资源了
可以直接把while和后面的所有代码都放到线程里,主线程就可以进行其它操作不会阻塞
最简单的可以在if keydown后面加上sleep(5);试试,应该就不太占资源了
参考资料: 如果您的回答是从其他地方引用,请表明出处
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用 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,将返回一些控制键是否被按过.
#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,将返回一些控制键是否被按过.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询