2009-06-29 4 views
2

그래서 나는 다른 프로그램을위한 일종의 '쉘'역할을하는 프로그램을 가지고있다. 핵심에서는 클래스, 메소드 이름 및 일부 args를 전달하고 다른 프로그래머가 기본적으로 프로세스를이 쉘 서비스에서 실행하도록 예약 할 수 있도록하는 기능의 실행을 처리합니다. 한 가지 문제를 제외하고는 모두 잘 작동합니다. 자주 실행되도록 예약 된 이러한 프로세스는 매우 CPU가 무겁습니다. 때로는 호출되는 프로세스가 CPU의 많은 부분을 사용하여 시작하고 일정을 확인하고 다른 작업을 실행하는 스레드가 상당 기간 실행될 기회를 갖지 않아 일정 문제와 충분한 응답 성의 부재. 불행히도, 나는 실제 소유 코드가 아니라 Thread.Sleep() 호출을 실제 실행 코드에 삽입 할 수 없다.잠자리에 다른 스레드 강제로

내 질문은 : 그 스레드에서 실행중인 실제 코드를 수정하지 않고 임의로 (시작한) 스레드를 강제로 수면 상태로 만들 수 있습니까? 거기에 런타임에 동적으로 실행하려고하는 코드에 Thread.Sleep() 호출을 '주입'하는 방법이 있습니까?

+0

대답은 아니지만 ... 관련 인터페이스를 제어하는 ​​경우 협업 멀티 태스킹을 수행 할 수있는 곳에서 프로그램을 요청할 수 있습니다 (기본적으로 다른 프로세스가 중단되면 절전). 그것은 당신이 코드를 소유하지 않는 정도에 달려 있습니다. –

답변

10

아니요. Priority 속성으로 다른 스레드의 우선 순위를 변경해 볼 수도 있지만 실제로 "절전"호출을 삽입 할 수는 없습니다.

여기에 Thread.Suspend()이 있지만 I 강력하게을 사용하지 않는 것이 좋습니다. 당신은 실제로 이 다른 자원을 보유 할 수도 있기 때문에 임의의 시간에 다른 스레드를 일시 중지 시키려면을 원합니다. (메서드가 쓸모없는 것으로 표시되어 주변에 모든 종류의 경고가 표시됩니다. :)

다른 작업의 우선 순위를 낮추고 잠재적으로 자신의 작업의 우선 순위를 높이는 것이 가장 좋은 방법 일 것입니다.

+0

나는 우선 순위를 망쳐 놓았지만, 내가 모을 수있는 한, 그 쓰레드가 다음 이용 가능한 타임 슬라이스를 '이기는'방법에 영향을 미치지 만, 더 이상/덜 수익률이 떨어지는 것은 아니다. 리소스 문제에 관해서는 가능하다고 생각하지만 각각의 프로세스는 서로 독립적 인 AppDomains에서 실행된다는 점에서 독립성이 있어야합니다. 그러므로 동일한 자원을 원하는 두 직업의 확률은 낮아야합니다 (그러나 0이 아님). – GWLlosa

+1

@GWLlosa : timeslices는 충분히 작기 때문에 다음에 사용 가능한 우승을하면 스케줄링 스레드가 응답을 유지하기에 충분해야합니다. 원하는 것은 실행중인 작업에 우선 순위를 두는 것입니다.이 작업은 수행 할 작업과 정확히 일치합니다. – jerryjvl

1

당신은 Thread.Suspend와 스레드 (권장되지 않으며되지 않음)를 일시 중단 할 수 있습니다으로 문제가 코드를 실행하는 스레드의 우선 순위 낮은 또는 Thread.Priority을 변경하여 우선 순위를 낮출 수 있습니다.

0

클래스에 가상 SleepIfNecessary() 메서드가있는 경우 리플렉션을 통해 자체 래퍼 클래스를 만들어 오버라이드 할 수 있다고 생각합니다.

그러나 다시 한 번 루프를 반복하면서 메소드를 호출해야합니다.

[편집]

내가 이런 일을 해본 적이있다,하지만 당신은 기존의 내부에 자신의 메서드 호출을 삽입 할 수없는 이유가 표시되지 않습니다. (이 링크는 예 : http://www.codeproject.com/KB/msil/reflexil.aspx)

0

사실, 당신이 말한 것은 보안상의 위험이 있으므로 대부분의 플랫폼에서 지원하지 않을 것입니다. 일반적으로 다른 프로그램이 귀하의 허락없이 귀하의 신분에 영향을 미치게하는 것은 좋은 정책이 아닙니다.

가능하면 문제의 prog을 코드에서 작성한 프로세스에로드 한 다음 해당 프로세스의 우선 순위를 설정하거나 잠자기 상태로 만들 수 있습니다. 나는 Windows 프로그래밍 전문가가 아니므로 귀하의 마일리지가 다를 수 있습니다.

0

이렇게해서는 안됩니다. 쓰레드는 스스로 좋은 생각이라고 생각하지 않는 한 슬립 (sleep)하지 말아야한다.

어쨌든 귀하의 문제와 관련이 없습니다. 문제는 분명 CPU 부족으로 인해 관리 스레드가 실행되지 않는다는 것입니다. 이를 수정하려면 스레드에 우선 순위를 부여하는 것으로 충분합니다. 각 타임 슬라이스의 끝에서 OS는 다음에 실행할 스레드를 결정합니다. 스레드 우선 순위는 다소 동적입니다. 잠시 동안 실행되지 않은 스레드는 방금 실행 한 threasd에 상대적으로 위로 이동합니다. 그러나 관리 스레드의 기본 스레드 우선 순위가 높을수록 스케줄링을 위해이 동적 부스트가 필요하지 않음을 의미합니다.

여전히 충분하지 않은 경우 작업자 스레드의 우선 순위를 낮추십시오. 이는 작업자 스레드가 새로운 타임 슬라이스를 얻기 전에 더 많은 시간 동안 휴면 상태가되어야 함을 의미합니다.

마지막으로 새 작업자 스레드를 시작하는 스레드가 매우 낮은 우선 순위로 실행되는지 확인하십시오. 시스템이 CPU 제한을 초과하는 경우 새 스레드가 생성되지 않습니다. 이것은 간단하면서도 강력한 스로틀 메커니즘을 구현합니다.

관련 문제