vc程序 cpu占用率太大怎么办

zp824382268qqcom 2011-06-12 09:15:26
#include <Windows.h>
#include <Windows.h>
#include <process.h>

#include <iostream>
#include <sapi.h>
#include "resource.h"


#include "CH341DLL.H"
#pragma comment(lib,"ole32.lib") //CoInitialize CoCreateInstance需要调用ole32.dll
#pragma comment(lib,"sapi.lib") //sapi.lib在SDK的lib目录,必需正确配置


#pragma comment(lib, "WINMM.LIB")
#pragma comment(lib, "CH341DLL.lib")
using namespace std;


DWORD WINAPI myThreadfuc(LPVOID lpParameter);//线程函数声明
VOID CALLBACK mPCH341_NOTIFY_ROUTINE1(ULONG iEventStatus );//对设备通知事件的回调程序声明,注意须加callback
BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam) ;

VOID WINAPI CALLBACK mPCH341_NOTIFY_ROUTINE1(ULONG iEventStatus );//341拔插检测处理函数 声明
void WINAPI CALLBACK myInterruptEvent1 ( unsigned long PinStatus );//对中断回调的声明


DWORD ThreadID1=0;//定义子线程id
DWORD ThreadID2=0;//定义主线程id
HWND hDlg_main =NULL;


BOOL flag1=TRUE ;//定义全局变量标志位一



int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

CH341SetDeviceNotify(0,NULL, mPCH341_NOTIFY_ROUTINE1) ;//打开usb拔插监视


//ThreadID2=GetCurrentThreadId();//获取主线程线程id

HANDLE hThread = CreateThread(NULL,0,myThreadfuc,NULL ,NULL,&ThreadID1);
//启动一个线程供ch341采集数据使用

return DialogBox (hInstance, (LPCTSTR)IDD_DIALOG1, NULL, (DLGPROC)AboutDlgProc) ;//建立界面

}

BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)//对话框窗口处理函数

{
ISpVoice * pVoice = NULL;//进行语音配置

//COM初始化:
if (FAILED(::CoInitialize(NULL)))
return FALSE;

//获取ISpVoice接口:
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);

wchar_t *pwc=L"设备已打开!";//定义一个宽字符指针
wchar_t *pwc4=L"设备已拔出!";//定义一个宽字符指针
wchar_t *pwc5=L"设备已插入,请先打开设备!";//定义一个宽字符指针
wchar_t *pwc6=L"暂无消息!";//定义一个宽字符指针
wchar_t *pwc7=L"打开设备失败,检查是否插入设备!";//定义一个宽字符指针
wchar_t *pwc8=L"设备已关闭!";//定义一个宽字符指针
hDlg_main = hDlg ;
ULONG iDevIndexAndEvent;




switch (message)

{


case WM_INITDIALOG ://初始化对话框

return TRUE ;


//case WM_VSCROLL ://从中断处接受命令和数据




case WM_HSCROLL://对设备拔插状态的处理
iDevIndexAndEvent=wParam;
switch(iDevIndexAndEvent)
{
case CH341_DEVICE_ARRIVAL :

//pVoice->Speak(L"设备已插入!", 0, NULL);
//::CoUninitialize();
//PlaySound(TEXT ("18.wav"), NULL, SND_FILENAME | SND_ASYNC );
SetDlgItemText(hDlg,IDC_STATICzhutai,pwc5);

break ;

case CH341_DEVICE_REMOVE:

//pVoice->Speak(L"设备已拔出!", 0, NULL);
//::CoUninitialize();
//PlaySound(TEXT ("17.wav"), NULL, SND_FILENAME | SND_ASYNC );
SetDlgItemText(hDlg,IDC_STATICzhutai,pwc4);
SetDlgItemText(hDlg,IDC_STATICmessge,pwc6);

break ;
}

return TRUE ;


case WM_KEYUP:


return TRUE ;



case WM_COMMAND ://用于处理从对话框控件发来的消息

switch (LOWORD (wParam))

{

case IDOK :
flag1=false ;
SetDlgItemText(hDlg,IDC_STATICmessge,pwc6);
return TRUE ;


case IDCANCEL :

EndDialog (hDlg, 0) ;

return TRUE ;

case IDC_BUTTONopen :
CH341OpenDevice(0) ;//打开设备
if( CH341SetOutput(0,15,0,1024)!=true)//设置端口为输入
{
SetDlgItemText(hDlg,IDC_STATICzhutai,pwc7);
break;
}
CH341SetIntRoutine( 0,myInterruptEvent1 ); // 设置中断服务程序
SetDlgItemText(hDlg,IDC_STATICzhutai,pwc);
SetDlgItemText(hDlg,IDC_STATICmessge,pwc6);
return TRUE ;

case IDC_BUTTON2 :
CH341CloseDevice(0);
SetDlgItemText(hDlg,IDC_STATICzhutai,pwc8);
SetDlgItemText(hDlg,IDC_STATICmessge,pwc6);
return TRUE ;
}

break ;
}

