CPU占用高达99%, 有代码, 帮忙分析并改进一些, 谢谢了

fengforever 2005-10-18 08:06:34
private void Watch()
{
while(true)
{
int i = this.SearchWindow();

if(i == 4)
break;
}

//thread.Abort();
Application.Exit();
this.Dispose();
this.Close();
}

private int SearchWindow()
{
int retval = 0;

string lpszParentClass = "#32770";
string lpszParentWindow = "本地连接";
string lpszClass = "Edit";
string lpszClass_Submit = "Button";
string lpszName_Submit = "确定";
string text = "";

if(OSLanguage == "CHS")
{
lpszParentWindow = "本地连接";
lpszName_Submit = "确定";
}
else if(OSLanguage == "CHT")
{
lpszParentWindow = "本地鏈接";
lpszName_Submit = "確定";
}
else
{
lpszParentWindow = "Local Connection";
lpszName_Submit = "Submit";
}

IntPtr ParenthWnd = new IntPtr(0);
IntPtr EdithWnd = new IntPtr(0);

ParenthWnd = FindWindow(lpszParentClass,lpszParentWindow);

if (!ParenthWnd.Equals(IntPtr.Zero))
{
//User Name
EdithWnd = FindWindowEx(ParenthWnd,EdithWnd,lpszClass,"");
if (!EdithWnd.Equals(IntPtr.Zero))
{
text = this.tbUserName.Text.Trim();
SendMessage(EdithWnd, WM_SETTEXT, (IntPtr)0, text);
retval ++;
}

//Password
EdithWnd = FindWindowEx(ParenthWnd,EdithWnd,lpszClass,"");
if (!EdithWnd.Equals(IntPtr.Zero))
{
text = this.tbPassword.Text.Trim();
SendMessage(EdithWnd, WM_SETTEXT, (IntPtr)0, text);
retval ++;
}

//Domain
EdithWnd = FindWindowEx(ParenthWnd,EdithWnd,lpszClass,"");
if (!EdithWnd.Equals(IntPtr.Zero))
{
text = this.tbDomain.Text.Trim();
SendMessage(EdithWnd, WM_SETTEXT, (IntPtr)0, text);
retval ++;
}

//Button Click
EdithWnd = FindWindowEx(ParenthWnd,EdithWnd,lpszClass_Submit,lpszName_Submit);
if (!EdithWnd.Equals(IntPtr.Zero))
{
SendMessage(EdithWnd,WM_CLICK,(IntPtr)0,"0");
retval ++;
}
}

return retval;
}
...全文
265 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
henryfan1 2005-10-18
  • 打赏
  • 举报
回复
if(i == 4)
不符合这个条件的情况下,那个是死循环。
监听过程不应该由主线程来执行,开一个子线程来进监听,循环最好线程堵塞直到收到消息为止;
收到消息后可以通过委托方式返回给主线程工作。
JadyWang 2005-10-18
  • 打赏
  • 举报
回复
用事件机制。轮循太占资源了。
Bmonkey 2005-10-18
  • 打赏
  • 举报
回复
你只需要把你的事件处理程序和事件挂钩,这就是委托的作用了.然后事件触发,你的处理程序执行,事件不触发时,就不会有任何操作,至于操作系统的任何操作我们不关心,也就是把这些调度交给操作系统来管理了,所以cpu占有率就自然降下来了.
Bmonkey 2005-10-18
  • 打赏
  • 举报
回复
上面的朋友说的很清楚了,委托,事件..
windows本来就是事件驱动的操作系统,任何动作,鼠标移动,键盘敲动...都有事件,所以你的问题肯定会有适当的事件触发的.
qpl007 2005-10-18
  • 打赏
  • 举报
回复
换言之,就是执行要分析执行SearchWindow()的时机
qpl007 2005-10-18
  • 打赏
  • 举报
回复
不好意思,没有严肃对待楼主的问题,有点懒了。

仔细看了一下,这样的问题最好的方法就是事件驱动,但这样需要比较复杂的代码,楼主需要分析执行事件的时机,然后在代码中定义委托和委托方法,并在适当的时候执行该方法。

定义委托和执行不是问题,关键一点是楼主得分析出执行委托的恰当时机。
holym 2005-10-18
  • 打赏
  • 举报
回复
mark
dragonfly001 2005-10-18
  • 打赏
  • 举报
回复
自定義事件和委託. 然後委託掛事件.OK
fengforever 2005-10-18
  • 打赏
  • 举报
回复
Bmonkey(Oracle.DesignPattern.UML|请叫我四个角) ( ) 信誉:100

多谢, 请问一下有关数据驱动的知识, 我不是很了解, 谢谢.
Bmonkey 2005-10-18
  • 打赏
  • 举报
回复
问题的更本就是这个死循环,没有消息过来,事件不会抛出;有消息过来,事件相应,cpu资源让操作系统来控制,这样就ok了.
Bmonkey 2005-10-18
  • 打赏
  • 举报
回复
private void Watch()
{
while(true)
{
int i = this.SearchWindow();

if(i == 4)
break;
}

//thread.Abort();
Application.Exit();
this.Dispose();
this.Close();
}

这种一直用死循环轮寻的方式肯定消耗cpu啦,这虽然是一种简单的解决方案,但也是最笨的一种方式.应该想办法该为用事件驱动的方式来监控,要不cpu占用率肯定下不来,因为你都没有让cpu休息.

偶前段时间开发串口的一个中间件,开始由于某种原因就是用while(true)定期查看串口是否有数据,结果不但难于调试,而且cpu占用率高;后来直接重新做过,改成线程+事件监控的方式来判断串口是否有数据上来.


就算改为楼上这位所提方案:
while(true)
{
int i = this.SearchWindow();
if(i == 4)
break;
System.Threading.Thread.Sleep(1000);
}
隔一秒查看一次,占用率问题仍然存在,如果把sleep时间改长了,你又不能即使观察到数据的变化.所以最好的就是事件驱动.


yeerh 2005-10-18
  • 打赏
  • 举报
回复
创建新的线程来执行 Watch()方法......
Thread listenthread=new Thread(new ThreadStart(Watch));
fengforever 2005-10-18
  • 打赏
  • 举报
回复
qpl007(蓝色闪电)

谢谢, 我明白你的意思, 但是我如果需要对系统进行实时的监控呢?
System.Threading.Thread.Sleep(1000)的意思是不是设置程序间隔1秒去跑?
fanweiwei 2005-10-18
  • 打赏
  • 举报
回复
study
qpl007 2005-10-18
  • 打赏
  • 举报
回复
while(true)
{
int i = this.SearchWindow();
if(i == 4)
break;
}

这样写的话CPU被你占用玩了,高达99%,也就不奇怪了。

try:

while(true)
{
int i = this.SearchWindow();
if(i == 4)
break;
System.Threading.Thread.Sleep(1000);
}
singlepine 2005-10-18
  • 打赏
  • 举报
回复
楼主这种写多语言的方法,
if(OSLanguage == "CHS")
{
lpszParentWindow = "本地连接";
lpszName_Submit = "确定";
}
else if(OSLanguage == "CHT")
{
lpszParentWindow = "本地鏈接";
lpszName_Submit = "確定";
}
else
{
lpszParentWindow = "Local Connection";
lpszName_Submit = "Submit";
}
可以改一下,改成读取资源文件
http://community.csdn.net/Expert/topic/4144/4144159.xml?temp=.9896051

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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