안녕하세요,이 스레드를 실행할 때 높은 CPU 사용량 (15-16 %)이 발생했습니다. "ssStop"이 true (작동)로 설정되어 있지 않으면 루핑을 유지해야하는 스레드입니다. 그러나, 실행중인 동안 작업 관리자를 열고 프로그램이 컴퓨터 처리 능력의 15 %를 사용하고 있음을 알았습니다. 일단 스레드가 종료되면 다시 1-2 %로 떨어집니다. 나는이 문제를 찾고 발견 EventWaitHandle를 사용하는 경우에도 온라인 여전히 사람이 내가 잘못 여기서 뭘하는지 알 수 있습니까? 당신은 연결을 위해 혼잡 폴링 CPU 사이클을 구울스레드 C에서 CPU 사용량이 높음
public void Receive()
{
try
{
bool firstTimeRun = true;
TcpListener ssTcpListener = new TcpListener(IPAddress.Any, 1500);
TcpClient tcpReceiver;
ssTcpListener.Start();
while (!ssStop)
{
//Start listening for connection.
//Accept any incoming connection requests on port 1500.
tcpReceiver = new TcpClient();
if (ssTcpListener.Pending())
{
tcpReceiver = ssTcpListener.AcceptTcpClient();
}
if (tcpReceiver.Connected)
{
//looped for first time; receives whole image.
if (firstTimeRun)
{
//TCP connected. Receive images from contact
NetworkStream receivedNs = new NetworkStream(tcpReceiver.Client);
Bitmap image = new Bitmap(receivedNs);
receivedImage = image;
pboScrnShare.Image = image;
receivedNs.Flush();
firstTimeRun = false;
}
//second time or higher looped; receives difference and overlays it.
else if (!firstTimeRun)
{
NetworkStream receivedNs = new NetworkStream(tcpReceiver.Client);
//Put image into picturebox.
receivedImage2 = new Bitmap(receivedNs);
receivedImage2.MakeTransparent(Color.Black);
Bitmap overlayedImage = new Bitmap(receivedImage.Width, receivedImage.Height);
using (Graphics gr = Graphics.FromImage(overlayedImage))
{
gr.DrawImage(receivedImage, new Point(0, 0));
gr.DrawImage(receivedImage2, new Point(0, 0));
}
try
{
pboScrnShare.Image = overlayedImage;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "pbo second run");
}
receivedImage2.Dispose();
if (this.InvokeRequired) { this.Invoke(new MethodInvoker(delegate() { receivedImage = overlayedImage; })); } else { receivedImage = overlayedImage; }
receivedNs.Flush();
}
tcpReceiver.Close();
}
myEventWaitHandle.WaitOne(10, true);
}
ssTcpListener.Stop();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Invited ReceiveSS()", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
, 당신은'수면 (1)를 삽입 할 수 있습니다'어딘가에 루프를 실행하여 다른 스레드를 실행할 수있게합니다. 그러나 코드에 다른 문제가 있습니다. 작동하는 코드이므로 codereview.stackexchange.com에 게시하여 추가 피드백을 얻을 수 있도록하십시오. WaitEventHandle을 사용하더라도 다른 스레드에서 수행 할 작업이 없으면 CPU 사용량에 영향을 미치지 않는다고 생각합니다. –
시계 틱을 측정 할 수있는 계기를 추가하십시오. 그러면 CPU 사용량을 줄이는 데 도움이됩니다. 시스템 또는 함수 호출의 시계를 측정하십시오. 그러나 틱을 측정하는 것은 약간의 오버 헤드를 유발할 것이므로 생산을 위해하지 마십시오. 측정은 항상 추측보다 낫다. –