return FALSE ;

}


DWORD WINAPI myThreadfuc(LPVOID lpParameter)//定义线程函数
{

MSG msg;//

ULONG interruptnum,newinterruptnum;


wchar_t *pwc1=L"一号桌要点菜!";//定义一个宽字符指针
wchar_t *pwc2=L"二号桌要点菜!";//定义一个宽字符指针
wchar_t *pwc3=L"三号桌要点菜!";//定义一个宽字符指针
wchar_t *pwc4=L"四号桌要点菜!";//定义一个宽字符指针
wchar_t *pwc5=L"五号桌要点菜!";//定义一个宽字符指针
wchar_t *pwc6=L"六号桌要点菜!";//定义一个宽字符指针
wchar_t *pwc7=L"七号桌要点菜!";//定义一个宽字符指针
wchar_t *pwc8=L"八号桌要点菜!";//定义一个宽字符指针
wchar_t *pwc9=L"九号桌要点菜!";//定义一个宽字符指针
wchar_t *pwc10=L"十号桌要点菜!";//定义一个宽字符指针
wchar_t *pwc11=L"十一号桌要点菜!";//定义一个宽字符指针
wchar_t *pwc12=L"十二号桌要点菜!";//定义一个宽字符指针
wchar_t *pwc13=L"十三号桌要点菜!";//定义一个宽字符指针
wchar_t *pwc14=L"十四号桌要点菜!";//定义一个宽字符指针
wchar_t *pwc15=L"十五号桌要点菜!";//定义一个宽字符指针
wchar_t *pwc16=L"十六号桌要点菜!";//定义一个宽字符指针


while(GetMessage(&msg,NULL,0,0))

{

switch (msg.message)
{
case WM_KEYDOWN:
flag1=TRUE;
interruptnum=msg.wParam;
newinterruptnum=(interruptnum&15);
switch( newinterruptnum )
{
case 1 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc1);
//while (flag1)
{
PlaySound(TEXT ("1.wav"), NULL, SND_FILENAME | SND_NOSTOP);
}
flag1=TRUE;
break;
case 2 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc2);
//while(flag1)
{
PlaySound(TEXT ("2.wav"), NULL, SND_FILENAME | SND_LOOP);
}
flag1=TRUE;
break;
case 3 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc3);
while(flag1)
{
PlaySound(TEXT ("3.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
case 4 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc4);
while(flag1)
{
PlaySound(TEXT ("4.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
case 5 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc5);
while (flag1)
{
PlaySound(TEXT ("5.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
case 6 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc6);
while(flag1)
{
PlaySound(TEXT ("6.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
case 7 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc7);
while(flag1)
{
PlaySound(TEXT ("7.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
case 8 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc8);
while(flag1)
{
PlaySound(TEXT ("8.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
case 9 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc9);
while (flag1)
{
PlaySound(TEXT ("9.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
case 10 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc10);
while(flag1)
{
PlaySound(TEXT ("10.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
case 11 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc11);
while(flag1)
{
PlaySound(TEXT ("11.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
case 12 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc12);
while(flag1)
{
PlaySound(TEXT ("12.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
case 13 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc13);
while (flag1)
{
PlaySound(TEXT ("13.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
case 14 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc14);
while(flag1)
{
PlaySound(TEXT ("14.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
case 15 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc15);
while(flag1)
{
PlaySound(TEXT ("15.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
case 16 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc16);
while(flag1)
{
PlaySound(TEXT ("16.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
}

}

}
return 0;

}


VOID WINAPI CALLBACK mPCH341_NOTIFY_ROUTINE1(ULONG iEventStatus )//定义拔插检测的回调函数
{
HWND ch341hwnd ;
ch341hwnd =hDlg_main ;
PostMessage(ch341hwnd,WM_HSCROLL,iEventStatus,0); //在中断向窗口处理函数发送回调消息

}


void WINAPI CALLBACK myInterruptEvent1 ( unsigned long PinStatus ) //中断回调处理程序
{
PostThreadMessage(ThreadID1 ,WM_KEYDOWN,PinStatus ,0);//向子线程消息循环队列发送回调消息
}


/*void error(LPSTR lpszFunction)

{
CHAR szBuf[80];
DWORD dw = GetLastError();

sprintf(szBuf, "%s failed: GetLastError returned %u\n",
lpszFunction, dw);

MessageBox(NULL,szBuf, TEXT("Error"), MB_OK);
ExitProcess(dw);
} */









...全文
529 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
96掌门师兄 2011-06-13
  • 打赏
  • 举报
回复
这个地方:
case 3 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc3);
while(flag1)
{
PlaySound(TEXT ("3.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
case 4 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc4);
while(flag1)
{
PlaySound(TEXT ("4.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1=TRUE;
break;
case 5 :
SetDlgItemText(hDlg_main,IDC_STATICmessge,pwc5);
while (flag1)
{
PlaySound(TEXT ("5.wav"), NULL, SND_FILENAME | SND_SYNC);
}
flag1

在启动的时候是不是会有多种case情况,也就是说:在case4和5 会先后满足,这样就会有多个 while{}被执行,这样很容易导致CPU 占用率高的。。

仅供参考。
smwhotjay 2011-06-13
  • 打赏
  • 举报
回复
不要死循环吧.sleep休息下.
  • 打赏
  • 举报
回复
目前都是双核的吧 反正我是

超过50% 找FOR跟 WHILE 就成了
不超过50% 调试运行时间 不会调试 BAIDU一下
q1q2q3q4ln 2011-06-13
  • 打赏
  • 举报
回复
交你一个办法,VC2008Team版中有个性能测试工具,可以测试,每个函数占有CPU的时间,精确
到MS,这样你测试以下,然后看结果表,然后你就知道什么地方慢了(前提你要分几个函数来测试)
chenjiawei007 2011-06-13
  • 打赏
  • 举报
回复
降低优先级有可能再也抢不到资源了,没有统局的设计就没有随意的修改优先级。

而且cpu猛增,很有可能是低优先级的线程一直占用cpu,简单降低优先级还是不可取的。
zp824382268qqcom 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chenjiawei007 的回复:]
sleep(1)
[/Quote]在哪加入sleep(1)合适呢 大侠教我一下
zp824382268qqcom 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zz_lgy 的回复:]
while(flag1)
{
PlaySound(TEXT ("6.wav"), NULL, SND_FILENAME | SND_SYNC);
}

这里需要用while吗,if不够用?
[/Quote]我就是要不断循环去执行PlaySound() if只能执行一次吧 达不到目的
chenjiawei007 2011-06-12
  • 打赏
  • 举报
回复
sleep(1)
  • 打赏
  • 举报
回复
你可以用定时器
_free 2011-06-12
  • 打赏
  • 举报
回复
while(flag1)
{
PlaySound(TEXT ("6.wav"), NULL, SND_FILENAME | SND_SYNC);
}

这里需要用while吗,if不够用?
zp824382268qqcom 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zp824382268qqcom 的回复:]
我去掉 while循环还是不行 一打开这个小东西 光它自己 就吃掉40%的cpu 然后物理内存也冲到90%
最后卡死


我就纳闷了 是不是跟我播放的wav文件有关
[/Quote]我就想不通了 子线程里我也用 事件挂其他了 循环也撤了 它哪来的那么大胃口 吃得那么多
zp824382268qqcom 2011-06-12
  • 打赏
  • 举报
回复
我去掉 while循环还是不行 一打开这个小东西 光它自己 就吃掉40%的cpu 然后物理内存也冲到90%
最后卡死


我就纳闷了 是不是跟我播放的wav文件有关
zp824382268qqcom 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tompaz 的回复:]
引用 3 楼 zp824382268qqcom 的回复:

引用 1 楼 zz_lgy 的回复:
while(flag1)
{
PlaySound(TEXT ("6.wav"), NULL, SND_FILENAME | SND_SYNC);
}

这里需要用while吗,if不够用?
我就是要不断循环去执行PlaySound() if只能执行一次吧 达不到目的

plays……
[/Quote]你说的重复播放是不是 这个 SND_LOOP
tompaz 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zp824382268qqcom 的回复:]

引用 1 楼 zz_lgy 的回复:
while(flag1)
{
PlaySound(TEXT ("6.wav"), NULL, SND_FILENAME | SND_SYNC);
}

这里需要用while吗,if不够用?
我就是要不断循环去执行PlaySound() if只能执行一次吧 达不到目的
[/Quote]
playsound可以重复播放的,就算不能重复播放你这样用法也是不对的
zp824382268qqcom 2011-06-12
  • 打赏
  • 举报
回复
怎样释放啊
zp824382268qqcom 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lactoferrin 的回复:]
把你的线程的优先级调低
[/Quote]我发现在我这个 程序里有内存泄漏 执行一会物理内存就满了死机 大家看我那个函数泄漏的内存 playsound吗
Lactoferrin 2011-06-12
  • 打赏
  • 举报
回复
把你的线程的优先级调低
zp824382268qqcom 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chenjiawei007 的回复:]
引用 4 楼 zp824382268qqcom 的回复:
引用 2 楼 chenjiawei007 的回复:
sleep(1)
在哪加入sleep(1)合适呢 大侠教我一下


for循环while循环中,不要一直执行,而不挂起线程,这样会导致cpu增长,
所以在这些循环中,进行一些判断,进行sleep,操作可以让其他线程抢到资源。

当然频繁的sleep也会增加开销,所以可以自……
[/Quote]另外我的程序 cpu占用率高 是因为while 循环呢 还是因为 反复执行了while循环里的playsound 造成的 我用了事件对象好像也不行
zp824382268qqcom 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chenjiawei007 的回复:]
引用 4 楼 zp824382268qqcom 的回复:
引用 2 楼 chenjiawei007 的回复:
sleep(1)
在哪加入sleep(1)合适呢 大侠教我一下


for循环while循环中,不要一直执行,而不挂起线程,这样会导致cpu增长,
所以在这些循环中,进行一些判断,进行sleep,操作可以让其他线程抢到资源。

当然频繁的sleep也会增加开销,所以可以自……
[/Quote]奥 那请问 要是由于需要在程序中必须反复执行某个东西 比如playsound函数 那该怎样
chenjiawei007 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zp824382268qqcom 的回复:]
引用 2 楼 chenjiawei007 的回复:
sleep(1)
在哪加入sleep(1)合适呢 大侠教我一下
[/Quote]

for循环while循环中,不要一直执行,而不挂起线程,这样会导致cpu增长,
所以在这些循环中,进行一些判断,进行sleep,操作可以让其他线程抢到资源。

当然频繁的sleep也会增加开销,所以可以自己计数,过一阵sleep一下。

15,471

社区成员

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

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